应采用哪些策略来确保JVM内存管理始终快速?
我通过Timer#scheduleAtFixedRate()
每隔10秒定期运行一个方法,并且周期性方法通常需要5到50毫秒,但偶尔会长一些。除了这种定期方法,应用程序没有其他任何工作要做。有时超过10秒。由于应用程序的性质不会或不应该导致经过时间的大变化,我认为可变性是由于垃圾收集。如何将垃圾收集始终保持在10秒以内?
周期性方法每隔10秒就会在图表上建立列表并绘制几个小时的点。在几个小时的结束时,它会对一直收集的所有数据进行一些二进制序列化。
我尝试使用System.gc()
结束周期性方法,但我仍然需要花费超过10秒的方法运行。在10秒运行后,它将返回到5毫秒经过时间的方法运行。然后它将逐渐变长,直到经过约10秒的时间。然后循环重复。我也见过其他模式。
您可能想知道如果方法花费的时间超过scheduleAtFixedRate()
中设置的时间段会发生什么。会发生什么是下一次调用被延迟(没有正在进行的方法的中止,也没有尝试通过使用另一个线程来坚持计划)。如果持续存在慢速运行,我估计只会出现大量积压。幸运的是,长时间运行只是偶然的,大多数只是在5到50毫秒之间。不过,我不希望这些长时间的运行,因为它们破坏了周期性。
快速解决方法是将我的时间段更改为15秒,从而确保时间段大于最差情况下的时间。这只是一种解决方法。在垃圾收集中获得一致性会好得多。
答案 0 :(得分:0)
要通过权衡效率来减少经过的时间,请在java调用命令行上使用JVM选项-Xincgc。