如何选择jvm堆大小?

LB4*_*B40 24 java heap jvm

我通常对jvm堆大小做的是将max值设置得非常高,以避免臭名昭着的OutOfMemoryException.

然而,这种策略(或缺乏策略)似乎并不是很聪明.:-).

我的问题是如何选择最小值和最大值,以及两者之间的差异(最大值应该是小还是大?).例如,从这里:

如果初始堆太小,Java应用程序启动变慢,因为JVM被迫频繁执行垃圾收集,直到堆增长到更合理的大小.为获得最佳启动性能,应将初始堆大小设置为与最大堆大小相同.

谢谢.

Bob*_*oss 19

我的问题是如何选择最小值和最大值,以及两者之间的差异(最大值应该小还是大?)

简短的回答:不要猜测,描述您的应用程序.

jconsole可以为您提供有用的高级数据,例如主要驻留集的感觉与我们通常分配的垃圾数据和垃圾收集.如果你看一下显示器的内存选项卡,你会看到的通常就像锯齿一样.锯齿的下角是我通常设置堆最小值的地方,而我会使用锯齿的峰值或斜率来试验堆最大值.如果你的牙齿非常陡峭,你可能会考虑一大堆来延迟垃圾收集.但是,如果不是,则可以尝试使用较小的堆最大值来查看是否可能为计算机上的其他进程留下更多资源(例如).

您还应该将服务器VM视为会导致不同的垃圾回收行为.

总而言之,您还应该使用更详细的工具(如jvisualvm)来分析流程的内存使用情况.您可能有内存泄漏或贪婪的分配器,您可以调整或消除.这将完全改变你的堆需求.

  • @LB,没问题。我真的每天都在使用这些工具。引用自己的话:“他们不烂。” ;-) (2认同)

Jé *_*eue 5

您应该启用GC日志记录并检查OOM的开销位置.

-verbose:gc
-Xloggc:gc.log  
-XX:+PrintGCTimeStamps
-XX:+PrintGCDetails
Run Code Online (Sandbox Code Playgroud)

您可能正在经历烫发空间限制,通过调整 -XX:MaxPermSize=YYYm

无论如何回答你的问题,我从没有最低限度开始,并设置相对较高的最大值.然后我绘制gc日志图并找出我的替代状态; 在视觉上为不同代人选择高于平均水平的尺寸.像金融图表一样阅读它,你会希望看到新一代的良好传播以及终身一代的持续增长和收集.如上所述,还要绘制你的烫发空间,以确保你不会不断增加.

GC调整是一门艺术,绝不是一门科学.

  • "GC调校是一门艺术,绝不是一门科学." 史诗,我要引用你的话...... (2认同)