标准: - 开头,所有的HotSpot都支持
非标准:-X 开头,特定版本HotSpot支持特定命令
不稳定:-XX 开头,下个版本可能取消
分析内存常用命令
jmap - histo 4655 | head -20,查找个数排名前20的对象
jmap -dump:format=b,file=filename pid 获取堆信息dump
top
top -Hp pid
jstack pid > log.txt //将堆栈信息输出到文件
jps//查看java进程pid
jstat -gc pid//查看gc回收情况
jstat -gcutil pid
jstack > stack
线程ID为十进制–>十六进制:printf “%x\n” xxx
jstack | grep 线程号的16进制 -A 10 -B 10 打印前后10行
查看class
1.java -verbose:class 查看jvm是否已加载该java类
几个常用的命令
-
java -XX:+PrintCommandLineFlags HelloGC
-
java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
PrintGCDetails PrintGCTimeStamps PrintGCCauses -
java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC
-
java -XX:+PrintFlagsInitial jvm的默认参数值 查找jvm的一些参数非常有用
-
java -XX:+PrintFlagsFinal jvm的最终参数值
-
java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数
-
java -XX:+PrintFlagsFinal -version |grep GC
-
java -Xms20M -Xmx20M -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError com.mashibing.jvm.gc.T15_FullGC_Problem01 内存溢出时打印堆信息
-
设定日志参数
-
-Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log
-XX:+UseGCLogFileRotation
-XX:NumberOfGCLogFiles=5
-XX:GCLogFileSize=20M
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCCause
-
或者每天产生一个日志文件
-
遗留问题
https://alibaba.github.io/arthas
G1的FGC
常见垃圾回收器组合
- -XX:+UseConc(urrent)MarkSweepGC = ParNew + CMS + Serial Old
- -XX:+UseParallelGC = Parallel Scavenge + Parallel Old (1.8默认) 【PS + SerialOld】
- -XX:+UseParallelOldGC = Parallel Scavenge + Parallel Old
- -XX:+UseG1GC = G1
GC常用参数
参数 | 含义 | |
---|---|---|
-Xmn -Xms -Xmx -Xss | 年轻代 最小堆 最大堆 栈空间 | |
-XX:+UseTLAB | 使用TLAB,默认打开 ,Thread Local Allocation Buffer,每个线程在堆空间默认开辟1%的空间 | |
-XX:+PrintTLAB | 打印TLAB的使用情况 | |
-XX:TLABSize | 设置TLAB大小 | |
-XX:+DisableExplictGC | 禁止使用System.gc() ,他是FGC,默认是关闭的 | |
-XX:+PrintGC | ||
-XX:+PrintGCDetails | ||
-XX:+PrintHeapAtGC | ||
-XX:+PrintGCTimeStamps | ||
-XX:+PrintFlagsFinal -XX:+PrintFlagsInitial | 必须会用 | |
java -XX:+PrintFlagsFinal -version grep G1 | ||
-Xloggc:opt/log/gc.log | ||
-XX:MaxTenuringThreshold | 升代年龄,最大值15 | |
Parallel常用参数
参数 | 含义 | 默认值 |
---|---|---|
XX:SurvivorRatio | 默认811 | |
XX:PreTenureSizeThreshold | 大对象到底多大 | |
-XX:MaxTenuringThreshold | ||
-XX:+ParallelGCThreads | 并行收集器的线程数,同样适用于CMS,一般设为和CPU核数相同 | |
-XX:+UseAdaptiveSizePolicy | 自动选择各区大小比例 |
CMS常用参数
参数 | 含义 | 默认值 |
---|---|---|
-XX:+UseConcMarkSweepGC | ||
-XX:ParallelCMSThreads | CMS线程数量 | |
-XX:CMSInitiatingOccupancyFraction | 使用多少比例的老年代后开始CMS收集 | |
-XX:+UseCMSCompactAtFullCollection | FGC时压缩 | |
-XX:CMSFullGCsBeforeCompaction | 多少次FGC后压缩 | |
-XX:+CMSClassUnloadingEnabled | ||
-XX:CMSInitiatingPermOccupancyFraction | 达到什么比例时进行Perm回收 | |
GCTimeRatio | 设置GC时间占用程序运行时间的百分比 | |
-XX:MaxGCPauseMillis | 停顿时间,是一个建议时间,GC会尝试用各种手段达到这个时间,比如减小年轻代 | |
-XX:+CMSParallelRemarkEnable | 降低标记停顿 | |
-XX:LagePageSizebytes | ||
-XX:+UseFastAccessorMethods | 原始类型的快速优化 | |
-XX:+UseCMSInitiatingOccupancyOnly | 使用手动定义初始化定义开始CMS收集 禁止hostspot自行触发CMS GC | |
CMS内存碎片解决方案 | -XX:+UseCMSCompactAtFullCollection 使用并发收集器时,开启对年老代的压缩. | |
-XX:CMSFullGCsBeforeCompaction 默认为0 指的是经过多少次FGC才进行压缩 | ||
–XX:CMSInitiatingOccupancyFraction 92% 可以降低这个值,让CMS保持老年代足够的空间 |
G1常用参数
参数 | 含义 | 默认值 |
---|---|---|
-XX:+UseG1GC | ||
-XX:MaxGCPauseMillis | 建议值,G1会尝试调整Young区的块数来达到这个值 | |
-XX:GCPauseIntervalMillis | GC时间间隔目标 | |
-XX:+G1HeapRegionSize | 分区大小,建议逐渐增大该值,1 2 4 8 16 32。 随着size增加,垃圾的存活时间更长,GC间隔更长,但每次GC的时间也会更长 ZGC做了改进(动态区块大小) | |
G1NewSizePercent | 新生代最小比例,默认为5% | |
G1MaxNewSizePercent | 新生代最大比例,默认为60% | |
GCTimeRatio | GC时间建议比例,G1会根据这个值调整堆空间 | |
ConcGCThreads | 线程数量 | |
-XX:+G1UseAdaptiveIHOP -XX:InitiatingHeapOccupancyPercent=45 | 可以降低MixedGC触发的阈值,让MixedGC提早发生 |
参数列表
参数名称 | 含义 | 默认值 |
---|---|---|
-Xms | 初始堆大小 | |
-Xmx | 最大堆大小 | |
-Xmn | 新生代大小 | |
-XX:PermSize | 1.7之前的永久代 | |
-XX:MaxPermSize | 1.7之前的永久代最大值 | |
-Xss | 每个线程的堆栈大小 | 1M |
-XX:ThreadStackSize | Thread Stack Size | |
-XX:NewRatio | ||
-XX:SurvivorRatio | ||
-XX:LargePageSizeInBytes | ||
-XX:+DisableExplicitGC | 关闭System.gc() | |
-XX:+UseBiasedLocking | ||
-XX:PretenureSizeThreshold | 对象超过多大是直接在旧生代分配 | |
-XX:TLABWasteTargetPercent | ||
并行收集器相关参数 | ||
-XX:+UseParallelGC | 使用PS回收器 | |
-XX:+UseParallelOldGC | 使用PS回收器 | |
-XX:ParallelGCThreads | 并行收集器的线程数 | |
-XX:MaxGCPauseMillis | 每次年轻代垃圾回收的最长时间(最大暂停时间) | |
-XX:GCTimeRatio | 设置垃圾回收时间占程序运行时间的百分比 | |
CMS相关参数 | ||
对CMS的理解 | CMS是parNew+CMS,CMS就是FGC, 当CMS搞不定了,就会让serialOld进行回收, 这是调优该避免的内容 | |
-XX:+UseConcMarkSweepGC | 使用CMS | |
-XX:CMSFullGCsBeforeCompaction | 多少次FGC后进行压缩 | |
-XX:+CMSParallelRemarkEnabled | 降低标记停顿 | |
-XX+UseCMSCompactAtFullCollection | 在FULL GC的时候, 对年老代的压缩 | |
-XX:+UseCMSInitiatingOccupancyOnly | ||
-XX:CMSInitiatingOccupancyFraction=70 | ||
常用命令 | ||
-XX:+PrintGC | ||
-XX:+PrintGCDetails | ||
-XX:+PrintGCTimeStamps | ||
-XX:+PrintGCApplicationStoppedTime | 打印垃圾回收期间程序暂停的时间 | |
-Xloggc:filename | gc日志信息存放的路径 | |
-XX:+PrintTLAB | ||
jconsole远程连接
-
程序启动加入参数:
java -Djava.rmi.server.hostname=192.168.17.11 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false XXX
-
如果遭遇 Local host name unknown:XXX的错误,修改/etc/hosts文件,把XXX加入进去
192.168.17.11 basic localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
-
关闭linux防火墙(实战中应该打开对应端口)
service iptables stop chkconfig iptables off #永久关闭
-
windows上打开 jconsole远程连接 192.168.17.11:11111