1、Xmn合理设置的重要性

**
如果把新生代内存设置得太大会导致young gc时间较长。一个好的Web系统应该是每次http请求申请内存都能在young gc回收掉,full gc永不发生,当然这是最理想的情况,xmn的值应该是保证够用(够http并发请求之用)的前提下设置得尽量小。但是,太小的话,在应用处理数据很频繁的情况下,导致年轻代很快就满了,频繁执行young gc。

2、基本参数

java jvm 老年代年轻代 jvm设置老年代大小_java

(1)控制参数:
-Xms设置堆的最小空间大小。
-Xmx设置堆的最大空间大小。
-XX:NewSize设置新生代最小空间大小。
-XX:MaxNewSize设置新生代最大空间大小。
-XX:PermSize设置永久代最小空间大小。
-XX:MaxPermSize设置永久代最大空间大小。
-Xss设置每个线程的堆栈大小。

(2)年轻代/老年代

java jvm 老年代年轻代 jvm设置老年代大小_java_02

没有直接设置老年代的参数,可以设置堆空间大小和新生代空间大小两个参数来间接控制。
老年代空间大小=堆空间大小-年轻代大空间大小

3、默认参数

参数名称 含义 默认值
-Xms 初始堆大小 物理内存的1/64(<1GB) 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制.
-Xmx 最大堆大小 物理内存的1/4(<1GB) 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制
-Xmn 年轻代大小(1.4or lator) 注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。
整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.
增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8

4、新生代内存配置

指令1:-Xmn512m
指令2:-XX:MaxNewSize=512m
// 新生代和老年代的占比
指令3:-XX:NewRatio=4 //表示新生代:老年代 = 1:4 即老年代占整个堆的4/5;默认值=2

5、典型配置

java -Xmx3550m -Xms3550m -Xmn2g –Xss128k
-Xmx3550m: 设置 JVM 最大可用内存为 3550M。
-Xms3550m: 设置 JVM 初始内存为 3550m。此值可以设置与-Xmx 相同,以避免每次垃圾
回收完成后 JVM 重新分配内存。
-Xmn2g: 设置年轻代大小为 2G。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小。
持久代一般固定大小为 64m,所以增大年轻代后,将会减小年老代大小。此值对系统性能
影响较大, Sun 官方推荐配置为整个堆的 3/8。
-Xss128k: 设置每个线程的堆栈大小。 JDK5.0 以后每个线程堆栈大小为 1M,以前每个线
程堆栈大小为 256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减小这
个值能生成更多的线程。但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,
经验值在 3000~5000左右。