在java中打印变量的地址
这个代码是在startoverflow上看到的,跟大家分享一下。
importsun.misc.Unsafe;importjava.lang.reflect.Field;importjava.util.Arrays;importjava.util.Collections;publicclassOrderOfObjectsAfterGCMain {staticfinalUnsafe unsafe =getUnsafe();staticfinalbooleanis64bit =true;//auto detect if possible.publicstaticvoidmain(String... args) {
Double[] ascending=newDouble[16];for(inti=0;i<ascending.length;i++)
ascending[i]= (double) i;
Double[] descending=newDouble[16];for(inti=descending.length-1; i>=0; i--)
descending[i]= (double) i;
Double[] shuffled=newDouble[16];for(inti=0;i<shuffled.length;i++)
shuffled[i]= (double) i;
Collections.shuffle(Arrays.asList(shuffled));
System.out.PRintln("Before GC");
printAddresses("ascending", ascending);
printAddresses("descending", descending);
printAddresses("shuffled", shuffled);
System.gc();
System.out.println("\nAfter GC");
printAddresses("ascending", ascending);
printAddresses("descending", descending);
printAddresses("shuffled", shuffled);
System.gc();
System.out.println("\nAfter GC 2");
printAddresses("ascending", ascending);
printAddresses("descending", descending);
printAddresses("shuffled", shuffled);
}publicstaticvoidprintAddresses(String label, Object... objects) {
System.out.print(label+ ": 0x");longlast = 0;intoffset =unsafe.arrayBaSEOffset(objects.getClass());intscale =unsafe.arrayIndexScale(objects.getClass());switch(scale) {case4:longfactor = is64bit ? 8 : 1;finallongi1 = (unsafe.getInt(objects, offset) & 0xFFFFFFFFL) *factor;
System.out.print(Long.toHexString(i1));
last=i1;for(inti = 1; i < objects.length; i++) {finallongi2 = (unsafe.getInt(objects, offset + i * 4) & 0xFFFFFFFFL) *factor;if(i2 >last)
System.out.print(", +" + Long.toHexString(i2 -last));elseSystem.out.print(", -" + Long.toHexString( last -i2));
last=i2;
}
break;case8:thrownewAssertionError("Not supported");
}
System.out.println();
}privatestaticUnsafe getUnsafe() {try{
Field theUnsafe= Unsafe.class.getDeclaredField("theUnsafe");
theUnsafe.setaccessible(true);return(Unsafe) theUnsafe.get(null);
}catch(Exception e) {thrownewAssertionError(e);
}
}
}
设置因为导入import sun.misc.Unsafe;引起的错误