java:内存不足错误的一般方法
Posted
技术标签:
【中文标题】java:内存不足错误的一般方法【英文标题】:java: General approach to out-of-memory error 【发布时间】:2012-04-28 20:18:36 【问题描述】:我一直在用多个模块处理这个 Java 项目。很长一段时间以来,我偶尔会收到“java:Out Of Memory”错误!我对这个“流行”错误很陌生,想知道解决此类错误的一般方法。 此外,是否有行业接受的标准工具来帮助找出此类错误的原因? 我项目中的模块包括来自第三方的每分钟轮询(使用网络服务)、多线程等等。但是,这只是一个指针,我寻求一种通用方法,而不是针对我的项目非常具体的方法。 谢谢。
【问题讨论】:
【参考方案1】:有时您只是有一个使用大量内存的类,您需要增加堆大小或制定更节省空间的算法。其他时候是泄漏,您需要尊重对象。
-
运行
jvisualvm
(它包含在 JDK 中)。
连接到您的进程并尝试重新创建
在关注堆大小时出现内存不足错误。
当内存变大时执行堆转储。搜索
按尺寸计算的最大物体 - 通常这会给你带来罪魁祸首
类。
查看依赖关系以查看持有引用的内容。如果是内存泄漏,请确保取消引用不需要的对象。
【讨论】:
【参考方案2】:此外,是否有行业接受的标准工具来帮助找出此类错误的原因?
是的,有内存分析器,例如 VisualVM 和 YourKit。我广泛使用后者,用于 CPU 和内存分析,并发现它非常有用。要了解它的功能,请查看此页面:link。
【讨论】:
【参考方案3】:如果您无法增加可用内存,则必须减少消耗。
不要保留对执行时不需要的对象的引用(例如可以动态重新加载的数据),并在必要时重新设计流程(例如,不要并行处理所有对象并按顺序执行)那时需要更少的内存。垃圾收集应该为您完成其余的工作。
特别是如果您将大数据对象加载到内存中,请尽可能考虑使用流式处理方法。例如。如果要搜索整个文件,则无需将整个文件加载到内存中。你可以单步执行。
除了架构问题之外,您还可能存在泄漏:保留对不再需要的对象的无意引用。由于它们被引用,垃圾收集器无法释放内存,并且您有时会耗尽内存。这可能是 OutOfMemoryExceptions 的#1 原因,它通常与 static
引用有关,因为类,因此 static
s 通常不是 unloaded 在你第一次接触类之后。互联网上有很多关于查找/修复这些的文章,例如How to Fix Memory Leaks in Java
我知道的一个工具是MAT
【讨论】:
【参考方案4】:您可能有内存泄漏。找到它是一个挑战。 Netbeans 有一些工具可以帮助您分析 VM。您可以在项目运行时分析您的项目并查看男性使用情况。 Apache JMeter 也可作为插件使用,您也可以单独运行它。 JMeter.apache.org
【讨论】:
【参考方案5】:如果您经常遇到 OOM,则使用正确的选项启动 java,获取堆转储并使用 jhat 或 eclipse 中的内存分析器进行分析 (http://www.eclipse.org/mat/)
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>
【讨论】:
以上是关于java:内存不足错误的一般方法的主要内容,如果未能解决你的问题,请参考以下文章
在java中处理大字符串时StringBuilder内存不足错误