我们有一个处理大量数据的Java批处理程序。
在处理完这些数据之后,为什么JVM不立即清除垃圾,而是等待下一次执行呢?
根据我所观察到的,前一次运行的数据保持不变,直到我手动关闭JVM或下一次计划的运行开始。
我希望JVM立即清除数据,这样在下一次计划的运行时,它就不必在运行期间并行清除垃圾,希望运行得更快。
感谢你的帮助。
编辑:
非常感谢你的快速回复。
由于内存中存在这种垃圾,我并没有真正看到对我的进程有显著的性能影响。但是,它一直在蚕食系统RAM,并影响此JVM之外的其他程序的内存可用性。
我遇到的另一个问题是,在开发和调试这个程序期间,当程序运行时,我让它运行,但一旦完成,为了分析结果,我必须打开一些其他应用程序,这些应用程序显然需要一些RAM,但JVM不会释放RAM空间,除非我停止它,这会影响其他程序的可用性和性能。
发布于 2014-08-28 21:38:55
JVM的GC是非常高效的,要让它变得“更高效”并不容易。除非你有严重的性能问题,否则我不会尝试做任何事情。
如果你有严重的性能问题,你应该考虑其他的可能性,主要是你的代码。它几乎不是GC。
话虽如此,我的实际建议是看看是否有什么东西保留了对数据的引用。如果引用只是在下一次运行时被清除,这就解释了症状。你是否有线程与GC的资格没有任何关系。最重要的是你是否拥有对数据的实时引用。
发布于 2014-08-28 21:35:30
您不能强制垃圾回收器运行。您几乎不能建议JVM使用System.gc()运行它。此外,最近的JVM已经针对内存管理进行了很好的优化,所以在您自己调用System.gc()之后,不要期望有任何大的改进。
发布于 2014-08-28 21:39:46
JVM使用gc策略运行垃圾收集器。几乎所有GC都是在分配失败时发生的。您可以调用System.gc();但不推荐使用这种方式。
https://stackoverflow.com/questions/25550036
复制相似问题