Qu'est-ce que l'analyse Java Escape?

Préface

Je touchais Graal et je ne savais pas ce qu'était l'analyse de l'évasion partielle, alors je l'ai recherchée.

↓ Articles écrits sur Graal / GraalVM https://qiita.com/kinshotomoya/items/39a821dd6a6a52202c0a

L'exemple de code est écrit en scala.

Qu'est-ce que l'évasion

La référence d'objet existe en dehors de la méthode ou dans un thread différent. Lorsqu'il est échappé, vous pouvez faire référence à l'objet à partir d'un nombre non spécifié d'emplacements.

Conditions de fuite

Quand pouvons-nous dire qu'un objet est échappé dans le code réel? Il y a principalement les trois conditions suivantes.

  1. Spécifiez comme argument de méthode
  2. Retour avec retour (spécifiez comme valeur de retour)

1. Spécifiez comme argument de méthode

Les références à a, qui est une instance d'Object, peuvent être référencées au-delà de la méthode hoge. Peut également être référencé à partir de la méthode foo

case class Object()

object Test {
  def hoge: Object = {
    val a = Object()
    foo(a)
  }
  
  def foo(obj: Object) = ???
}

2. Retour avec retour (spécifiez comme valeur de retour)

Les références à l'instance b d'un objet peuvent être référencées au-delà de la méthode hoge. La variable b2 a une référence à l'objet a.

case class Object()

object Test {
  def hoge: Object = {
    val b = Object()
    b
  }
  
  val b2 = hoge()
}

En d'autres termes, il est possible de se référer aux instances de l'exemple ci-dessus, a et b, au-delà de la méthode.

Qu'est-ce que l'analyse d'évasion?

Analysez si la référence d'instance s'échappe en dehors de la méthode ou vers un autre thread. Il existe différents algorithmes.

Et s'il est analysé s'il n'est pas échappé?

Lorsque l'analyse d'échappement montre que la référence est fermée à l'intérieur de la méthode,

1. Stockez l'instance dans la pile, pas dans le tas.

Si l'instance est utilisée uniquement dans la méthode, il est efficace de la stocker dans la zone de pile qui est libérée après la fin de la méthode.

2. Ignorez les synchronisations inutiles lors de l'exécution des méthodes

Les références provenant d'un seul thread éliminent le besoin de synchronisation entre les threads.

Exemple d'optimisation

À la suite de l'analyse d'échappement, le compilateur optimise le code. Un exemple est montré.

En ligne

J'ai le code suivant.


class Person {
  def get(name: String) = {
    val person: Person = Person(name)
    if (person.name === "hoge") {
    }
    ...
  }
}

case class Person(name: String)

Une instance de l'objet Person, person, n'a pas été échappée. Dans de tels cas, le compilateur en ligne et optimise.

class Person {
  def get(name: String) = {
    // val person: Person = Person(name)
    if (name === "hoge") { //En ligne

    }
    ...
  }
}

case class Person(name: String)


Analyse des échappées partielles

C'est l'une des fonctionnalités du nouveau compilateur JIT Graal. Il peut être partiellement optimisé.

Si vous avez le code suivant.

class Person {
  def get(name: String) = {
    val person: Person = Person(name)
    val cachePerson = Cache.get(name)
    if (cachePerson.isDefined) {
      cachePerson
    } else {
     addToCache(person)
     person
    }
  }
}

case class Person(name: String)

L'objet personne n'est pas échappé si cachePerson existe. Le compilateur analyse cela et le corrige au code suivant.


class Person {
  def get(name: String) = {
    val cachePerson = Cache.get(name)
    if (cachePerson.isDefined) {
      cachePerson
    } else {
     val person: Person = Person(name)
     addToCache(person)
      person
    }
  }
}

case class Person(name: String)

Vous pouvez déplacer val person: Person = Person (name) sous ʻelse et, si cachePerson` existe, éliminer l'allocation de mémoire à la zone de tas. Au lieu de cela, il est stocké dans la zone de pile, améliorant l'efficacité du traitement.

Si cachePerson n'existe pas, la personne sera échappée et stockée dans la zone du tas.

référence

Recommended Posts

Qu'est-ce que l'analyse Java Escape?
Qu'est-ce que 'java
Qu'est-ce que Java <>?
Qu'est-ce que l'encapsulation Java?
Qu'est-ce que la technologie Java?
[Java] Qu'est-ce que flatMap?
[Java] Qu'est-ce que ArrayList?
Qu'est-ce que l'assertion Java? Résumé.
Qu'est-ce qu'une collection Java?
[Java] Qu'est-ce que jaee j2ee?
[Java] Qu'est-ce que l'héritage de classe?
[Notions de base Java] Qu'est-ce que la classe?
Qu'est-ce que JVM (Java Virtual Machine)?
Qu'est-ce que Thread Safe (avec Java)
Qu'est-ce qu'une expression lambda (Java)
Qu'est-ce qu'une classe en langage Java (3 /?)
Qu'est-ce qui est nul? ]
Qu'est-ce que Keycloak
[Java] Séquence d'échappement
Qu'est-ce que Jackson?
Qu'est-ce que soi
Qu'est-ce que Jenkins
Qu'est-ce que ArgumentMatcher?
Qu'est-ce que IM-Juggling?
Quelle est la meilleure lecture de fichier (Java)
Qu'est-ce qu'une classe en langage Java (1 /?)
Qu'est-ce que les paramètres
Qu'est-ce que SLF4J?
Qu'est-ce que Java et l'environnement de développement (MAC)
Qu'est-ce qu'une classe en langage Java (2 /?)
Qu'est-ce que la façade? ??
Qu'est-ce que Gradle?
Quelle est la méthode principale en Java?
Qu'est-ce que centOS
Qu'est-ce que RubyGem?
Qu'est-ce que before_action?
Qu'est-ce que Docker
Qu'est-ce que Byte?
Qu'est-ce que Tomcat
Qu'est-ce que le modèle Java Servlet / JSP MVC?
Quel est le modificateur volatile pour les variables Java?
Qu'est-ce que `docker-compose up`?
Qu'est-ce qu'un constructeur
Qu'est-ce que le codage en dur?
Qu'est-ce qu'un flux
Qu'est-ce qu'une permission refusée?
Qu'est-ce que le contrôle d'instance?
Qu'est-ce que Spring Tools 4
Qu'est-ce qu'un opérateur?
Qu'est-ce que l'orientation objet?
Qu'est-ce que le @VisibleForTesting de Guava?
Qu'est-ce qu'un modèle MVC?
Qu'est-ce qu'une annotation?
Qu'est-ce que @ (variable d'instance)?
Qu'est-ce que l'artefact de Gradle?
Qu'est-ce que l'audit JPA?
Qu'est-ce qu'un servlet?