【问题标题】:memory leak issue in code代码中的内存泄漏问题
【发布时间】:2014-04-29 07:34:01
【问题描述】:

我正在开发一个应用程序,我的代码出现内存不足错误。我看不到代码的内存利用率。所以我很困惑。

另外,经过我的小分析,我知道在该类的构造函数中有私有静态对象正在创建 &。正在创建更多对象。并且该类是多线程的..

所以我想知道,因为静态对象不会被垃圾收集。所有与构造函数相关的对象都不会被垃圾收集吗??

【问题讨论】:

  • 将静态成员作为设计的一部分不一定是“坏事”,这取决于它的使用方式。你能发布可疑的代码吗? VisualVm 也值得熟悉,它可以让您分析代码中对象的生命周期等等。
  • 此外,您将在 oom 上获得堆转储,您可以使用 VM 参数“-XX:+HeapDumpOnOutOfMemoryError”进行分析。见oracle.com/technetwork/java/javase/tech/…

标签: java multithreading memory-leaks


【解决方案1】:

仅在卸载类时才收集静态引用,并且仅在不再使用类加载器时才会发生这种情况。如果您没有多个类加载器,则可能永远不会卸载它(直到您的程序停止)

但是,仅仅因为一个对象曾经被静态引用并不会改变它的收集方式。如果您有一个对象的静态引用,但不再有对该对象的引用,它将照常被收集。

拥有多个线程会使查找错误变得更加困难,但这也不会改变收集对象的方式。

您需要对您的应用程序进行内存转储,并查看内存在增加的原因。您保留的对象可能都是需要的。在这种情况下,您需要

  • 减少内存需求
  • 增加您的最大内存。

【讨论】:

    【解决方案2】:

    您可能没有内存泄漏 - 您可能只是超过了系统可以提供的可用 RAM 量。 您可以添加几个 JVM 参数来限制分配给运行时环境的 RAM 大小,并控制垃圾收集器 - 权衡是它通常会消耗更多 CPU。

    【讨论】:

      【解决方案3】:

      你说你看不到内存使用情况?

      您是否尝试过使用 JVisualVM(在 $JAVA_HOME/bin/jvisualvm 中) 它应该能够附加到本地进程并进行堆转储。

      另外,Eclipse Memory Analyzer 有一些很好的报告供后续分析

      【讨论】:

      • 这是所有时间运行的应用程序。我无法在本地运行它
      • 你无法登录机器?如果应用程序启用了远程 JMX(如果没有明确完成,机会很小),如果您知道服务 url,您仍然可以从工作站访问它。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-28
      相关资源
      最近更新 更多