Table des matières
Allocation sur la pile" >Allocation sur la pile
Remplacement scalaire" >Remplacement scalaire
Maison Java javaDidacticiel Comprendre l'analyse d'échappement JVM en 3 minutes

Comprendre l'analyse d'échappement JVM en 3 minutes

Aug 15, 2023 pm 04:39 PM
jvm

En tant que développeur Java qualifié, nous savons tous que pratiquement tous les objets sont créés sur le tas. Cependant, il n'y a toujours pas de mot absolu ici, il fait référence à essentiellement tout.

Hier lors d'une interview, un ami a dit que tous les objets sont créés dans le tas, puis s'est moqué de l'intervieweur.

Commencez notre texte principal, parlons aujourd'hui de l'analyse des évasions.

Escape Analysis (Escape Analysis) est actuellement une technologie d'optimisation relativement avant-gardiste dans la machine virtuelle Java. Il s'agit d'un algorithme d'analyse du flux de données global interfonctionnel qui peut réduire efficacement la charge de synchronisation et la pression d'allocation du tas de mémoire dans les programmes Java. Grâce à l'analyse d'échappement, le compilateur Java Hotspot peut analyser la plage d'utilisation de la référence d'un nouvel objet et décider s'il doit allouer cet objet au tas.

Le principe de base de l'analyse d'échappement est  : analyser la portée dynamique des objets. Lorsqu'un objet est défini dans une méthode, il peut être référencé par des méthodes externes, par exemple en étant transmis à d'autres méthodes en tant que paramètres d'appel. une méthode Escape ; elle peut même être accessible par des threads externes, comme l'affectation à des variables d'instance accessibles dans d'autres threads. C'est ce qu'on appelle l'échappement de thread depuis aucun échappement, l'échappement de méthode vers l'échappement de thread, c'est ce qu'on appelle l'objet de bas. à élevé. Différents degrés d’évasion.

Lorsque l'analyse d'échappement est activée, le compilateur peut optimiser le code comme suit :

  1. Élimination synchrone : si l'analyse d'échappement trouve qu'un objet n'est accessible que par un seul thread, les opérations sur cet objet peuvent être asynchrone.
  2. Allocation sur la pile : Si vous êtes sûr qu'un objet ne s'échappera pas du thread, ce serait une très bonne idée d'allouer de la mémoire à cet objet sur la pile. L'espace mémoire occupé par l'objet peut être libéré. avec le cadre de la pile et détruit.
  3. Remplacement scalaire : si l'analyse d'échappement révèle qu'un objet n'est pas accessible par des méthodes externes et que cet objet peut être démantelé, alors le programme ne peut pas créer cet objet lorsqu'il est réellement exécuté, mais en créer directement plusieurs. Alors cette méthode utilise des variables membres à la place. Après avoir divisé l'objet, les variables membres de l'objet peuvent être allouées, lues et écrites sur la pile.

Dans JVM, vous pouvez spécifier s'il faut activer l'analyse d'échappement via les paramètres suivants :

-XX:+DoEscapeAnalysis : indique l'activation de l'analyse d'échappement (elle est activée par défaut après JDK 1.7). -XX:+DoEscapeAnalysis :表示开启逃逸分析(JDK 1.7之后默认开启)。

-XX:-DoEscapeAnalysis

-XX:-DoEscapeAnalysis : Représente Désactivez l'analyse d'échappement. 🎜

Élimination de la synchronisation

La synchronisation des threads elle-même est un processus relativement long. Si l'analyse d'échappement peut déterminer qu'une variable n'échappera pas au thread et ne sera pas accessible par d'autres threads, alors il n'y aura certainement ni lecture ni écriture. de cette variable, les mesures de synchronisation mises en œuvre sur cette variable peuvent être éliminées en toute sécurité.

Comme le code suivant :

public void method() {
    Object o = new Object();
    synchronized (o) {
        System.out.println(o);
    }
}
Copier après la connexion

