我一直在用多个模块在Java上做这个项目。很长一段时间以来,我偶尔会收到"java:内存不足"错误!我对这个"流行"错误很陌生,想知道解决此类错误的一般方法。
另外,是否有业界接受的标准工具来帮助找出此类错误的原因?
我项目中的模块包括来自第三方(使用 Web 服务(的每分钟轮询、多线程等。但是,这只是一个指针,我寻求一种通用方法,而不是特定于我的项目的东西。
谢谢。
有时你只有一个使用大量内存的类,你需要增加堆大小或制作一个更节省空间的算法。 其他时候它是泄漏,您需要尊重对象。
- 运行
jvisualvm
(它包含在 JDK 中(。 - 连接到您的流程并尝试是否可以重新创建内存不足错误,同时密切关注堆大小。
- 当内存变大时执行堆转储。 搜索按大小计算的最大物体 - 通常会给你罪魁祸首.class。
- 查看依赖项以了解保存引用的内容。 如果是内存泄漏,请确保取消引用不需要的对象。
另外,是否有业界接受的标准工具来帮助找出此类错误的原因?
是的,有内存分析器,如VisualVM和YourKit。我广泛使用后者,用于CPU和内存分析,并发现它非常有用。要了解它的功能,请查看此页面:链接。
如果不能增加可用内存,则必须消耗更少的内存。
不要保留对执行时不需要的对象(例如可以动态重新加载的数据(的引用,并在必要时重新设计流程(例如,不要并行处理所有对象并按顺序处理(以在此时需要更少的内存。垃圾回收应该为您完成其余的工作。
特别是当您将大数据对象加载到内存中时,请考虑使用流式处理方法(如果可能(。 例如,如果要搜索整个文件,则无需将整个文件加载到内存中。你可以逐步完成它。
除了架构问题,您还可能存在泄漏:保留对不再需要的对象的无意引用。由于它们被引用,垃圾回收器无法释放内存,并且您在某个时候会耗尽内存。这可能是 OutOfMemoryExceptions 的 #1 原因,它通常与static
引用有关,因为类,因此在您第一次触摸类后通常不会卸载static
。互联网上有很多关于查找/修复这些问题的文章,例如 如何修复 Java 中的内存泄漏
我知道的一个工具是 MAT
您可能有内存泄漏。找到它是一个挑战。Netbeans 提供了一些工具来帮助您分析虚拟机。您可以分析项目并在项目运行时查看人员使用情况。Apache JMeter也可以作为插件使用,或者你可以单独运行它。JMeter.apache.org
如果你太频繁地得到 OOM,那么使用正确的选项启动 java,获取堆转储并使用 jhat 或 eclipse 的内存分析器对其进行分析(http://www.eclipse.org/mat/(
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=<path to dump file>