堆内存行为

Pet*_*Mmm 6 java memory-management

我总是对堆内存行为有疑问.

分析我的应用程序我得到上面的图表.好像很好.但我不明白为什么,在GC时间,堆长痘痘位,即使有足够的内存(红圈).

这意味着对于一个长期运行的应用程序,它将在一段时间内耗尽堆空间?

替代文字

And*_*yle 6

不必要.垃圾收集器可以以其认为合适的任何方式自由使用最大分配堆.根据当前行为推断未来的GC行为(但具有不同的内存条件)绝不能保证准确.

这确实有一个令人遗憾的副作用,即确定是否发生OutOfMemoryError是非常困难的.一个合法的(但可能非常低效)垃圾收集器可能只是在内存上限被击中之前什么都不做,然后做一个停止世界的标记并扫描整个堆.通过这个实现,你会看到你的记忆不断增加,并且可能会想要说OOME即将来临,但你无法分辨.

如此小的堆大小,这里的增加可能只是由于簿记/缓存大小对齐等.你说的是在规模上看不到50KB左右的分辨率,所以我不应该担心.

如果您确实认为存在OutOfMemoryErrors的合法风险,则表明这一点的唯一方法是将压力测试放在一起并显示应用程序确实耗尽了堆空间.

  • 除了Andrzej语句之外,当JVM必须分配更多的堆空间时,它可能会对系统造成缓慢/负担.如果您有一个您知道应用程序将运行的舒适级别,那么设置一些启动参数可以防止这种增长.对于原始案例,你似乎让GC在18mb左右.该图表显示您从大约4mb的堆分配开始,并将在20mb标记附近工作.只需在程序启动时设置-Xms32mb和-Xmx32mb标志即可.现在,您的JVM无需为您分配更多堆. (3认同)