簡體   English   中英

Linux服務器用盡了Java內存

[英]Linux server runs out of java memory

尋找解決方案或一些技巧,以找出問題所在。

使用VisualVM工具查看堆轉儲,該工具僅顯示引用被保留。 我可以使用更好的工具嗎? 我可以從命令行運行以釋放這些引用嗎? 使用jconsole GC無效,只能將鎖定延長約5天。

Linux服務器每10-14天獲得以下Java OOM:

Apr 18, 2012 1:34:55 PM org.apache.jk.core.MsgContext action
WARNING: Error sending end packet
java.net.SocketException: Broken pipe
    at java.net.SocketOutputStream.socketWrite0(Native Method)
    at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)
    at java.net.SocketOutputStream.write(SocketOutputStream.java:153)
    at org.apache.jk.common.ChannelSocket.send(ChannelSocket.java:508)
    at org.apache.jk.common.JkInputStream.endMessage(JkInputStream.java:112)
    at org.apache.jk.core.MsgContext.action(MsgContext.java:293)
    at org.apache.coyote.Response.action(Response.java:182)
    at org.apache.coyote.Response.finish(Response.java:304)
    at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:204)
    at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:282)
    at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:744)
    at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:674)
    at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:866)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
    at java.lang.Thread.run(Thread.java:636)
Apr 18, 2012 1:34:55 PM org.apache.jk.common.ChannelSocket processConnection
WARNING: processCallbacks status 2
java.lang.OutOfMemoryError: Java heap space
Dumping heap to java_pid20051.hprof ...
Heap dump file created [1147163590 bytes in 149.230 secs]
Apr 18, 2012 1:59:14 PM ServerCommunicatorAdmin reqIncoming
WARNING: The server has decided to close this client connection.
Apr 18, 2012 1:59:14 PM ServerCommunicatorAdmin reqIncoming
WARNING: The server has decided to close this client connection.

如果修復緩慢的混亂雜物確實沒有幫助,您可以考慮微調VM,請查看VM args(運行java -X )。 也許其中一些對您來說很有趣(但可能只會延長沒有OOM異常的時間):

-Xms設置初始Java堆大小
-Xmx設置最大Java堆大小
-Xss設置Java線程堆棧大小
-Xprof輸出cpu分析數據

使用-Xmx設置最大堆大小,並使用-Xss設置線程堆棧大小。 要記住的重要一點是,如果創建大量線程,則應設置盡可能小的堆棧大小,以最大化可以擁有的線程數(嘗試創建線程時會出現OOM錯誤,並且堆棧空間不足)。 而且堆越大,線程堆棧的空間就越少。 因此,您可能需要做一些實驗以在堆和堆棧之間獲得最佳分配。

我使用具有1Gb內存的Linux服務器(現在已經有幾年了,但是仍然很愉快),使用256M的堆和64K的每個線程(-Xmx256m -Xss64k)進行了很好的管理。 您還應該嘗試使用名為-XX:+ HeapDumpOnOutOfMemoryError的標記,並使用JMX獲取.hprof轉儲,可以使用Eclipse內存分析器進行分析,以查看是否存在內存泄漏。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM