【问题标题】:Java: Memory cleanup after Thread executionJava:线程执行后的内存清理
【发布时间】:2014-08-28 13:30:20
【问题描述】:

我们有一个处理大量数据的 Java 批处理程序。

处理完这些数据后,为什么JVM不立即清除垃圾,而是等待下一次执行?

根据我观察到的情况,上一次运行的数据保持原样,直到我手动关闭 JVM 或下一次计划运行开始。

我希望 JVM 立即清除数据,这样在下一次计划运行时,它不必在运行期间并行清除垃圾,希望运行得更快。

感谢您的帮助。

编辑:

非常感谢您的快速回复。

由于内存中存在这种垃圾,我并没有真正看到对我的进程有相当大的性能影响。 但是,它一直在消耗系统 RAM,并影响到该 JVM 之外的其他程序的内存可用性。

我遇到的另一个问题是,在开发和调试这个程序的过程中,当程序运行时,我让它运行,但一旦完成,为了分析结果,我必须打开一些其他应用程序,这些应用程序显然需要一些 RAM,但是除非我停止它,否则 JVM 不会放弃 RAM 空间,这会影响其他程序的可用性和性能。

【问题讨论】:

  • 过于频繁地运行 GC 通常不是一个好主意,因此稍后将其保留是一个很好的折衷策略。但您可以tune the GC 采取不同的策略。

标签: java multithreading memory-management jvm


【解决方案1】:

JVM 的 GC 本来就非常高效,想要让它“更高效”并不容易。除非您遇到严重的性能问题,否则我不会尝试做任何事情。

如果您有严重的性能问题,您应该考虑其他可能性,主要是在您的代码上。它几乎从不 GC。

话虽如此,我的实际建议是查看是否保留了对数据的引用。如果仅通过下一次运行清除引用,则可以解释症状。是否有线程与 GC 资格无关。重要的是您是否对数据有实时引用。

【讨论】:

  • 需要注意的是,“实时引用”是指可以通过来自正在运行或尚未运行的线程的强引用访问的任何对象。所以有轻微的联系。
【解决方案2】:

您不能强制垃圾收集器运行。您几乎不能建议 JVM 使用 System.gc() 运行它。而且最近的 JVM 已经对内存管理进行了相当的优化,所以不要指望在自己调用System.gc() 之后会有很大的改进。

【讨论】:

    【解决方案3】:

    JVM 使用 gc 策略运行垃圾收集器。几乎所有的 GC 都发生在分配失败时。您可以调用 System.gc();但不推荐这种方式。

    【讨论】:

      【解决方案4】:

      如果您认为将大内存分配给 JVM 会影响其他应用程序,则它不是一个好主意。 GC 选项可以根据 jvm 版本和正在使用的 gc 选项进行调整。 jvm 可能正在运行默认的串行收集器,这对于更大的堆大小来说不是一个好的选择。看看并发标记扫描收集器,它同时执行垃圾收集。 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/cms-6.html

      如果使用 1.7,请查看 g1 垃圾收集器

      最重要的是确保在代码中释放不需要的对象并且没有内存泄漏。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-29
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        • 2011-09-29
        • 2017-02-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多