I have a repeating process that:
All of the objects/Collections go out of scope or are set to null after each iteration. (The Collection is reused for each iteration.)
Using Java VisualVM, I see a graph that looks like this, which seems very odd considering that it's a repeating process. Yes, the data coming back from the database is different, but it's generally the same amount.
(the ~30-second blip at 1:43 was just when VisualVM froze momentarily)
答案 0 :(得分:2)
我并不像有些人那样专注于GC专家,但总体思路是,当你启动程序时,你已经给出了初始堆大小,最大堆大小和其他相关参数,然后是时间。
然而,GC具有充足的智能和不同的算法,可针对不同类型的任务进行优化。一个简单的实现只会保持堆大小静态,然后在它满了时收集垃圾。这被称为"停止世界"集合,因为收集器需要停止一切,以便它可以执行一些(或大)清理。
现代GC并不会导致长时间暂停运行程序,因为它需要清理,所以从锯齿看到的东西总是有点清理。但是当你启动一个程序时,GC不知道程序将要做什么以及它将如何使用内存。因此,必须观察发生了什么,分析内存使用情况,然后确定需要立即使用的内存量,是否需要增加当前堆大小,或者是否可以减少当前堆大小。
根据程序的行为和使用的GC算法,您可以看到许多不同的模式。只要您没有经历以OutOfMemoryError
结尾的线性增长,您就应该相对安全。当然,除非您想要优化发生的事情以提高吞吐量,响应速度等,但这是一个更高级的主题,并且当您使代码按照您希望的方式工作时更具相关性。