Was ist Java-Fluchtanalyse?

Vorwort

Ich berührte Graal und wusste nicht, was die partielle Fluchtanalyse war, also schlug ich nach.

↓ Artikel über Graal / GraalVM https://qiita.com/kinshotomoya/items/39a821dd6a6a52202c0a

Der Beispielcode ist in Scala geschrieben.

Was ist Flucht?

Die Objektreferenz existiert außerhalb der Methode oder in einem anderen Thread. Bei Escapezeichen können Sie von einer nicht festgelegten Anzahl von Stellen auf das Objekt verweisen.

Fluchtbedingungen

Wann können wir sagen, dass ein Objekt im eigentlichen Code maskiert ist? Es gibt hauptsächlich die folgenden drei Bedingungen.

  1. Geben Sie als Methodenargument an
  2. Rückgabe mit Rückgabe (als Rückgabewert angeben)

1. Geben Sie als Methodenargument an

Verweise auf a, eine Instanz von Object, können über die hoge-Methode hinaus referenziert werden. Kann auch über die foo-Methode referenziert werden

case class Object()

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

2. Rückgabe mit Rückgabe (als Rückgabewert angeben)

Verweise auf Instanz b eines Objekts können über die Hoge-Methode hinaus referenziert werden. Die Variable b2 hat einen Verweis auf Objekt a.

case class Object()

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

Mit anderen Worten ist es möglich, über das Verfahren hinaus auf die Instanzen des obigen Beispiels a und b zu verweisen.

Was ist Fluchtanalyse?

Analysieren Sie, ob die Instanzreferenz außerhalb der Methode oder in einen anderen Thread maskiert wird. Es gibt verschiedene Algorithmen.

Was ist, wenn es analysiert wird, wenn es nicht entkommen ist?

Wenn die Escape-Analyse zeigt, dass die Referenz innerhalb der Methode geschlossen ist,

1. Speichern Sie die Instanz im Stapel, nicht im Heap.

Wenn die Instanz nur innerhalb der Methode verwendet wird, ist es effektiv, sie im Stapelbereich zu speichern, der nach dem Ende der Methode freigegeben wird.

2. Ignorieren Sie unnötige Synchronisation, wenn Sie Methoden ausführen

Referenzen von nur einem Thread machen eine Synchronisation zwischen Threads überflüssig.

Optimierungsbeispiel

Als Ergebnis der Escape-Analyse optimiert der Compiler den Code. Ein Beispiel wird gezeigt.

In der Reihe

Ich habe den folgenden Code.


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

case class Person(name: String)

Eine Instanz des Person-Objekts, person, wurde nicht maskiert. In solchen Fällen inline und optimiert der Compiler.

class Person {
  def get(name: String) = {
    // val person: Person = Person(name)
    if (name === "hoge") { //In der Reihe

    }
    ...
  }
}

case class Person(name: String)


Teilfluchtanalyse

Dies ist eine der Funktionen des neuen JIT-Compilers Graal. Es kann teilweise optimiert werden.

Wenn Sie den folgenden Code haben.

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)

Die Objektperson wird nicht maskiert, wenn cachePerson vorhanden ist. Der Compiler analysiert dies und korrigiert es auf den folgenden Code.


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)

Sie können "val person: Person = Person (name)" unter "else" verschieben und, falls "cachePerson" vorhanden ist, die Speicherzuordnung zum Heap-Bereich entfernen. Stattdessen wird es im Stapelbereich gespeichert, wodurch die Verarbeitungseffizienz verbessert wird.

Wenn cachePerson nicht existiert, wird die Person maskiert und im Heap-Bereich gespeichert.

Referenz

Recommended Posts

Was ist Java-Fluchtanalyse?
Was ist java
Was ist Java <>?
Was ist Java-Kapselung?
Was ist Java-Technologie?
[Java] Was ist flatMap?
[Java] Was ist ArrayList?
Was ist Java Assertion? Zusammenfassung.
Was ist eine Java-Sammlung?
[Java] Was ist jaee j2ee?
[Java] Was ist Klassenvererbung?
[Java-Grundlagen] Was ist Klasse?
Was ist JVM (Java Virtual Machine)?
Was ist Thread-sicher (mit Java)
Was ist ein Lambda-Ausdruck (Java)
Was ist eine Klasse in der Java-Sprache (3 /?)
Was ist null? ]]
Was ist Schlüsselumhang?
[Java] Escape-Sequenz
Was ist Jackson?
Was ist Selbst
Was ist Jenkins?
Was ist ArgumentMatcher?
Was ist IM-Jonglieren?
Was ist das beste Lesen von Dateien (Java)
Was ist eine Klasse in der Java-Sprache (1 /?)
Was ist params
Was ist SLF4J?
Was ist Java und Entwicklungsumgebung (MAC)
Was ist eine Klasse in der Java-Sprache (2 /?)
Was ist Fassade? ??
Was ist Gradle?
Was ist die Hauptmethode in Java?
Was ist centOS?
Was ist RubyGem?
Was ist before_action?
Was ist Docker?
Was ist Byte?
Was ist Tomcat?
Was ist das Java Servlet / JSP MVC-Modell?
Was ist der flüchtige Modifikator für Java-Variablen?
Was ist Docker-Compose?
Was ist ein Konstruktor?
Was ist harte Codierung?
Was ist ein Stream?
Was ist die Erlaubnis verweigert?
Was ist Instanzsteuerung?
Was ist Spring Tools 4?
Was ist ein Operator?
Was ist Objektorientierung?
Was ist Guavas @VisibleForTesting?
Was ist ein MVC-Modell?
Was ist eine Anmerkung?
Was ist @ (Instanzvariable)?
Was ist Gradles Artefakt?
Was ist JPA-Prüfung?
Was ist ein Servlet?