我们有一个处理大量数据的Java批处理程序。
处理完这些数据后,为什么JVM不立即清除垃圾而不是等待下一次执行?
根据我观察到的情况,上次运行的数据保持不变,直到我手动关闭JVM或下一次计划的运行开始。
我希望JVM立即清除数据,以便在下次计划运行时,它不必在运行期间并行清除垃圾,希望运行得更快。
感谢您的帮助。
非常感谢您的快速回复。
由于内存中存在垃圾,我真的没有看到对我的进程产生相当大的性能影响。 但是,它一直在吞噬系统RAM并影响到JVM之外的其他程序的内存可用性。
我遇到的另一个问题是,在开发和调试这个程序的过程中,程序运行时我让它运行但是一旦完成,分析结果,我必须打开一些显然需要一点RAM的其他应用程序但是JVM不会放弃RAM空间,除非我停止它,影响其他程序的可用性和性能。
答案 0 :(得分:2)
JVM的GC非常高效,并且要让它“更高效”并不容易。除非您遇到严重的性能问题,否则我不会尝试做任何事情。
如果您遇到严重的性能问题,您应该考虑其他可能性,主要是您的代码。它几乎从不GC。
话虽如此,我的实际建议是看看某些内容是否保留了对数据的引用。如果参考仅通过下一次运行清除,则说明症状。您是否拥有线程与GC资格无关。重要的是你是否有数据的实时参考。
答案 1 :(得分:1)
您无法强制垃圾收集器运行。您几乎不建议JVM使用System.gc()
运行它。此外,最近的JVM已经针对内存管理进行了相当优化,所以在自己调用System.gc()
之后不要指望有任何大的改进。
答案 2 :(得分:0)
JVM使用gc策略运行垃圾收集器。几乎所有GC都在分配失败时发生。你可以调用System.gc();但这种方式不推荐。
答案 3 :(得分:0)
如果您认为它可能会影响其他应用程序,那么为JVM分配大内存并不是一个好主意。可以根据jvm版本和使用的gc选项调整GC选项。 jvm可能正在运行默认的串行收集器,这对于更大的堆大小不是一个好的选择。看一下同时执行垃圾收集的并发标记扫描收集器。 http://docs.oracle.com/javase/8/docs/technotes/guides/vm/cms-6.html
如果使用1.7
,请查看g1垃圾收集器最重要的是确保在代码中释放不需要的对象,并且没有内存泄漏。