2012-08-02 68 views
1

我有這將倒在幾個小時內,日誌顯示如何跟蹤Java中的內存泄漏?

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

需要分析堆轉儲以找出內存泄漏的根本原因。

有像jhat和jprofiler等工具,將用於分析堆轉儲。

2

有很多Java應用程序的cpu和內存使用情況監視工具。例如,在JDK 1.6中,您可以找到jvisualvm分析工具。另外還有Sun Profiling Studio,其中包括collect命令,可以使用-j選項(請參閱文檔以瞭解詳細信息)。

P.S.collect命令提供了很多樂趣 - 它可以顯示實際執行的彙編代碼。