JVM内存分配参数

JVM内存分配参数

1、设置最大堆内存

Java堆最大堆内存可以使用-Xmx 参数指定。最大堆指的是新生代和老年代的大小之和的最大值。即堆上限。

2、设置最小堆内存

Java堆最小堆内存可以使用-Xms 参数指定。最小堆指的是JVM启动时初始化的堆内存大小。即堆下限。

通常将最大堆内存和最小堆内存设置相同的大小,因为JVM会尽可能的维护最小堆内存,所以前期会发生频繁的GC已维持最小堆内存大小,当GC后无法满足需求,则会向扩大堆内存。

3、设置新生代

 -Xmn可以设置新生代大小。由于Java堆由新生代和老年代组成,所以增大新生代会减小老年代。新生代一般设置为整个堆空间1/4到1/3左右。

4、设置方法区

方法区也叫持久代,它并不属于堆空间。使用-XX:PermSize可以设置方法区的大小,-XX:MaxPermSize可以设置方法区的最大值。

方法区的大小决定了系统可以支持多少个类定义和常量。使用CGLIB或者Javassist等动态字节码生成工具,设置合理的方法区大小有助于维持系统稳定。

通常MaxPermSize设置为64M可以满足绝大部分应用需求,如果依然出去方法区溢出,则可以调整为128M。这两个是很常用的方法区取值。如果128M还满足不了需求,通常应该考虑优化系统设计了。

5、设置线程栈

线程栈是线程的私有空间。可通过-Xss设置线程栈大小。

线程栈太小会导致线程没有足够的空间分配局部变量或达不到足够的函数调用深度,使程序异常退出。而线程栈过大,会加大线程的内存成本,减少系统支持的线程总数。系统支持的线程数大小还和堆大小有关。

6、设置堆的比例分配

6.1、新生代中eden和s0比例

-XX:SurvivorRatio可以设置eden和s0、s1空间的比例关系。

-XX:SurivorRatio=eden/s0=eden/s1。

假设-Xmn=10M,-XX:SurvivorRatio=8,则8x(eden)+x(s0)+x(s1)=10,x=1,即s0=s1=1,eden=10。

6.1、设置新生代和老年代的比例

-XX:NewRatio可以设置新生代和老年代的比例。

-XX:NewRatio=老年代 / 新生代。

堆空间=新生代+老年代

假设-Xmx=-Xms=12M、-XX:NewRatio=2M,则 新生代=12*1/3=4M,老年代=12-4=8M。

参考:

《Java程序性能优化  让你的Java程序更快、更稳定》

猜你喜欢

转载自214324070.iteye.com/blog/2380690