avant-propos
Nous savons qu'en Java, synchronized
l'objet instance courant est verrouillé pour la méthode de synchronisation.
Par exemple le bout de code suivant :
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
Test test = new Test();
test.helper();
}
public synchronized void helper() {
try {
System.out.println("hello");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Après le vidage, nous pouvons obtenir les informations suivantes :
"main" #1 prio=5 os_prio=0 tid=0x00c46c00 nid=0x1d60 waiting on condition [0x00ddf000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at java.lang.Thread.sleep(Thread.java:340)
at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:386)
at Test.helper(Test.java:16)
- locked <0x09db48c0> (a Test)
at Test.main(Test.java:10)
L'adresse mémoire de l'instance test de Test est <0x09db48c0>. Comment vérifier que cette adresse est notre adresse mémoire ?
texte
Introduire des dépendances
Ajoutez des dépendances dans pom.xml :
<dependency>
<groupId>org.openjdk.jol</groupId>
<artifactId>jol-core</artifactId>
<version>0.10</version>
</dependency>
utiliser
C'est simple à utiliser :
VM.current().addressOf(test)
Le mettre dans notre code est:
import org.openjdk.jol.vm.VM;
import java.util.concurrent.TimeUnit;
public class Test {
public static void main(String[] args) {
Test test = new Test();
System.out.println("The memory address is " + VM.current().addressOf(test));
System.out.println("The memory address is " + Long.toHexString(VM.current().addressOf(test)));
test.helper();
}
public synchronized void helper() {
try {
System.out.println("hello");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Dans la console, nous pouvons voir la sortie :
The memory address is 165365952
The memory address is 9db48c0
hello
en conclusion
En introduisant org.openjdk.jol
on peut obtenir rapidement l'adresse mémoire de l'objet. Un regard général sur le code source pertinent montre que la couche inférieure est unsafe
jugée à l'aide de classes.
JOL (Java Object Layout) est la petite boîte à outils pour analyser les schémas de disposition des objets dans les JVM. Ces outils utilisent fortement Unsafe, JVMTI et Serviceability Agent (SA) pour décoder la disposition, l'empreinte et les références réelles de l'objet. Cela rend JOL beaucoup plus précis que d'autres outils reposant sur des vidages de tas, des hypothèses de spécification, etc.
(Java Object Layout) est une petite boîte à outils pour analyser les schémas de disposition des objets dans le jvm. Ces outils utilisent intensivement Unsafe, JVMTI et Serviceability Agent (SA) pour décoder la disposition réelle de l'objet, l'empreinte mémoire et les références. Cela rend JOL plus précis que d'autres outils qui reposent sur des vidages de tas, des hypothèses de spécification, etc.