2013-01-23 40 views
0

我可以強制運行Java應用程序從垃圾收集從控制檯?我可以強制運行Java應用程序從控制檯垃圾收集

只是爲了搶佔一些回覆:

  • 我知道我可以JVisualVM做,但我只有控制檯訪問不 X-Windows訪問
  • 我知道的System.gc()只要求垃圾收集它並沒有強制 它,但那似乎3.工作,所以我尋找一種方式呼籲 externaly。
  • 我知道你不應該垃圾收集工作應用程序,我做 這是檢查潛在內存泄漏的過程的一部分。
  • 應用在生產中runinng我不能修改其 管環境,JVM ecetera
+0

你有沒有看到這個? http://stackoverflow.com/questions/1481178/forcing-garbage-collection-in-java –

+0

要檢查潛在的內存泄漏,您還必須查看收集後使用了多少內存。對於這個VisualVM是最簡單的,所以使用它。 –

+1

[Duplicate](http://stackoverflow.com/questions/3523837/how-do-you-force-garbage-collection-from-the-shell)詳細介紹瞭如何做到這一點。 –

回答

2

JVisualVM可以連接到遠程進程,如果

  • 相關的端口是開放的
  • java程序啓動時使用正確的參數,以允許遠程連接

所以你並不需要在在同一臺機器上的xWindows環境使魔法發生...

示例或參數傳遞給java

-Dcom.sun.management.jmxremote.port=9005\ 
-Dcom.sun.management.jmxremote.authenticate=false\ 
-Dcom.sun.management.jmxremote.ssl=false 
+0

請注意,上述參數會打開一個巨大的安全漏洞,所以不要在生產環境中運行該漏洞! – demaniak

+0

應用程序已經運行沒有一個簡單的控制檯的替代? –

+0

也許看看[jmxterm](http://wiki.cyclopsgroup.org/jmxterm) - 本質上你正在尋找一個基於控制檯的JMX客戶端 – demaniak

1

號。你不能強迫垃圾收集器執行垃圾收集。使用System.gc(),您只能請求垃圾回收器執行垃圾回收。

+0

你顯然沒有讀過我的第二點。 –

-1

考慮使用Oracle JRockit JVM運行您的程序。在那裏,您可以使用JRCMD併發出JVM級別的管理命令/監視,包括強制GC。這是正確的,(在JRockit和其他地方),System.gc()做不是必然做什麼

+0

嗨,「-1」,謹慎解釋爲什麼你覺得這不是一個答案? – mgaert

+0

這是生產中的應用我無法開始修改環境。 –

+0

然後請確保您的問題是準確的,而不是downvoting。對於初學者,請解釋「控制檯」的含義。 「JConsole」,大概是這樣,但我們最好不要在這裏做出假設,對吧? – mgaert

2

實際上,來自JDK的jmap工具將觸發完整的GC。試試jmap histo

+0

在我們的JVM上,它似乎只有在運行jmap histo時纔會觸發完整的GC:live。 –