查询出java对象的大小_如何查看一个java对象的大小

最近一直着迷于缓存行,要想正确理解缓存行以及伪共享就一定要知道java对象的大小,以及如何分布.

在这里演示了使用JOL   工具来查看一个对象的大小和分布.

JOL(Java Object Layout) is the tiny toolbox to analyze object layout schemes in JVMs. These tools are using Unsafe, JVMTI, and Serviceability Agent (SA) heavily to decoder theactualobject layout, footprint, and references. This makes JOL much more accurate than other tools relying on heap dumps, specification assumptions, etc.

该工具官网:

http://openjdk.java.net/projects/code-tools/jol/

下载地址:

下载jar包后保持如下的相对路径 和你要测试的类在一起.

查询出java对象的大小_如何查看一个java对象的大小_第1张图片

写一个对象来查看:

public final class VolatileLong

{

/**

* 大小计算:

* long 8 字节

* [1]java对象头: 32位 :8 byte 64位:12 byte

* 所以总共: 6 个填充 * 8 byte + 8 (value) + 8 (对象头) = 64 byte

* 还有采用如下方式的

* long p1, p2, p3, p4, p5, p6, p7; // cache line padding -> 7 *8 = 56 字节

*long value; -> 8 字节

*long p8, p9, p10, p11, p12, p13, p14; // cache line padding -> 7*8 = 56 字节

*

* java.util.concurrent.Exchanger.Slot

* // Improve likelihood of isolation on <= 64 byte cache lines

* long q0, q1, q2, q3, q4, q5, q6, q7, q8, q9, qa, qb, qc, qd, qe; 15 * 8

* 不知道为啥是这样实现:因为父类还有一个Long值 所以总的来说已经超过128了

*

*/

public volatile long value = 0L;

public long p1, p2, p3, p4, p5, p6; // comment out

//objectsize = 6*8 + 8 + 4 =

}

例如 上面的这个类在32 bit jvm上应该是 64 字节,正好攒够一个缓存行大小,

查询出java对象的大小_如何查看一个java对象的大小_第2张图片

对象头8 字节 + 8 (value long大小) + 6*8 (填充) = 64 字节

在64bit jvm上 开启指针压缩: (默认开启):

查询出java对象的大小_如何查看一个java对象的大小_第3张图片

对象头12字节 (但是要对齐8字节 所以对象头总共16字节.)

64bit不开启指针压缩:

查询出java对象的大小_如何查看一个java对象的大小_第4张图片

对象头为完整的16字节.

Java对象分布细节:

header

double /long 8byte

int  4 byte

byte 1 byte

boolean 1byte

Object ref 4 byte

Objetc [] arrat 4

同时 如果头有剩余空间会优先填充.

示例代码:

public class ObjectLoc

{

boolean booleanV, booleanV2;

byte byteV;

int intV;

long longV;

double doubleV;

Object ref;

Object [] arr;

}

有压缩:

查询出java对象的大小_如何查看一个java对象的大小_第5张图片

没有压缩:

查询出java对象的大小_如何查看一个java对象的大小_第6张图片

你可能感兴趣的:(查询出java对象的大小)