Merge pull request #9526 from alimate/BAEL-4116
BAEL-4116: Objects Memory Layout in Java
This commit is contained in:
commit
1739280948
|
@ -0,0 +1,108 @@
|
||||||
|
package com.baeldung.memlayout;
|
||||||
|
|
||||||
|
import org.junit.Test;
|
||||||
|
import org.openjdk.jol.info.ClassLayout;
|
||||||
|
import org.openjdk.jol.vm.VM;
|
||||||
|
import sun.misc.Contended;
|
||||||
|
|
||||||
|
public class MemoryLayoutUnitTest {
|
||||||
|
|
||||||
|
private volatile Object consumer;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void printingTheVMDetails() {
|
||||||
|
System.out.println(VM.current().details());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void simpleMemoryLayout() {
|
||||||
|
System.out.println(ClassLayout.parseClass(SimpleInt.class).toPrintable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void identityHashCodeMemoryLayout() {
|
||||||
|
SimpleInt instance = new SimpleInt();
|
||||||
|
System.out.println(ClassLayout.parseInstance(instance).toPrintable());
|
||||||
|
|
||||||
|
System.out.println("The identity hash code is " + System.identityHashCode(instance));
|
||||||
|
System.out.println(ClassLayout.parseInstance(instance).toPrintable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void alignmentMemoryLayout() {
|
||||||
|
System.out.println(ClassLayout.parseClass(SimpleLong.class).toPrintable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void fieldPackingMemoryLayout() {
|
||||||
|
System.out.println(ClassLayout.parseClass(FieldsArrangement.class).toPrintable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void monitorLockMemoryLayout() {
|
||||||
|
Lock lock = new Lock();
|
||||||
|
System.out.println(ClassLayout.parseInstance(lock).toPrintable());
|
||||||
|
|
||||||
|
synchronized (lock) {
|
||||||
|
System.out.println(ClassLayout.parseInstance(lock).toPrintable());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void ageAndTenuringMemoryLayout() {
|
||||||
|
Object instance = new Object();
|
||||||
|
long lastAddr = VM.current().addressOf(instance);
|
||||||
|
ClassLayout layout = ClassLayout.parseInstance(instance);
|
||||||
|
|
||||||
|
for (int i = 0; i < 10_000; i++) {
|
||||||
|
long currentAddr = VM.current().addressOf(instance);
|
||||||
|
if (currentAddr != lastAddr) {
|
||||||
|
System.out.println(layout.toPrintable());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int j = 0; j < 10_000; j++) {
|
||||||
|
consumer = new Object();
|
||||||
|
}
|
||||||
|
|
||||||
|
lastAddr = currentAddr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void contendedMemoryLayout() {
|
||||||
|
System.out.println(ClassLayout.parseClass(Isolated.class).toPrintable());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void arrayMemoryLayout() {
|
||||||
|
boolean[] booleans = new boolean[3];
|
||||||
|
System.out.println(ClassLayout.parseInstance(booleans).toPrintable());
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SimpleInt {
|
||||||
|
private int state;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class SimpleLong {
|
||||||
|
private long state;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class FieldsArrangement {
|
||||||
|
private boolean first;
|
||||||
|
private char second;
|
||||||
|
private double third;
|
||||||
|
private int forth;
|
||||||
|
private boolean fifth;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static class Lock {}
|
||||||
|
|
||||||
|
private static class Isolated {
|
||||||
|
|
||||||
|
@Contended
|
||||||
|
private int i;
|
||||||
|
|
||||||
|
@Contended
|
||||||
|
private long l;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue