在Java中耗尽内存

时间:2013-04-08 01:53:00

标签: java memory

好的,我有内存泄漏。它最有可能出现在GUI或ExecutorCompletionService中。监控程序存储器有哪些选择?

是的,我出现内存不足错误。我在eclipse中的vm参数上设置了-XX:+ HeapDumpOnOutOfMemoryError来生成转储文件。情况是ExecutorCompletionService运行计算密集型任务的线程池。线程用gui线程发出中间结果信号。

我正在审查ExecutionController类的单元测试,并想知道我是否可以将内存监控集成到单元测试中。

关于分析选项,我上个月成功完成了这项工作,但我不记得使用的程序或专业填充程序。我打开了一个单独的窗口,监控外部运行的监视器的实时快照。我依稀记得在识别具有内存泄漏的精确类成员时遇到的一些困难,但是提供了足够的信息来解决之前的问题。

我会在不久的将来尝试建议的监控选项。

2 个答案:

答案 0 :(得分:1)

内存泄漏可能是由于超出了JVM的堆栈或堆大小。识别内存泄漏的第一步是确认是否存在内存泄漏。请尝试使用JVM命令行选项增加堆和堆栈空间。 -xmx-xss分别是增加堆和堆栈大小的选项。

一旦确认,有各种各样的工具可以帮助缩小到违规代码块以识别泄漏。我最喜欢的是在内存不足异常时转储正在运行的线程,假设它已经发生,并检查转储。请尝试java -Xrunhprof:help了解更多详情。我使用Memory Analyzer(MAT),一个用于分析转储的eclipse插件。

此外,Java Memory Extensions提供了有关如何在线程,堆和堆栈大小方面对运行的JVM进行内省的详细信息。如果您使用的是JDK 1.6及更高版本,它附带visual vm,这是一个用于帮助实现此目的的分析工具。

答案 1 :(得分:0)

从JDK 6开始,名为jvisualvm的分析工具包含在\bin目录中。您可以扫描CPU使用情况,监视内存和线程等。

您可以详细了解here