2013-05-28 105 views
0

工藝的問題:新的JVM或者每個選項卡

我有滋生「客戶」一個JTabbedPane中。每個客戶端都是使用URLClassLoader從jar文件加載的applet實例。所以基本上,每個Tab都包含一個遊戲小程序。

每次標籤產生時,任務管理器都會顯示正在使用的內存量增加。這很好。但是,當選項卡關閉時,該小程序會停止並被銷燬,但根據任務管理器的內存使用情況仍然相同。

我試着調用System.gc,這是不能保證的,而且什麼也不做!我試着將所有對小程序的引用都置零,但那也什麼都不做。

我的解決方案,如果可能的:

每個標籤都有自己的JVM /工藝運行遊戲。當一個Tab被關閉時,applet會停止,銷燬,並且進程/ JVM使用的內存將被返回給操作系統,因爲進程/ JVM已經死了?

我該怎麼做這樣的事情?是否有可能讓我的JTabbedPane中的每個Tab運行Jar或創建一個新的JVM來運行它?

如果不是,我如何清除關閉的所有選項卡的內存?

+0

爲每個選項卡分配自己的JVM聽起來像是不必要的複雜性。也許你有內存泄漏,也許你沒有。不能保證JVM-per-tab實際上可以解決這個問題。如果首先驗證你真的有內存泄漏,然後找到它並修復它? –

+0

JVM-per-tab對我來說聽起來很麻煩:你確定你正在解決一個實際存在的問題嗎? –

+0

但我確實驗證過。沒有泄漏:S我關閉了所有的文件,所有的URLClassLoaders,在調用stop和destroy之前的所有內容。之後,我刪除了所有引用。然而,只要Frame在屏幕上,內存仍然在使用中:S。我使用netbeans分析器。只要我關閉一個選項卡,然後按netbeans GC按鈕,內存使用已不存在..我在我的應用程序中手動執行此操作,不起作用。 – Brandon

回答

2
  1. 首先,使用正確的工具進行工作。進程管理器不知道關於JVM的任何事情,它管理着它自己的內存。下載 最新版本的VisualVM並安裝VisualGC插件。檢查 實際發生的是什麼,而不是用Process Manager進行猜測。如果您確實沒有收回內存,請使用VisualVM中的 內存分析器或Plumbr等工具。

  2. 不要擔心內存,除非第1步顯示內存泄漏:)如果您在內存受限系統上,請設置適當的Xmx值。另外,最新的Oracle JRE包含一個G1GC垃圾收集器選項。當您的應用程序不再需要大堆時,此GC將自動減小堆大小。嘗試使用(至少)這些選項運行你的應用程序:

    • -XX:+ UseAdaptiveSizePolicy
    • -XX:+ UseAdaptiveGCBoundary
    • -XX:+ UseCompressedOops
    • -XX:+ UseG1GC

祝你好運!

+0

沒有任何幫助,但我會接受這個我猜無論如何,我猜..該探查器不顯示任何泄漏或任何錯誤。那麼我將不得不弄清楚如何自己生成一個JVM。 – Brandon

+0

您是否嘗試過JVM選項?在幾次不需要額外內存的GC之後,它們應該使JVM將內存釋放到操作系統。 –

+0

嘗試每一個單獨和組合和渾身解數: http://pastebin.com/7M2mam1D 仍然沒有..:l感謝您的答覆。 – Brandon

相關問題