如何计算Java对象占用了多少空间?

本文介绍了计算Java对象占用了多少空间的方法,分享给大家供大家参考,具体内容如下

一、对象头

对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下:

  • 1、对象的HashCode,锁信息等
  • 2、到对象类型数据的指针
  • 3、数组的长度(如果是数组的话)

二、规则

首先,任何对象都是8字节对齐,属性按照[long,double]、[int,float]、[char,short]、[byte,boolean]、reference的顺序存放,举个例子:

public class Test {
  byte a;
  int b;
  boolean c;
  long d;
  Object e;
}

如果这个对象的属性按照顺序存放的话,要占用的空间为:head(8) + a(1) + padding(3) + b(4) + c(1) + padding(7) + d(8) + e(4) + padding(4) = 40。但是按照这个规则得到:head(8) + d(8) + b(4) + a(1) + c(1) + padding(2) + e(4) + padding(4) = 32。可以看到节省了不少空间。

在涉及继承关系的时候有一个最基本的规则:首先存放父类中的成员,接着才是子类中的成员,举个例子:

class A {
  long a;
  int b;
  int c;
}
class B extends A {
  long d;
}

这样存放的顺序及占用空间如下:head(8) + a(8) + b(4) + c(4) + d(8) = 32。那如果父类中的属性不够八个字节怎么办?这样就有了新的一条规则:父类中最后一个成员与子类的第一个成员的间隔如果不够4个字节,此时需要扩展到4个字节的基本单位,举个例子:

class A {
  byte a;
}
class B extends A {
  byte b;
}

那么此时占用的空间如下:head(8) + a(1) + padding(3) + b(1) + padding(3) = 16。显然这种方式比较浪费空间,那么就有了:如果子类的第一个成员是double或者long,并且父类并没有用完8个字节,JVM会破坏规将较小的数据填充到该空间,举个例子:

class A {
  byte a;
}
class B extends A {
  long b;
  short c;
  byte d;
}

此时占用的空间如下:head(8) + a(1) + padding(3) + c(2) + d(1) + padding(1) + b(8) = 24。

以上就是计算Java对象占用了多少空间的方法,希望对大家学习java程序设计有所帮助。

(0)

