2016-07-29 42 views
0

Ich lerne OSGi, wie es jetzt ein Tag populär wird. Ich verwende Linux als mein Betriebssystem und OpenJDK als Entwicklungsumgebung. Ich habe einige Bündel A, B, C .. usw. in OSGi-Tagundnachtgleiche framwork erstellt.Speicherbereinigung in OSGi

Ich betreibe Rahmen OSGi unter Befehl:

java -jar osgi-3.10.0-v20140606-1445.jar -console 

jetzt habe ich installiert und gestartet A, B, C .. etc Bündel in OSGi-Konsole. Linux-Top-Befehl habe ich Speicher und CPU-Auslastung beobachtet, wie unten:

PID PPID USER  STAT VSZ %VSZ %CPU COMMAND 
1972 422 root  S  368m 74% 3% java -jar osgi-3.10.0-v20140606-1445.jar -console 

ich beobachtete, dass einer meines Bündel sagt B hohe Speicherauslastung verursacht wurde. Ich habe das Bundle B von OSGi deinstalliert und erneut die Speichernutzung überprüft. Ich habe das gleiche Ergebnis gefunden, ohne dass sich die CPU-Auslastung oder die Speichernutzung geändert hat.

neu gestartet ich die OSGi-Framework ohne Bündel B dann fand ich die unten

Statistiken
1972 422 root  S  214m 43% 0% java -jar osgi-3.10.0-v20140606-1445.jar -console 

So, nachdem das ich, dass die Deinstallation des Bündel B zu wissen, kam von OSGi nicht auf den Speicher oder die CPU-Auslastung zu aktualisieren, bis ich neu starten das OSGi-Framework.

so kann mir jemand vorschlagen, wie kann ich den Speicher nach der Deinstallation von Bundles in OSGi reinigen.

+1

Was hat PlugIn B, wenn Sie es schließen? Wie ist deine Stop-Methode? – TMichelsen

+0

@TMichelsen Ich führe eine Datenbankoperation in Plugin B durch. Wenn ich B gestoppt habe, schließe ich die Datenbankverbindung und andere Ressourcen. private void closeConnection() löst SQLException { if (sqlConnection == null || sqlConnection.isClosed()) { return; } sqlConnection.close(); sqlConnection = null; Laufzeit r = Runtime.getRuntime(); r.freeMemory(); r.gc(); } – Raj

+0

sqlConnection = DriverManager.getConnection (ConfigurationConstants.DATABASE_NAME); Diese Zeile verursacht die hohe Speicherauslastung. Ich benutze SQLite Datenbank. – Raj

Antwort

0

Durch das Deinstallieren eines Bundles wird verhindert, dass andere Bundles mit ihm verbunden werden (Class Loader Management), jedoch werden vorhandene Instanzen nicht aus dem Speicher entladen oder die Aktivitäten in diesen Klassen gestoppt. Um eine Instanz zu entladen, ist dies der normale Java-Speicherbereinigungsprozess. Sie müssen sicherstellen, dass nichts anderes in Ihrer Anwendung einen Verweis auf die Instanz enthält, und dann wird der Garbage Collector Ressourcen freigeben, die von der Instanz verwendet werden.

+0

Ich habe überprüft, ich setze alle Referenzen auf Null, wenn Bündel ist gestoppt. – Raj

+0

In diesem Fall ist es am besten, einen Heap-Dump zu erstellen und herauszufinden, was an Instanzen der Klassen im Bundle festhält.Ein Tool wie Eclipse Memory Analyzer ist dafür hervorragend geeignet. (Es bezieht sich auf Instanzen der Klassen, die von diesem Bundle geladen wurden, und nicht auf Verweise auf das Bundle-Objekt.) –

+0

Ihr JVM-Garbage Collector kann auch auswählen, die Größe des Heapspeichers nicht zu verkleinern (was Sie in der Befehlszeile sehen). auch wenn die Belegung niedriger ist, für sehr gute CPU-Optimierungsgründe. –