2008-11-18 3 views
5

Wenn ich nenne eine statische Methode wie:Java: `static` Methoden

Something.action(); 

Da eine Instanz erstellt wird nicht, wie lange wird die Klasse der statischen Methode im Speicher gehalten werden?

Wenn ich dieselbe Methode anrufe, wird die Klasse für jeden Aufruf neu geladen, da keine Instanz existiert?

Und werden nur einzelne statische Methoden beim Aufruf geladen oder werden alle Methoden und statischen Methoden einer Klasse in den Speicher geladen, obwohl nur eine statische Methode verwendet werden kann?

Antwort

11

Wenn Sie die Speicherbereinigung von perergenspace nicht konfiguriert haben, bleibt die Klasse im Speicher, bis die vm beendet wird. Die vollständige Klasse wird mit allen statischen Methoden geladen.

+0

Dies ist nicht streng zutreffend, obwohl es ein vernünftiges mentales Modell des Klassenladens ist. Einige VMs entladen dynamisch nicht verwendete Klassen, um die residente Speichergröße zu reduzieren. Eine solche Optimierung wird jedoch nur bei sehr lang laufenden Prozessen und nur bei VMs, die sie implementieren, ins Spiel kommen. –

4

Die Klasse bleibt im Speicher, bis der Klassenlader, der diese Klasse geladen hat, im Speicher verbleibt. Wenn also die Klasse vom Systemklassenlader geladen wird, wird die Klasse meines Wissens nie entladen.

Wenn Sie eine Klasse entladen möchten, müssen Sie:

  1. Legen Sie die Klasse und alle Klassen, die zu dieser Klasse finden Sie eine benutzerdefinierte Classloader mit
  2. Nachdem Sie mit dieser Klasse, Release getan werden alle Verweise auf die Klasse - dh sicherstellen, dass es keine Objektinstanzen dieser Klasse gibt
  3. Entladen Sie die Klasse und alle darauf bezogenen Klassen, indem Sie die benutzerdefinierte Klassenladerinstanz, die diese Klassen geladen hat, freigeben.
1

Die Etwas Klasse sollte geladen werden, wenn die Klasse Anrufer geladen wird. Und es bleibt dort bis zum Ausgang der VM, wie krosenvold sagte.

2

In einigen Konfigurationen wird die Klasse sogar geladen, bevor Sie den Anruf tätigen. Wir verwendeten BES (Borland Enterprise Server) und hatten Probleme mit unseren Solaris-Produktionsservern, wo alle referenzierten Klassen beim Start unserer Anwendung rekursiv geladen wurden. Das heißt, als die Hauptklasse unserer App geladen wurde, hat der App-Server alle referenzierten Klassen im Import-Abschnitt dieser Klasse geladen.

Als Nebenbemerkung sollten Sie sich nicht zu sehr Gedanken über die Speicherauslastung der im Speicher geladenen Klassen machen, es sei denn, Sie arbeiten in einer sehr speicherbeschränkten Umgebung oder wenn Sie viele und viele unnötige Klassen laden.

+0

Welche Probleme hatten Sie, wenn die referenzierten Klassen "vorzeitig" geladen wurden? Ich bin gespannt, was für ein Problem das wäre. –

+0

Das Problem war, dass auf dem Server und auf dem Client die gleichen Bibliotheken ausgeführt wurden. Ein Teil des Codepfads wurde nicht auf dem Server erstellt. Daher haben wir versucht, unnötige Bibliotheken zu entfernen, die nicht aufgerufen wurden. Selbst wenn der Code nicht aufgerufen wurde, stürzte die App beim Start ab. – Guillaume