相关推荐

  • JAVA对象JSON数据互相转换的四种常见情况

    1. 把java 对象列表转换为json对象数组,并转为字符串 复制代码 代码如下: JSONArray array = JSONArray.fromObject(userlist);     String jsonstr = array.toString(); 2.把java对象转换成json对象,并转化为字符串 复制代码 代码如下: JSONObject object = JSONObject.fromObject(invite);    String str=object.toString

  • 计算一个Java对象占用字节数的方法

    本文实例讲述了如何计算(或者说,估算)一个Java对象占用的内存数量的方法.分享给大家供大家参考.具体分析如下: 通常,我们谈论的堆内存使用的前提是以"一般情况"为背景的.不包括下面两种情形:   某些情况下,JVM根本就没有把Object放入堆中.例如:原则上讲,一个小的thread-local对象存在于栈中,而不是在堆中. 被Object占用内存的大小依赖于Object的当前状态.例如:Object的同步锁是否生效,或者,Object是否正在被回收. 我们先来看看在堆中单个的Obj

  • java中实体类和JSON对象之间相互转化

    在需要用到JSON对象封装数据的时候,往往会写很多代码,也有很多复制粘贴,为了用POJO的思想我们可以装JSON转化为实体对象进行操作 package myUtil; import java.io.IOException; import myProject.Student; import myProject.StudentList; import org.codehaus.jackson.map.ObjectMapper; import org.json.JSONArray; import or

  • java对象转换String类型的三种方法

    一.采用Object.toString()toString方法是java.lang.Object对象的一个public方法.在java中任何对象都会继承Object对象,所以一般来说任何对象都可以调用toString这个方法.这是采用该种方法时,常派生类会覆盖Object里的toString()方法.但是在使用该方法时要注意,必须保证Object不是null值,否则将抛出NullPointerException异常. 二.采用(String)Object 该方法是一个标准的类型转换的方法,可以将

  • Java基础教程之Hello World到面向对象

    Java是完全面向对象的语言.Java通过虚拟机的运行机制,实现"跨平台"的理念.我在这里想要呈现一个适合初学者的教程,希望对大家有用. "Hello World!" 先来看一个HelloWorld.java程序.这个程序在屏幕上打印出一串字符"Hello World!": 复制代码 代码如下: public class HelloWorld {     public static void main(String[] args)     {  

  • Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍

    1.浅复制与深复制概念 ⑴浅复制(浅克隆) 被复制对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用仍然指向原来的对象.换言之,浅复制仅仅复制所考虑的对象,而不复制它所引用的对象. ⑵深复制(深克隆) 被复制对象的所有变量都含有与原来的对象相同的值,除去那些引用其他对象的变量.那些引用其他对象的变量将指向被复制过的新对象,而不再是原有的那些被引用的对象.换言之,深复制把要复制的对象所引用的对象都复制了一遍. 2.Java的clone()方法 ⑴clone方法将对象复制了一份并返回

  • java 和 json 对象间转换

    1. json-lib是一个java类库,提供将Java对象,包括beans, maps, collections, java arrays and XML等转换成JSON,或者反向转换的功能. 2. json-lib 主页 : http://json-lib.sourceforge.net/ 3.执行环境 需要以下类库支持 commons-lang 2.5commons-beanutils 1.8.0commons-collections 3.2.1commons-logging 1.1.1e

  • Java从数据库中读取Blob对象图片并显示的方法

    本文实例讲述了Java从数据库中读取Blob对象图片并显示的方法.分享给大家供大家参考.具体实现方法如下: 第一种方法: 大致方法就是,从数据库中读出Blob的流来,写到页面中去: 复制代码 代码如下: Connection conn = DBManager.getConnection();   String sql = "SELECT picture FROM teacher WHERE id=1";   PreparedStatement ps = null;   ResultSe

  • java从list中取出对象并获得其属性值的方法

    最近公司的项目需要导出csv文件,一个同事用最原始的方式将每条记录取出然后加","解决.但是客户后面要求在每个页面当中都加入这个功能.于是,问题来了,分开写代码太多,合起来又不能确定在list中存储的对象为哪个对象,不能用get方法获得属性.我一直认为当初他那样写就将程序写死了.可是,在多次尝试后,还是通过java的反射从list中取出了对象,从对象中取出了属性值: 下面是代码: 复制代码 代码如下: package com.hb.test; import java.lang.refl

  • 如何计算Java对象占用了多少空间?

    本文介绍了计算Java对象占用了多少空间的方法,分享给大家供大家参考,具体内容如下 一.对象头 对象的头部至少有两个WORD,如果是数组的话,那么三个WORD,内容如下: 1.对象的HashCode,锁信息等 2.到对象类型数据的指针 3.数组的长度(如果是数组的话) 二.规则 首先,任何对象都是8字节对齐,属性按照[long,double].[int,float].[char,short].[byte,boolean].reference的顺序存放,举个例子: public class Tes

  • java各种类型对象占用内存情况分析

    前言 其实一般的程序猿根本不用了解这么深,只有当你到了一定层次,需要了解jvm内部运行机制,或者高并发多线程下,你写的代码对内存有影响,你想做性能优化.等等等等,一句话,当你想深入了解java对象在内存中,如何存储,或者每个对象占用多大空间时,你会感谢这篇文章 本文主要分析jvm中的情况,实验环境为64位window10系统.JDK1.8,使用JProfiler进行结论验证 很多描述以及 概念是基于你懂基本java知识的,如果你看起来有点吃力,要加油咯 本片更偏重验证,更多理论,请参考:http

  • java boolean占用内存大小说明

    答案:4B或1B 详细 1.如果boolean是单独使用:boolean占4个字节. 2.如果boolean是以boolean数组形式使用:boolean占1个字节 解释 1.JVM没有提供boolean类型专用的字节指令,而是使用int相关指令来代替. 2.对boolean数组的访问与修改,会共用byte数组的baload和bastore指令. 分析结论 上面的第一个结论是说:boolean在底层实际调用int,那么既然int占4个字节,boolean页自然占4个字节.即 boolean类型占

  • Java对象在JVM中的生命周期详解

    概念 在Java中,对象的生命周期包括以下几个阶段: 创建阶段(Created) 应用阶段(In Use) 不可见阶段(Invisible) 不可达阶段(Unreachable) 收集阶段(Collected) 终结阶段(Finalized) 对象空间重分配阶段(De-allocated) Java对象在JVM中的生命周期 当你通过new语句创建一个java对象时,JVM就会为这个对象分配一块内存空间,只要这个对象被引用变量引用了,那么这个对象就会一直驻留在内存中,否则,它就会结束生命周期,JV

  • Java对象的四种引用方式实例分析

    本文实例讲述了Java对象的四种引用方式.分享给大家供大家参考,具体如下: 一 点睛 Java语言对对象的引用有如下四种方式 强引用:我们平时一般都是这种引用,当一个对象被一个或一个以上的引用变量所引用时,它处于可达状态,不可能被系统垃圾回收机制回收. 软引用:软引用需要通过SoftReference类来实现,当一个对象只具有软引用时,它有可能被垃圾回收机制回收.对于只有软引用的对象而言,当系统内存空间足够时,它不会被系统回收,程序也可以使用该对象,当系统内存空间不够时,系统可能回收它.软引用通

  • 从汇编码分析java对象的创建过程(推荐)

    源码: class T { int m = 8; } T t = new T(); 汇编码: 0 new #2 <T> 3 dup 4 invokespecial #3 <T.<init>> 7 astore_1 8 return new #2 申请内存,在堆里面创建一个新对象. 半初始化,新建对象中的m值是0. dup 复制操作,因为invokespecial会消耗一份引用,所以先复制一份 invokespecial 4 invokespecial #3 <T.

  • Java对象布局(JOL)实现过程解析

    java对象布局JOL(java object layout),描述对象在堆内存的布局.如下图: 1.markword 固定长度8byte,描述对象的identityhashcode,分代年龄,锁信息等(https://www.jb51.net/article/183984.htm): 2.klasspoint 固定长度4byte, 指定该对象的class类对象: 3.基本变量:用于存放java八种基本类型成员变量,以4byte步长进行补齐,使用内存重排序优化空间: 4.引用变量:存放类的引用变

  • 浅谈java对象结构 对象头 Markword

    概述 对象实例由对象头.实例数据组成,其中对象头包括markword和类型指针,如果是数组,还包括数组长度; | 类型 | 32位JVM | 64位JVM| | ------ ---- | ------------| --------- | | markword | 32bit | 64bit | | 类型指针 | 32bit |64bit ,开启指针压缩时为32bit | | 数组长度 | 32bit |32bit | header.png compressed_header.png 可以看到

  • 详解Java对象的内存布局

    前言 今天来讲些抽象的东西 -- 对象头,因为我在学习的过程中发现很多地方都关联到了对象头的知识点,例如JDK中的 synchronized锁优化 和 JVM 中对象年龄升级等等.要深入理解这些知识的原理,了解对象头的概念很有必要,而且可以为后面分享 synchronized 原理和 JVM 知识的时候做准备. 对象内存构成 Java 中通过 new 关键字创建一个类的实例对象,对象存于内存的堆中并给其分配一个内存地址,那么是否想过如下这些问题: 这个实例对象是以怎样的形态存在内存中的? 一个O

随机推荐