verrouille 对象o, mais le cycle de vie de l'objet o est le même que celui de la méthode méthode(), donc il ne sera pas accessible par d'autres threads et les problèmes de sécurité des threads ne se produiront pas. sera bloqué pendant la phase de compilation JIT. Optimisé pour ressembler à ceci :

public void method() {
    Object o = new Object();
    System.out.println(o);
}
Copier après la connexion

C'est également connu sous le nom de Lock Elimination.

Allocation sur la pile

Dans la machine virtuelle Java, l'allocation d'espace mémoire pour les objets créés sur le tas Java est presque du bon sens pour les programmeurs Java. Les objets du tas Java sont partagés et visibles par chaque thread. tant que vous détenez une référence à cet objet, vous pouvez accéder aux données d'objet stockées dans le tas. Le sous-système de récupération de place de la machine virtuelle recyclera les objets qui ne sont plus utilisés dans le tas, mais l'action de recyclage, qu'il s'agisse de marquer et de filtrer les objets recyclables, ou de recycler et d'organiser la mémoire, nécessite beaucoup de ressources. Cependant, il existe un cas particulier. Si l'analyse d'échappement confirme que l'objet ne s'échappera pas du thread, il peut être optimisé pour l'allocation sur la pile. Cela élimine le besoin d’allouer de la mémoire sur le tas et élimine le besoin de garbage collection.

Comme le code suivant :

public static void main(String[] args) throws InterruptedException {

    for (int i = 0; i < 1000000; i++) {
        alloc();
    }

    Thread.sleep(100000);
}

private static void alloc() {
    User user = new User();
}
Copier après la connexion

Le code est très simple, il s'agit de créer une boucle 1 million de fois et d'utiliser la méthode alloc() pour créer 1 million d'objets User. L'objet User défini ici dans la méthode alloc() n'est pas référencé par d'autres méthodes, il répond donc aux exigences d'allocation sur la pile.

Les paramètres JVM sont les suivants :

-Xmx2G -Xms2G -XX:+DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
Copier après la connexion

Démarrez le programme et vérifiez le nombre d'instances via l'outil jmap :

jmap -histo pid

