很早就对数据在内存中的结构和体积有深入了解的想法。平时写代码的过程中,对于这些完全处于一种感性的认识,对于代码中使用的数据结构和对象,尤其是处理大量数据的时候,总有种把控不住的感觉。
趁周六日有时间的功夫,通过查阅一些有关虚拟机和内存对象的资料,和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