如何跟踪Java中的内存泄漏?

时间:2012-08-02 21:56:37

标签: java debugging memory-leaks

我的代码会在几个小时后停止,日志显示

java.lang.OutOfMemoryError: GC overhead limit exceeded
        at java.io.FileDescriptor.<init>(FileDescriptor.java:62)
        at sun.nio.ch.ServerSocketChannelImpl.accept(ServerSocketChannelImpl.java:217)
        at org.jboss.netty.channel.socket.nio.NioServerSocketPipelineSink$Boss.run(NioServerSocketPipelineSink.java:235)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
        at java.lang.Thread.run(Thread.java:722)

如何跟踪这样的问题?有什么工具可以帮忙吗? 堆栈没有指向代码中的任何行。

3 个答案:

答案 0 :(得分:3)

需要分析堆转储以找出内存泄漏的根本原因。

jhat和jprofiler等工具,它们将用于分析堆转储。

答案 1 :(得分:2)

有许多用于Java应用程序的cpu和内存使用情况监视的工具。例如,在JDK 1.6中,您可以找到jvisualvm分析工具。还有Sun Profiling Studio,其中包含collect命令,可以与-j选项一起使用(有关详细信息,请参阅文档)。

P.S。 collect命令提供了很多乐趣 - 它可以显示实际执行的汇编代码。

答案 2 :(得分:0)

您有很多选择可以解决您的麻烦。这是免费的监控工具,请参阅此