num     #instances         #bytes  class name
----------------------------------------------
1:          3771        2198552  [B
2:         10617        1722664  [C
3:        104057        1664912  com.miracle.current.lock.StackAllocationTest$User
Copier après la connexion

Nous pouvons voir que le programme a créé un total de 104057 objets utilisateur, soit bien moins de 1 million. Nous pouvons désactiver l'analyse d'échappement et y jeter un œil à nouveau :

-Xmx2G -Xms2G -XX:-DoEscapeAnalysis -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError
Copier après la connexion

Démarrez le programme et vérifiez le nombre d'instances via l'outil jmap :

jmap -histo 42928

 num     #instances         #bytes  class name
----------------------------------------------
   1:           628       22299176  [I
   2:       1000000       16000000  com.miracle.current.lock.StackAllocationTest$User
Copier après la connexion

Vous pouvez voir qu'un total de 1 million d'objets utilisateur ont été créés après avoir désactivé l'analyse d'échappement. . En comparaison, l'allocation sur la pile joue un rôle important dans la consommation de mémoire du tas et dans le GC.

Remplacement scalaire

Si une donnée ne peut plus être décomposée en données plus petites à représenter, les types de données d'origine dans la machine virtuelle Java (int, long et autres types numériques et types de référence, etc.) ne peuvent pas disparaître En outre décomposées, ces données peuvent alors être appelées scalaires. En revanche, si une donnée peut continuer à être décomposée, elle est appelée un agrégat. Les objets en Java sont des agrégats typiques.

Si l'analyse d'échappement peut prouver qu'un objet ne sera pas accessible en dehors de la méthode et que cet objet peut être démantelé, alors le programme ne peut pas créer cet objet lorsqu'il est réellement exécuté, mais en créer directement plusieurs pour être utilisés par cette méthode.

a le code suivant :

public static void main(String[] args) {

    method();
}

private static void method() {
    User user = new User(25);

    System.out.println(user.age);
}

private static class User {

    private int age;

    public User(int age) {
        this.age = age;
    }
}
Copier après la connexion

method()方法中创建User对象,指定age为25,这里User不会被其他方法引用,也就是说它不会逃逸出方法,并且User是可以拆解为标量的。所以alloc()代码会优化为如下:

private static void alloc() {
    int age = 25;

    System.out.println(age);
}
Copier après la connexion

总结

尽管目前逃逸分析技术仍在发展之中,未完全成熟,但它是即时编译器优化技术的一个重要前进方向,在日后的Java虚拟机中,逃逸分析技术肯定会支撑起一系列更实用、有效的优化技术。

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Un outil de supervision JVM distribué, très pratique ! Un outil de supervision JVM distribué, très pratique ! Aug 15, 2023 pm 05:15 PM

Ce projet est conçu pour permettre aux développeurs de surveiller plus rapidement plusieurs JVM hôtes distants. Si votre projet est Spring Boot, il est très facile à intégrer. S'il ne s'agit pas de Spring Boot, ne vous découragez pas. initialiser rapidement un programme de démarrage Spring et le présenter vous-même suffit.

Explication détaillée des paramètres de ligne de commande JVM : l'arme secrète pour contrôler le fonctionnement de la JVM Explication détaillée des paramètres de ligne de commande JVM : l'arme secrète pour contrôler le fonctionnement de la JVM May 09, 2024 pm 01:33 PM

Les paramètres de ligne de commande JVM vous permettent d'ajuster le comportement de la JVM à un niveau plus fin. Les paramètres communs incluent : Définir la taille du tas Java (-Xms, -Xmx) Définir la taille de la nouvelle génération (-Xmn) Activer le garbage collector parallèle (-XX:+UseParallelGC) Réduire l'utilisation de la mémoire de la zone Survivor (-XX : -ReduceSurvivorSetInMemory) Éliminer la redondance Éliminer le garbage collection (-XX:-EliminateRedundantGCs) Imprimer les informations sur le garbage collection (-XX:+PrintGC) Utiliser le garbage collector G1 (-XX:-UseG1GC) Définir le temps de pause maximum du garbage collection (-XX:MaxGCPau

Points clés et précautions relatifs à la gestion de la mémoire JVM Points clés et précautions relatifs à la gestion de la mémoire JVM Feb 20, 2024 am 10:26 AM

Points clés et précautions pour maîtriser l'utilisation de la mémoire de la JVM La JVM (JavaVirtualMachine) est l'environnement dans lequel s'exécutent les applications Java, et le plus important est la gestion de la mémoire de la JVM. Une gestion correcte de la mémoire JVM peut non seulement améliorer les performances des applications, mais également éviter des problèmes tels que des fuites et des débordements de mémoire. Cet article présentera les points et considérations clés de l'utilisation de la mémoire JVM et fournira quelques exemples de code spécifiques. Partitions de mémoire JVM La mémoire JVM est principalement divisée dans les zones suivantes : Heap (Heap)

Erreur Java : erreur de dépassement de mémoire JVM, comment gérer et éviter Erreur Java : erreur de dépassement de mémoire JVM, comment gérer et éviter Jun 24, 2023 pm 02:19 PM

Java est un langage de programmation populaire lors du développement d'applications Java, vous pouvez rencontrer des erreurs de dépassement de mémoire JVM. Cette erreur provoque généralement le crash de l'application, affectant l'expérience utilisateur. Cet article explorera les causes des erreurs de dépassement de mémoire JVM et comment gérer et éviter de telles erreurs. Qu’est-ce qu’une erreur de débordement de mémoire JVM ? La machine virtuelle Java (JVM) est l'environnement d'exécution des applications Java. Dans la JVM, la mémoire est divisée en plusieurs zones, notamment le tas, la zone de méthode, la pile, etc. Le tas est utilisé pour stocker les objets créés

Analyse des fonctions et principes de la machine virtuelle JVM Analyse des fonctions et principes de la machine virtuelle JVM Feb 22, 2024 pm 01:54 PM

Une introduction à l'analyse des fonctions et des principes de la machine virtuelle JVM : La machine virtuelle JVM (JavaVirtualMachine) est l'un des composants centraux du langage de programmation Java, et c'est l'un des principaux arguments de vente de Java. Le rôle de la JVM est de compiler le code source Java en bytecodes et d'être responsable de l'exécution de ces bytecodes. Cet article présentera le rôle de la JVM et son fonctionnement, et fournira quelques exemples de code pour aider les lecteurs à mieux comprendre. Fonction : La fonction principale de JVM est de résoudre le problème de portabilité des programmes Java sur différentes plateformes.

Comment ajuster efficacement la taille de la mémoire tas JVM ? Comment ajuster efficacement la taille de la mémoire tas JVM ? Feb 18, 2024 pm 01:39 PM

Paramètres de mémoire JVM : comment ajuster raisonnablement la taille de la mémoire tas ? Dans les applications Java, la JVM est le composant clé responsable de la gestion de la mémoire. Parmi eux, la mémoire tas est utilisée pour stocker les instances d'objets. Le paramètre de taille de la mémoire tas a un impact important sur les performances et la stabilité de l'application. Cet article explique comment ajuster raisonnablement la taille de la mémoire du tas, avec des exemples de code spécifiques. Tout d’abord, nous devons comprendre quelques connaissances de base sur la mémoire JVM. La mémoire de la JVM est divisée en plusieurs zones, notamment la mémoire tas, la mémoire pile, la zone méthode, etc. dans

Programme Java pour vérifier si la JVM est 32 bits ou 64 bits Programme Java pour vérifier si la JVM est 32 bits ou 64 bits Sep 05, 2023 pm 06:37 PM

Avant d'écrire un programme Java pour vérifier si la JVM est 32 bits ou 64 bits, parlons d'abord de la JVM. JVM est une machine virtuelle Java, responsable de l'exécution du bytecode. Il fait partie de Java Runtime Environment (JRE). Nous savons tous que Java est indépendant de la plate-forme, mais JVM dépend de la plate-forme. Nous avons besoin d'une JVM distincte pour chaque système d'exploitation. Si nous avons le bytecode de n’importe quel code source Java, nous pouvons facilement l’exécuter sur n’importe quelle plate-forme grâce à JVM. L'ensemble du processus d'exécution du fichier Java est le suivant - Tout d'abord, nous enregistrons le code source Java avec l'extension .java et le compilateur le convertit en bytecode avec l'extension .class. Cela se produit au moment de la compilation. Maintenant, au moment de l'exécution, J

Démystifier le principe de fonctionnement de la JVM : exploration approfondie des principes de la machine virtuelle Java Démystifier le principe de fonctionnement de la JVM : exploration approfondie des principes de la machine virtuelle Java Feb 18, 2024 pm 12:28 PM

Explication détaillée des principes JVM : Une exploration approfondie du principe de fonctionnement de la machine virtuelle Java nécessite des exemples de code spécifiques 1. Introduction Avec le développement rapide et l'application généralisée du langage de programmation Java, la machine virtuelle Java (JavaVirtualMachine, appelée JVM ) est également devenu indispensable dans le développement de logiciels. En tant qu'environnement d'exécution des programmes Java, JVM peut fournir des fonctionnalités multiplateformes, permettant aux programmes Java de s'exécuter sur différents systèmes d'exploitation. Dans cet article, nous examinerons le fonctionnement de la JVM

See all articles