JVM调优

Linux 查询基本信息

1.查看CPU核数

cat /proc/cpuinfo

2.查看内存占用情况

free -h/-m

JVM参数

  • -X

    -Xmx5g   #最大堆内存
    -Xms5g   #初始化堆内存
    -Xss256k #栈内存大小
    
  • -XX

    -XX:+HeapDumpOnOutOfMemoryError #堆溢出导出错误日志
    -XX:MaxDirectMemorySize  #NIO buff最大大小, 默认0,自动分配(与堆一样大)
    -XX:+PrintFlatsFinal #打印参数默认值
    -XX:+UseCompressedOops #开启压缩(64位系统和32位系统对象大小一致) jdk1.6后, 默认开启
    -XX:+UseCompressedClassPointers #指针压缩
    -XX:+ExplicitGCInvokesConcurrent # 减少FullGC停留时间
    
  • 开启GC日志(jdk9以前)

    -XX:+PrintGCDetails
    -XX:+PrintGCTimeStamps 
    -XX:+PrintGCDateStamps
    -Xloggc:[file-path]
    -XX:+PrintReferenceGC
    -XX:+PrintTenuringDistribution
    -XX:+PrintGCApplicationStoppedTime
    -XX:+UseGCLogFileRotation
    -XX:NumberOfGCLogFiles=10
    -XX:GCLogFileSize=10M
    
  • 开启GC日志(jdk9以后)

    -Xlog:gc*,gc+ref=debug,gc+age=trace,gc+heap=debug:file=gc%p %t.log:tags,uptime,time:filecount=10,filesize=10m
    
  • -client

  • -server (2h2G 64位 服务器默认设置)

调优工具

jinfo -flats pid

jstat pid time 间隔时间(ms) 次数 查看堆内存

jstat -class pid

jstat -compiler pid

jstat -gc pid

jmap 汇总内存使用情况

jmap -heap pid

jmap -histo pid | more # 所有

jmap -histo:live pid | more # 活跃

jmap -dump:format=b,file=/dump.dat pid

jhat 工具

jhat -port 8888 file

MAT

Jstack pid

垃圾回收器

serial 串行 1.4 之前,client模式 stw 中断线程 复制算法

parallel 并行 大数据计算,后台计算 stw 中断线程

cms 与业务并行有短暂中断

HotSpot

新生代: serial, parNew, ParallelScavenge(吞吐量比parNew大, 大数据领域)

老年代:CMS(大内存, 缺点: 有垃圾碎片), Serial Old(标记整理算法) (CSS)[1.5, 1.6 不建议使用], ParallelOld

G1: 取消年轻代,老年代的划分(最大64G 内存)

G1适合8/16G以上的内存使用,原因在于G1rescan更快,清除垃圾时虽然是stop the world但是可控,CMS虽然是并发但是不可控,大块内存要回收会影响到应用程序的性能。另外由于G1在清理垃圾时使用STW,所以可以采用标记整理算法,没有内存碎片问题

https://www.jianshu.com/p/9c6be3b92dc6

上一篇:JDK 监控和故障处理工具


下一篇:jstat命令详解