Lädt die Java JVM ein ganzes Glas oder Ohr, wenn es nur eine Klasse davon verwendet?

8

Nehmen wir an, Sie haben eine 3-Gb-JAR-Datei und Ihre Anwendung verwendet nur eine kleine Klasse darin. Lädt die JVM die gesamte JAR-Datei in den Speicher oder liest sie das Inhaltsverzeichnis und lädt nur die Teile, die sie benötigt? Ist dieses Verhalten kontrollierbar?

    
ojblass 24.07.2009, 06:09
quelle

4 Antworten

6

JVM lädt beim Aufruf nur die erforderlichen Klassen aus dem Jar. Wenn eine Anwendung eine Klasse benötigt, werden die Klasse und alle anderen abhängigen Klassen geladen. Nicht sicher, aber ich nehme an, das ist die Verantwortung des Klassenladers, um die Klasse aus dem Klassenpfad zu finden und zu laden.

    
Bhushan Bhangale 24.07.2009, 06:16
quelle
2

Jar-Dateien sind eine Form von Zip-Dateien.

Wie diese behandelt werden, hängt stark von JRE ab.

Alte Versionen der Sun JRE, die zum Speichern der gesamten Datei verwendet wurden. Dies würde logischen Speicher zuordnen, aber nicht notwendigerweise dazu führen, dass irgendwelche der Daten von der Platte geladen werden. (32-Bit-Windows ist im Allgemeinen nicht in der Lage, 3 GB zusammenhängenden Speicher zuzuweisen, obwohl Sie dies auf anderen Betriebssystemen tun können).

Ich glaube, das aktuelle Verhalten besteht darin, das zentrale Verzeichnis auf der Rückseite der Datei unter Windows zu speichern. Unter anderen Betriebssystemen wird es nur gelesen. Dies wird von #define s in der Quelle gesteuert.

JDK7 wird wahrscheinlich etwas anderes tun.

Klassen werden im Allgemeinen träge geladen. Ressourcen werden jedes Mal neu gelesen. java.util.ResourceBundle Caches.

    
Tom Hawtin - tackline 24.07.2009 11:56
quelle
1

Es hängt vollständig von JVM und Classloader ab. Die JVM-Spezifikation spezifiziert die Klasse, sollte erscheinen um bei ihrer ersten aktiven Verwendung geladen zu werden. Klassenlader können einige der Klassen früher laden, als dies in Erwartung erforderlich ist. In Wirklichkeit verzögern die meisten Klassenlader das Laden so lange wie möglich.

    
prasadvk 24.07.2009 10:40
quelle
0

Der Standardklassenlader lädt nur das, was er benötigt, wenn er benötigt wird. Wenn Sie in Ihrem CLASSPATH eine 10-MB-JAR-Datei haben und nur eine CLASS-Datei benötigt wird, lädt die JVM diese Klasse erst, wenn der Code zum ersten Mal versucht, darauf zuzugreifen. Der .class Bytecode geht in den Permraum.

Es ist "steuerbar" in dem Sinne, dass Sie Ihren eigenen Klassenlader schreiben können, aber dafür braucht es einige Fachkenntnisse.

    
duffymo 24.07.2009 09:59
quelle

Tags und Links