【问题标题】:java: General approach to out-of-memory errorjava:内存不足错误的一般方法
【发布时间】:2012-04-28 20:18:36
【问题描述】:

我一直在用多个模块处理这个 Java 项目。很长一段时间以来,我偶尔会收到“java:Out Of Memory”错误!我对这个“流行”错误很陌生,想知道解决此类错误的一般方法
此外,是否有行业接受的标准工具来帮助找出此类错误的原因?
我项目中的模块包括来自第三方的每分钟轮询(使用网络服务)、多线程等等。但是,这只是一个指针,我寻求一种通用方法,而不是针对我的项目非常具体的方法。
谢谢。

【问题讨论】:

    标签: java multithreading out-of-memory polling


    【解决方案1】:

    有时您只是有一个使用大量内存的类,您需要增加堆大小或制定更节省空间的算法。其他时候是泄漏,您需要尊重对象。

    1. 运行 jvisualvm(它包含在 JDK 中)。
    2. 连接到您的进程并尝试重新创建 在关注堆大小时出现内存不足错误。
    3. 当内存变大时执行堆转储。搜索 按尺寸计算的最大物体 - 通常这会给你带来罪魁祸首 类。
    4. 查看依赖关系以查看持有引用的内容。如果是内存泄漏,请确保取消引用不需要的对象。

    【讨论】:

      【解决方案2】:

      此外,是否有行业接受的标准工具来帮助找出此类错误的原因?

      是的,有内存分析器,例如 VisualVMYourKit。我广泛使用后者,用于 CPU 和内存分析,并发现它非常有用。要了解它的功能,请查看此页面:link

      【讨论】:

        【解决方案3】:

        如果您无法增加可用内存,则必须减少消耗。

        不要保留对执行时不需要的对象的引用(例如可以动态重新加载的数据),并在必要时重新设计流程(例如,不要并行处理所有对象并按顺序执行)那时需要更少的内存。垃圾收集应该为您完成其余的工作。

        特别是如果您将大数据对象加载到内存中,请尽可能考虑使用流式处理方法。例如。如果要搜索整个文件,则无需将整个文件加载到内存中。你可以单步执行。

        除了架构问题之外,您还可能存在泄漏:保留对不再需要的对象的无意引用。由于它们被引用,垃圾收集器无法释放内存,并且您有时会耗尽内存。这可能是 OutOfMemoryExceptions 的#1 原因,它通常与 static 引用有关,因为类,因此 statics 通常不是 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>
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-02-10
              • 2014-01-04
              • 1970-01-01
              相关资源
              最近更新 更多