2015-12-11 45 views
2

你好親愛的開發夥伴,Java堆內存使用波動

我在我的java應用程序中遇到了堆內存使用問題。 應用本身只是接受套接字連接

主線程我有以下腳本沒有更多(除了靜態的ExecutorService實例):

ServerSocketFactory serverFactory = ServerSocketFactory.getDefault(); 
ServerSocket server = serverFactory.createServerSocket(Configuration.port); 
for(;;) 
{ 
    Socket client = server.accept(); 
    Configuration.getExecutor().submit(new Client(client)); 
} 

當應用程序正在運行,它應該直到有人被阻止連接環... 這意味着我的主線程在等待狀態的大部分時間......

的問題是:當沒有一個連接到我的服務器,堆內存使用量的波動(見下圖) 這意味着有內存泄漏?沒有?或者它是Java應用程序如何運行的自然方式?

JConsole

在此先感謝...

+2

如果發生內存泄漏,則使用量會增加**。 – Kayaman

+1

只是看起來像正常的GC活動給我。您可以使用各種JVM參數調整GC策略的攻擊性,但這看起來很正常。我只會繼續前進。 –

+0

感謝您澄清@Kayaman :) – JavaMachine

回答

1

如果您使用visualvmjconsolejmc來監視堆使用情況,它會使用RMI和JMX,這會造成相當多的垃圾。即您的監控正在執行此操作。

順便說一句,即使你有一個簡單的程序

System.in.read(); 

這些工具將顯示垃圾正在創建,而不是由你的程序。

我建議你嘗試改用

jps -lvm 

得到的進程ID或pid

jstat -gccause {pid} 10s 

監視內存的使用情況。這也會產生少量的垃圾。

+0

Peter,您不建議在這種情況下使用基於JMX/RMI的監控應用程序嗎? –

2

它看上去就像是越來越垃圾收集。請記住,在具有現實數量的主存儲器的計算機上,該斜率將顯示爲小千倍。我不認爲這值得擔心。

3

您的內存使用量在0到20MB之間波動,不會增加。沒有內存泄漏或任何理由爲什麼你應該注意這一點。