2016-07-29 40 views
0

我正在學習OSGi,因爲它現在變得很流行了幾天。我使用Linux作爲我的操作系統和OpenJDK作爲開發環境。我在OSGi equinox framwork中創建了幾個bundle A,B,C ..等等。OSGi內存清理

我使用以下命令運行OSGi框架:

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

現在我安裝並啓動在OSGi控制檯A,B,C ...等束。使用Linux頂部命令我觀察到存儲器和CPU利用率如下:

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 

我觀察到我的束的一個說B在引起高的存儲器利用率。我從OSGi中卸載了軟件包B,並再次檢查了內存使用情況。我發現了相同的結果,CPU使用率或內存使用率都沒有變化。

我重新啓動,而不捆B OSGi框架,然後我發現下面的統計

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

所以在此之後我才知道捆B,卸載從OSGi的,直到我重新啓動並沒有更新的內存或CPU使用率OSGi框架。

所以有人可能會建議我,在OSGi中卸載軟件包後如何清理內存。

+1

關閉它時插入B是什麼?你的「停止」方法如何? – TMichelsen

+0

@TMichelsen我在插件B中執行一些數據庫操作。當我停止B時,我也關閉了數據庫連接和其他資源。 private void closeConnection()拋出SQLException if(sqlConnection == null || sqlConnection.isClosed()){ return; } sqlConnection.close(); sqlConnection = null; 運行時r = Runtime.getRuntime(); r.freeMemory(); r.gc(); } – Raj

+0

sqlConnection = DriverManager.getConnection(ConfigurationConstants.DATABASE_NAME);這一行導致高內存使用率。我正在使用sqlite數據庫。 – Raj

回答

0

卸載軟件包將阻止其他軟件包連接到它(類加載器管理),但它不會從內存中卸載現有實例或停止這些類中的活動。 要卸載實例,這是正常的Java垃圾收集過程;您需要確保應用程序中沒有其他任何內容持有對該實例的引用,然後垃圾回收器將釋放該實例使用的資源。

+0

我檢查過,我將所有的引用設置爲null當bundle是停止。 – Raj

+0

在這種情況下,您最好的辦法是進行堆轉儲並找出捆綁中的類的實例。像Eclipse Memory Analyzer這樣的工具對此非常有用。 (它引用的是您擔心的那個包加載的類的實例,而不僅僅是對包對象的引用。) –

+0

您的JVM垃圾收集器也可能選擇不縮小堆大小(您在命令行上看到的內容)即使佔用率較低,也是因爲CPU優化的原因。 –