标签:java 对象 虚拟机 内存结构
很早就对数据在内存中的结构和体积有深入了解的想法。平时写代码的过程中,对于这些完全处于一种感性的认识,对于代码中使用的数据结构和对象,尤其是处理大量数据的时候,总有种把控不住的感觉。趁周六日有时间的功夫,通过查阅一些有关虚拟机和内存对象的资料,和Eclipse查看源码,自己琢磨着实实在在计算一下一个对象到底是占用了多少空间,它在内存中到底是个什么样子的。于是经过了两天的探索,总于有了下面这篇文章。
对于文章中涉及到的数据,不同的JDK环境可能会有一些小出入,这包括 JDK的版本,JDK32/64位,JVM参数分配的内存大小,垃圾回收器的种类。
就本文中的数据,来源于jdk1.7.0_79 64位,WIN7 64位,Eclipse Version:
Mars Release (4.5.0)。
每个对象计算出的占用空间大小都是在自己机器上经过验证了的,具体的验证方法会在接来的一篇文章中贴出来。如果对文中的数据有疑问,十分欢迎指正交流,本着小菜鸟不断学习的态度,希望大家共同进步。
对象=对象头+成员变量+对齐填充
对象头结构:java对象在Heap里面的结构是这样的:对象头跟对象体,对象体跟C里面的结构体是一样的,对象头由两个域组成:用于存放hashcode、同步、GC的_mask域,和指向方法区该对象Class对象的指针——_klass域,对于64位系统,头部长度理论上讲应该是8+8=16字节。但是从java6u23以后开始,64位的机器会自动开启指针压缩的功能,此时引用指针的长度为4字节。所以,对象头长度应该为8+4=12。
成员变量:分两类,包括一些基本类型,如int,long.byte,short,boolean等,以及引用类型,如String,Date引用。如果是引用类型,也应该把引用类型指向的对象纳入当前对象。
对齐填充:JVM规定,对象的大小必须是8字节的整数倍,如果不足,则会补齐。
此外,对于数组,还会有一个标示数组长度的字段。其实数组也是一种类,会在后文中介绍。
以此为理论基础,我们来计算一下常用的对象占用空间大小。
版权声明:本文为博主原创文章,未经博主允许不得转载。
对象的内存结构及占用空间的计算方法
标签:java 对象 虚拟机 内存结构
原文地址:http://blog.csdn.net/zq602316498/article/details/47108587