jvm优化实战
2020-11-01 本文已影响0人
奋斗的韭菜汪
(1)串行垃圾收集器
-XX:+UseSerialGC
-XX:+UseSerialOldGC
(2)并行收集器(吞吐量优先)
-XX:+UseParallelGC
-XX:+UseParallelOldGC
(3)并发收集器(响应时间优先)
-XX:+UseConMarkSweepGc
-XX:+UseG1GC
jvm参数:
(1)标准参数
java -version/-help 提供的参数,不会随着jdk版本变化而变化
(2)-X参数
非标准参数,会随jdk版本变动而变动 例:-Xint
(3)-XX参数
-XX参数最常用的参数,可分为两类
a.Boolean类型
格式:-XX:[+-]<name> +或-表示启用或者禁用name属性
比如:-XX:+UseConcMarkSweepGC 表示启用CMS类型的垃圾回收器
-XX:+UseG1GC 表示启用G1类型的垃圾回收器
b.非Boolean类型
格式:-XX<name>=<value> 表示name属性的值是value
比如:-XX:MaxGCPauseMillis=500
(4)其他参数(也可理解成-XX参数,官方只分为三种)
-Xms100M等价于 -XX:InitialHeapSize=100M
-Xmx100M等级于 -XX:MaxHeapSize=100M
-Xss100k等价于 -XX:ThreadStackSize=100k
启动java进程时打印jvm参数信息:
-XX:+PrintFlagsFinal
jvm参数设置的方式:
(1)本地环境idea,eclipse
(2)jar包启动 java -XX:+UseG1GC xxx.jar
(3)tomcat等容器启动,一般bin文件中有xxx.sh启动文件中配置
(4)实时修改,不需要重启服务:jinfo
常用JVM需要调优的参数:
常用JVM调优命令:(不需要安装jdk自带,配置环境变量就已经有了)
1、jps:查看当前java进程
2、jinfo:查看或修改java参数(jinfo -flag MaxHeapSize pid:查看pid进程的最大堆内存的值,jinfo -flag UseG1Gc pid:查看pid进程是否使用G1垃圾收集器)
实时修改vm参数中的某个值:jinfo -flag name=value pid(注:只有标记是manageable才能实时修改)
3、jstat:
jstat -class pid 1000 10:打印pid进程的类加载信息,1秒打印一次,打印10次
jstat -gc pid 1000 10:打印pid进程的gc收集情况,1秒打印一次,打印10次
4、jstack:查看线程的堆栈信息(主要是线程信息,如果线程出现问题方便排查,例如多线程抢占锁死锁问题)
5、jmap:生成堆内存的快照(排查oom异常)
jmap -heap pid
参数解析:
image.png
MaxHeapSize 最大堆内存300M
NewSize新生代100M
OldSize老年代200M
NewRatio老年代新生代大小比例2
生产环境oom异常自动dump内存信息文件:
启动脚本中加入:-XX:+heapDumpOutOfMemoryError -XX:HeapDumpPath=heap.hprof
java内存可视化工具:jconsole、jvisualvm(支持远程连接)、arthas(alibaba产品)
jvm优化关注的点:
1、堆内存分析
堆内存分析工具MAT,通过分析dump文件heap.hprof,分析内存问题
在线工具:PerfMa
2、垃圾回收(GC日志)
gcviewer工具,分析gc日志,关注吞吐量和停顿时间
在线工具gceasy
** -XX参数**
使用得最多的参数类型
非标准化参数,相对不稳定,主要用于JVM调优和Debug
获取Dump文件
手动:
jmap -dump:format=b,file=heap.hprof 44808
自动:
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=heap.hprof
Histogram可以列出内存中的对象,对象的个数及其大小
Class Name:类名称,java类名 Objects:类的对象的数量,这个对象被创建了多少个
Shallow Heap:一个对象内存的消耗大小,不包含对其他对象的引用
Retained Heap:是shallow Heap的总和,即该对象被GC之后所能回收到内存的总和
右击类名--->List Objects--->with incoming references--->列出该类的实例
右击Java对象名--->Merge Shortest Paths to GC Roots--->exclude all ...--->找到GC Root以及原因
Leak Suspects
查找并分析内存泄漏的可能原因
Reports--->Leak Suspects--->Details
Top Consumers: 列出大对象
GC日志分析工具
要想分析日志的信息,得先拿到GC日志文件才行,所以得先配置一下
根据前面参数
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:gc.log
工具:GCViewer,在线工具