我有一个复杂的Java应用程序,它在大型数据集上运行。该应用程序的性能表现相当不错,但随着时间的推移,它似乎会消耗大量内存并变得越来越慢。有没有一种方法可以在不重新启动应用程序的情况下运行JVM垃圾收集器?
我有一个复杂的Java应用程序,它在大型数据集上运行。该应用程序的性能表现相当不错,但随着时间的推移,它似乎会消耗大量内存并变得越来越慢。有没有一种方法可以在不重新启动应用程序的情况下运行JVM垃圾收集器?
System.gc();
System.gc()
文档,请打开错误。System.gc()
时垃圾回收器不执行的情况(除非已明确禁用)? - NeetSystem.gc()
上执行GC的JVM。 - Neet这个标签
System.gc()
你不应该依赖于 System.gc()
- 如果你觉得需要强制运行GC,通常意味着你的代码/设计有问题。如果准备好被创建,GC会运行并清除未使用的对象 - 请验证你的设计并更多地考虑内存管理,同时查找对象引用中的循环。
首先,当程序需要3.75GB而jvm只有1GB内存时,生产者线程池完成其工作需要50秒以上,因为较少的垃圾管理导致对象创建速率较低。
第二个示例大约快了40%,因为在每个150MB对象数据的生成之间调用了System.gc()。
在第三个示例中,jvm被赋予了3GB内存空间,同时保持System.gc()开启。如预期的那样,更多的内存提供了更好的性能。
但是,在相同的3GB环境中关闭System.gc()时,速度更快!
即使我们无法强制执行,但如果我们尝试足够长的时间使用System.g(),我们仍然可以获得一些性能增益或减少。至少在我的Windows-7 64位操作系统上,使用最新的jvm。我不建议你这样做,但是如果你想在Java代码中强制运行垃圾收集器,你可以使用所有可用的内存,这是有效的,因为垃圾收集器会在JVM抛出OutOfMemoryError之前运行...
try {
List<Object> tempList = new ArrayList<Object>();
while (true) {
tempList.add(new byte[Integer.MAX_VALUE]);
}
} catch (OutOfMemoryError OME) {
// OK, Garbage Collector will have run now...
}
垃圾回收器会自动运行。你不能强制垃圾回收器。
我的答案与其他人的不同,但会导致相同的结果。
解释:
是的,可以通过同时使用两种方法并按相同顺序来强制垃圾收集器,这两种方法是:
System.gc();
System.runFinalization();
这两个方法的调用将强制垃圾收集器执行任何不可达对象的finalise()方法并释放内存。然而,软件的性能会显著下降,这是因为垃圾运行在自己的线程中,并且对于它没有控制的方式,取决于垃圾收集器使用的算法,可能会导致不必要的过度处理。最好检查您的代码,因为它必须被打破,以便您需要使用垃圾收集器以良好的方式工作。
注意:请记住,仅当在finalize方法中不存在对象的重新分配时,此方法才有效果。如果发生这种情况,则对象将保持活动状态,并且可能会出现技术上可能的复活。