jvm垃圾回收——功效学

来源:互联网 发布:iis ip地址和域名限制 编辑:程序博客网 时间:2024/04/29 21:32
http://docs.oracle.com/javase/1.5.0/docs/guide/vm/gc-ergonomics.html

转载请注明出处,多谢。

 

这些变化J2SE5.0开始有效。(同样适用于java6

1       

server-class机器(至少2CPU同时至少2G物理内存)上运行serverVM模式,回收器自动从串行(-XX:+UseSerialGC) 变成并行(-XX:+UseParallelGC)。你也可以通过命令行-XX:+UseSerialGC改回来。

2       

server-class机器上使用并行GC,无论client或者server模式,初始堆大小和最大堆大小如下变化:

初始堆大小:

大于1/64物理内存或者合理的最小值(Larger of 1/64th of the machine's physical memory on the machine or some reasonable minimum.)在J2SE 5.0z之前默认初始堆大小是合理的最小值,并且不同平台值不同。可以用-Xms改动。

堆最大值:

小于1/4物理内存或者1GB。在J2ES 5.0之前默认只是64MB。你可以用-Xmx改动。

 

注意:边界值和分数值在J2SE5.0适用。很可能在以后的版本中不同,由于计算机变得更强大。

3       

平行垃圾回收器(UseParallelGC) 抛出out-of-memory异常,如果在小数量堆上收集而花费过多的时间。为了避免异常,你可以增加堆大小。你也可以设置参数-XX:GCTimeLimit=time-limit-XX:GCHeapFreeLimit=space-limit :(译者:到达限制会抛出oom

 

time-limit:垃圾回收时间占整体时间的上限百分比(默认98)

space-limit:可用区域占堆最大值的百分比(默认2

4       

-XX:+UseAdaptiveSizePolicy-XX:+UseParallelGC收集器下默认使用,已经变成考虑一下三个目标:

1最大GC暂停时间需求

2应用吞吐量目标需求

3最小覆盖(foorprint)

按照一下顺序:

1如果GC暂停时间大于暂停目标,减少代大小完成目标。

2如果暂停时间合适,考虑应用吞吐目标。如果应用吞吐量目标不合适,增加代大小,完成目标。

3如果以上都合适,减少代大小,来减少GC所需的覆盖面(foorprint)

标记

-XX:MaxGCPauseMillis=nnn

告诉虚拟机需要nnn毫秒或者以下的暂停时间。VM将会调正堆大小和其他GC相关参数,试图保持GC触发(GC-induced)暂停时间比nnn毫秒短。注意,这可能引起VM减少吞吐量,在某些情况下,VM不能满足暂停时间需要。

默认没有暂停时间目标。如何很好的满足暂停时间目标有一定的局限性。GC暂停时间依赖于堆中活着对象的数量,次GC和主GC的依赖方式也不同。所以小心使用这个参数。太小的值可能引起系统花费大量时间再GC上。

 

-XX:GCTimeRatio=nnn

告诉虚拟机回收器花费的时间,不要超过应用执行时间的1/1+nnn)。例如-XX:GCTimeRatio=19是设置GC时间是整个时间的5%,吞吐量是95%。应用时间是垃圾回收的19倍。

默认值是99,意味着应用至少是垃圾回收的99倍。也就是,垃圾回收不要超过整体时间的1%。这对于服务器应用是个好的选择。值太大会引起堆大小增长到最大值。

建议策略

不要选择堆的最大值,除非你知道你的堆比默认最大值大。选择吞吐量对于你的应用足够了。

 

在理想情况,堆会增长到一个值(比最大值小)来支持选择的吞吐量。

 

如果堆涨到最大值,吞吐量不还没有达到。尽可能大的设置堆,但是不要大于物理内存;再执行应用,如果吞吐量仍然不能达到,它对于可用内存(译者:需要加内存了)过高了。

 

如果吞吐量可以达到,但是暂停时间太长,设置一个暂停时间目标。这很可能意味着你的吞吐量目标达不到了,所以暂停时间值应该是可以让应用达到一个合适的平衡。