标准: - 开头,所有的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类

几个常用的命令

  1. java -XX:+PrintCommandLineFlags HelloGC
  2. java -Xmn10M -Xms40M -Xmx60M -XX:+PrintCommandLineFlags -XX:+PrintGC HelloGC
    PrintGCDetails PrintGCTimeStamps PrintGCCauses
  3. java -XX:+UseConcMarkSweepGC -XX:+PrintCommandLineFlags HelloGC
  4. java -XX:+PrintFlagsInitial jvm的默认参数值 查找jvm的一些参数非常有用
  5. java -XX:+PrintFlagsFinal jvm的最终参数值
  6. java -XX:+PrintFlagsFinal | grep xxx 找到对应的参数
  7. java -XX:+PrintFlagsFinal -version |grep GC
  8. java -Xms20M -Xmx20M -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError com.mashibing.jvm.gc.T15_FullGC_Problem01 内存溢出时打印堆信息
  9. 设定日志参数
  1. -Xloggc:/opt/xxx/logs/xxx-xxx-gc-%t.log
    -XX:+UseGCLogFileRotation
    -XX:NumberOfGCLogFiles=5
    -XX:GCLogFileSize=20M
    -XX:+PrintGCDetails
    -XX:+PrintGCDateStamps
    -XX:+PrintGCCause
  2. 或者每天产生一个日志文件

遗留问题

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远程连接

  1. 程序启动加入参数:

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

  1. 如果遭遇 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

  1. 关闭linux防火墙(实战中应该打开对应端口)

service iptables stop chkconfig iptables off #永久关闭

  1. windows上打开 jconsole远程连接 192.168.17.11:11111

垃圾回收器组合

java怎么查看jvm线程数 jvm查看线程状态命令_CMS