最近一直沉迷于缓存行,要想正确领略缓存行以及伪共享就必然要知道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 the actual object 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/
下载地点:
http://central.maven.org/maven2/org/openjdk/jol/jol-cli/
下载jar包后保持如下的相对路径 和你要测试的类在一起.
写一个工具来查察:
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<V> * // 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 字节,正好攒够一个缓存行巨细,
工具头8 字节 + 8 (value long巨细) + 6*8 (填充) = 64 字节
在64bit jvm上 开启指针压缩: (默认开启):
工具头12字节 (可是要对齐8字节 所以工具头总共16字节.)
64bit不开启指针压缩:
工具头为完整的16字节.
Java工具漫衍细节:
同时 假如头有剩余空间会优先填充.
示例代码:
public class ObjectLoc { boolean booleanV, booleanV2; byte byteV; int intV; long longV; double doubleV; Object ref; Object [] arr; }
有压缩:
没有压缩:
,图纸加密,软件开发,软件开发