一、参数描述:
- 堆设置
- -XX:+PrintGCDetails 打印垃圾回收信息
- -Xms 为Heap区域的初始值,线上环境需要与-Xmx设置为一致,否则capacity的值会来回飘动
- -Xmx 为Heap区域的最大值
- -Xss(或-ss) 线程栈大小(指一个线程的native空间)1.5以后是1M的默认大小
- -XX:PermSize与-XX:MaxPermSize 方法区(永久代)的初始大小和最大值(但不是本地方法区)
- -XX:NewRatio 老年代与新生代比率
- -XX:SurvivorRatio Eden与Survivor的占用比例。例如8表示,一个survivor区占用 1/8 的Eden内存,即1/10的新生代内存,为什么不是1/9?因为我们的新生代有2个survivor,即S1和S22。所以survivor总共是占用新生代内存的 2/10,Eden与新生代的占比则为 8/10。
- -XX:MaxHeapFreeRatio GC后,如果发现空闲堆内存占到整个预估的比例小于这个值,则减小堆空间。
- -XX:MinHeapFreeRatio GC后,如果发现空闲堆内存占到整个预估的比例大于这个值,则增大堆空间。
- -XX:NewSize 新生代大小
- -Xmn参数含义是Young Generation的heap size。
- 收集器设置
- -XX:+UseSerialGC:设置串行收集器
- -XX:+UseParallelGC:设置并行收集器
- -XX:+UseParalledlOldGC:设置并行年老代收集器
- -XX:+UseConcMarkSweepGC:设置并发收集器
- 垃圾回收统计信息
- -XX:+PrintGC
- -XX:+PrintGCDetails
- -XX:+PrintGCTimeStamps
- -Xloggc:filename
- 并行收集器设置
- -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
- -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
- -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比。公式为1/(1+n)
- 并发收集器设置
- -XX:+CMSIncrementalMode:设置为增量模式。适用于单CPU情况。
- -XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数。并行收集线程数。
二、参数设置
-Xms 与
-Xmx 值一般设置相同;
-Xmn
Sun官方推荐配置为整个堆的3/8。例如
-Xms :2048m
-Xmx:2048m
-Xmn:768m
-XX:PermSize,-XX:MaxPermSize
例如
-Xms :2048m
-Xmx:2048m
-XX:PermSize:256
-XX:MaxPermSize:512
三、
内存分配过程
1、JVM 会试图为相关Java对象在Eden Space中初始化一块内存区域。
2、当Eden空间足够时,内存申请结束;否则到下一步。
3、JVM 试图释放在Eden中所有不活跃的对象(这属于1或更高级的垃圾回收)。释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区。
4、Survivor区被用来作为Eden及Old的中间交换区域,当Old区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区。
5、当Old区空间不够时,JVM 会在Old区进行完全的垃圾收集(0级)。
6、完全垃圾收集后,若Survivor及Old区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现“outofmemory”错误。
总结
名称
|
特征
|
作用
|
配置参数
|
异常
|
程序计数器
|
占用内存小,线程私有,
生命周期与线程相同
|
大致为字节码行号指示器
|
无
|
无
|
虚拟机栈
|
线程私有,生命周期与线程相同,使用连续的内存空间
|
Java 方法执行的内存模型,存储局部变量表、操作栈、动态链接、方法出口等信息
|
-Xss
|
StackOverflowError
OutOfMemoryError
|
java堆
|
线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址
|
保存对象实例,所有对象实例(包括数组)都要在堆上分配
|
-Xms
-Xsx
-Xmn
|
OutOfMemoryError
|
方法区
|
线程共享,生命周期与虚拟机相同,可以不使用连续的内存地址
|
存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据
|
-XX:PermSize:
16M
-XX:MaxPermSize
64M
|
OutOfMemoryError
|
运行时常量池
|
方法区的一部分,具有动态性
|
存放字面量及符号引用
|
|
|