Linux服务器的java内存不足

Linux服务器的java内存不足,java,memory,connection,pipe,out,Java,Memory,Connection,Pipe,Out,寻找解决方案或一些如何找出问题的技巧 使用VisualVM工具查看heapdump,该工具仅显示引用被保留。有更好的工具吗?我可以从命令行运行任何东西来释放这些引用吗?使用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.So

寻找解决方案或一些如何找出问题的技巧

使用VisualVM工具查看heapdump,该工具仅显示引用被保留。有更好的工具吗?我可以从命令行运行任何东西来释放这些引用吗?使用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.

如果修复杂乱的缓慢积累确实没有帮助,您可以考虑微调您的虚拟机,请查看运行java-X的虚拟机参数。也许其中一些参数对您来说很有趣,但可能只是延长了时间,没有例外:

-Xms设置初始Java堆大小 -Xmx设置最大Java堆大小 -Xss设置java线程堆栈大小 -Xprof输出cpu配置文件数据


使用-Xmx设置最大堆大小,使用-Xss设置线程堆栈大小。需要记住的重要一点是,如果创建了大量线程,则应将堆栈大小设置为尽可能小,以最大限度地增加可拥有的线程数。当尝试创建线程时,如果堆栈空间不足,则会出现OOM错误。堆越大,线程堆栈的空间就越小。因此,您可能需要进行一些实验,以获得堆和堆栈之间的最佳分割


几年前,我使用内存为1Gb的Linux服务器做得很好,但堆内存为256M,每个线程内存为64K—Xmx256m—Xss64k,我仍然非常满意。您还应该尝试快速命名为-XX:+HeapDumpOnOutOfMemoryError标志,并使用JMX获得.hprof转储,您可以使用Eclipse内存分析器分析该转储,以查看是否存在内存泄漏。

除非您发送一些巨大的数据字符串,否则我怀疑问题在于随着时间的推移,杂乱的积累速度缓慢,不是特定的原因。我过去曾使用Eclipse内存分析器工具对OutOfMemoryErrors进行故障排除,但在我的例子中,这是因为一个对象保留了一个8GB的SQL结果对象。您可以尝试使用MAT,或者如果问题是Hot Clicks所描述的只是增加内存消耗,那么您可能必须进行实时内存监控。不过,您需要一个探查器来分析内存增长以及增长的来源。根据我在这种情况下的经验,增长的动力实际上来自一两个来源。但这在这里可能适用,也可能不适用。是的,在Java中,有一些区域的数据以某种方式被保留,这是典型的,不像C环境中可能存在数百次泄漏。但通常情况下,在你运行很长一段时间之前,这一小撮并不算太多,而重复的一小撮会形成一座山。需要某种堆分析器。您是否有可能在这里使用序列化对象流?