Move the Memory Layout Codebase to a new Module
This commit is contained in:
5
core-java-modules/core-java-jvm-2/README.md
Normal file
5
core-java-modules/core-java-jvm-2/README.md
Normal file
@@ -0,0 +1,5 @@
|
||||
## Core Java JVM Cookbooks and Examples
|
||||
|
||||
This module contains articles about working with the Java Virtual Machine (JVM).
|
||||
|
||||
### Relevant Articles:
|
||||
43
core-java-modules/core-java-jvm-2/pom.xml
Normal file
43
core-java-modules/core-java-jvm-2/pom.xml
Normal file
@@ -0,0 +1,43 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>core-java-jvm-2</artifactId>
|
||||
<version>0.1.0-SNAPSHOT</version>
|
||||
<name>core-java-jvm-2</name>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
<parent>
|
||||
<groupId>com.baeldung.core-java-modules</groupId>
|
||||
<artifactId>core-java-modules</artifactId>
|
||||
<version>0.0.1-SNAPSHOT</version>
|
||||
<relativePath>../</relativePath>
|
||||
</parent>
|
||||
|
||||
<dependencies>
|
||||
<dependency>
|
||||
<groupId>junit</groupId>
|
||||
<artifactId>junit</artifactId>
|
||||
<version>${junit.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.assertj</groupId>
|
||||
<artifactId>assertj-core</artifactId>
|
||||
<version>${assertj.version}</version>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.openjdk.jol</groupId>
|
||||
<artifactId>jol-core</artifactId>
|
||||
<version>${jol-core.version}</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
<properties>
|
||||
<assertj.version>3.6.1</assertj.version>
|
||||
<jol-core.version>0.10</jol-core.version>
|
||||
</properties>
|
||||
|
||||
</project>
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user