Odd heap usage pattern

时间:2016-10-20 19:00:57

标签: java heap visualvm

I have a repeating process that:

  1. gets some data from the database
  2. builds some objects in memory, adding to a Collection
  3. writes the data from the Collection to a file

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.

Why does the heap size decrease at first?

Why does the used heap get so close to the heap size in the middle?

enter image description here (the ~30-second blip at 1:43 was just when VisualVM froze momentarily)

1 个答案:

答案 0 :(得分:2)

我并不像有些人那样专注于GC专家,但总体思路是,当你启动程序时,你已经给出了初始堆大小,最大堆大小和其他相关参数,然后是时间。

然而,GC具有充足的智能和不同的算法,可针对不同类型的任务进行优化。一个简单的实现只会保持堆大小静态,然后在它满了时收集垃圾。这被称为"停止世界"集合,因为收集器需要停止一切,以便它可以执行一些(或大)清理。

现代GC并不会导致长时间暂停运行程序,因为它需要清理,所以从锯齿看到的东西总是有点清理。但是当你启动一个程序时,GC不知道程序将要做什么以及它将如何使用内存。因此,必须观察发生了什么,分析内存使用情况,然后确定需要立即使用的内存量,是否需要增加当前堆大小,或者是否可以减少当前堆大小。

根据程序的行为和使用的GC算法,您可以看到许多不同的模式。只要您没有经历以OutOfMemoryError结尾的线性增长,您就应该相对安全。当然,除非您想要优化发生的事情以提高吞吐量,响应速度等,但这是一个更高级的主题,并且当您使代码按照您希望的方式工作时更具相关性。