【问题标题】:Running out of memory in Java [duplicate]Java中的内存不足[重复]
【发布时间】:2013-03-30 00:04:12
【问题描述】:

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

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

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

关于配置文件选项,我上个月成功完成了这项工作,但我不记得使用的程序或专业填充物。我打开了一个单独的窗口并从外部运行的监视器监视实时快照。我依稀记得在确定发生内存泄漏的确切类成员时有些困难,但提供了足够的信息来解决前面的问题。

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

【问题讨论】:

  • 您可以将分析器附加到 java 进程和监视器中
  • 请提供更多细节。你收到OutOfMemory 错误吗?
  • @PM77-1 - 大概是的。但并不真正相关。他不希望我们真正帮助他解决问题。他希望我们告诉他如何自己解决问题。
  • 我最终使用 Jconsole 来监控内存,并在代码中设置了中断来运行部分代码。在视觉上增加记忆时点击暂停也很有帮助。罪魁祸首是导致无限递归循环的一系列 toString 成员。

标签: java memory


【解决方案1】:

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

您可以阅读更多关于它的信息here

【讨论】:

  • 我最终使用 Jconsole 来观察内存,并在代码中设置了中断。在内存突然增加时按暂停有点帮助。在这种情况下,原因是由多个 toString 成员设置的无限递归循环。
【解决方案2】:

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

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

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

【讨论】:

  • 我确实增加了最大和最小堆大小,但这并没有太大帮助。评估了更多的密集任务。我将在不久的将来查看内存转储。我使用的是 1.7,所以如果需要,我可能会查看内存扩展。
猜你喜欢
  • 2014-03-05
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2013-03-14
  • 2013-10-23
  • 2012-06-21
  • 2013-09-10
  • 2012-12-12
相关资源
最近更新 更多