一.jvm常用参数
1. -verbose:gc
2. -XX:+PrintGC 打印gc
3. -XX:+PrintGCDetails 打印gc的详细信息
Heap
PSYoungGen total 76288K, used 5243K [0x000000076b380000, 0x0000000770880000, 0x00000007c0000000)
eden space 65536K, 8% used [0x000000076b380000,0x000000076b89ed38,0x000000076f380000)
from space 10752K, 0% used [0x000000076fe00000,0x000000076fe00000,0x0000000770880000)
to space 10752K, 0% used [0x000000076f380000,0x000000076f380000,0x000000076fe00000)
ParOldGen total 175104K, used 0K [0x00000006c1a00000, 0x00000006cc500000, 0x000000076b380000)
object space 175104K, 0% used [0x00000006c1a00000,0x00000006c1a00000,0x00000006cc500000)
Metaspace used 2874K, capacity 4486K, committed 4864K, reserved 1056768K
class space used 308K, capacity 386K, committed 512K, reserved 1048576K
4.-XX:+PrintGCTimeStamps 打印gc发生的时间戳
5.-Xloggc:log/gc.log 指定log文件位置
6.-XX:+PrintHeapAtGC 查看gc前后堆的大小
7.-XX:+TraceClassLoading 监控类的加载
8.-XX:+PrintClassHistogram 按下ctrl+break 打印类的信息
9.-Xmx -Xms
指定最大推和最小堆
比如 -Xmx20m -Xms5M
10.-Xmn 设置新生代的大小
11.-XX:SurvivorRatio
设置两个Survivor区(s0,s1)和eden的比
8表示 两个survivor:eden=2:8 ,即一个survivor占年轻代的1/10
-XX:NewRatio
新生代(eden+2*s)和老年代(不包含永久区)的比值
新生代:老年代 = 1:4 即年轻代占堆的1/5
12. -XX:+HeapDumpOnOutOfMemoryError oom 时导出oom堆到文件
13. -XX:+HeapDumpPath 导出oom的路径
-Xmx20m -Xms5m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=d:/log.txt
14. -XX:OnOutOfMemoryError
在发生内存不够的时候执行一个脚本
-XX:OnOutOfMemoryError=D:/tools/jdk1.7_40/bin/printstack.bat %p
当程序OOM时,在D:/a.txt中将会生成线程的dump
注:
根据事件调整新生代和幸存代的大小
官方推荐新生代占堆的3/8
幸存代占新生代的1/10
在oom 时,记得dump出堆,确保可以排查现场问题
永久区配置参数
15. -XX:PermSize -XX:MaxPermSize
设置永久区的初始空间和最大空间
一个系统可以容纳多少个类型
16. -Xss 栈大小
通常只有几百K
决定了函数调用的深度
每个线程都有独立的栈空间
二.垃圾回收器
1.串行垃圾回收器
局部变量、参数 分配在栈上
最古老,最稳定
效率高
可能会产生较长的停顿
-XX:+UseSerialGC
新生代、老年代使用串行回收
新生代复制算法
2.并行垃圾回收器
2.1ParNew
-XX:+UseParNewGC
新生代并行
老年代串行
Serial收集器新生代的并行版本
复制算法
多线程,需要多核支持
-XX:ParallelGCThreads 限制线程数量
2.2Parallel收集器
类似ParNew
新生代复制算法
老年代 标记-压缩
更加关注吞吐量
-XX:+UseParallelGC 使用Parallel收集器+ 老年代串行
-XX:+UseParallelOldGC 使用Parallel收集器+ 并行老年代
2.3CMS收集器
Concurrent Mark Sweep 并发标记清除
标记-清除算法
与标记-压缩相比 并发阶段会降低吞吐量
老年代收集器(新生代使用ParNew)
-XX:+UseConcMarkSweepGC
2.3.1运行流程
CMS运行过程比较复杂,着重实现了标记的过程,可分为
1.初始标记
根可以直接关联到的对象
速度快
2.并发标记(和用户线程一起)
主要标记过程,标记全部对象
3.重新标记
由于并发标记时,用户线程依然运行,因此在正式清理前,再做修正
4.并发清除(和用户线程一起)
基于标记结果,直接清理对象
三.命令精讲
-XX:+UseSerialGC:在新生代和老年代使用串行收集器
-XX:SurvivorRatio:设置eden区大小和survivior区大小的比例
-XX:NewRatio:新生代和老年代的比
-XX:+UseParNewGC:在新生代使用并行收集器
-XX:+UseParallelGC :新生代使用并行回收收集器
-XX:+UseParallelOldGC:老年代使用并行回收收集器
-XX:ParallelGCThreads:设置用于垃圾回收的线程数
-XX:+UseConcMarkSweepGC:新生代使用并行收集器,老年代使用CMS+串行收集器
-XX:ParallelCMSThreads:设定CMS的线程数量
-XX:CMSInitiatingOccupancyFraction:设置CMS收集器在老年代空间被使用多少后触发
-XX:+UseCMSCompactAtFullCollection:设置CMS收集器在完成垃圾收集后是否要进行一次内存碎片的整理
-XX:CMSFullGCsBeforeCompaction:设定进行多少次CMS垃圾回收后,进行一次内存压缩
-XX:+CMSClassUnloadingEnabled:允许对类元数据进行回收
-XX:CMSInitiatingPermOccupancyFraction:当永久区占用率达到这一百分比时,启动CMS回收
-XX:UseCMSInitiatingOccupancyOnly:表示只在到达阀值的时候,才进行CMS回收
老年代标记-压缩