Move the Memory Layout Codebase to a new Module

This commit is contained in:
Ali Dehghani
2020-06-24 15:19:35 +04:30
parent abad4882c6
commit baa8c725ce
4 changed files with 49 additions and 0 deletions

View 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:

View 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>

View File

@@ -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;
}
}