JVM调优

JVM参数

 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
-Xmx 最大堆大小 -Xms 初始堆大小 -Xss 线程栈大小 -Xmn 年轻代大小 -XX:MaxPermSize 持久代大小 -XX:NewRatio=4 年轻代/持久代 比值 -XX:SurvivorRatio=4 年轻代Eden/Survivor比值,一个Survivor占1/6 -XX:MaxTenuringThreshold=0 垃圾最大年龄,为0直接进入老年代 -XX:+UseParallelGC: 选择垃圾收集器为并行收集器 -XX:ParallelGCThreads=20: 配置并行收集器的线程数 -XX:+UseConcMarkSweepGC: 设置老年代为并发收集 -XX:CMSFullGCsBeforeCompaction:并发收集器不对内存空间进行压缩、整理,会产生“碎片”,此值设置运行多少次GC以后对内存空间进行压缩、整理 -XX:+UseCMSCompactAtFullCollection: 打开老年代压缩,消除碎片,可能影响性能 -XX:+PrintGC GC日志输出形式 -XX:+PrintGCDetails GC日志输出形式

年轻代大小选择

1、应用存在大量临时对象,年轻代选择更大,存在更多持久对象,老年代选择更大

2、JVM默认1:2,减少Full GC,回收整个堆

3、观察峰值时老年代占用内存大小

GC ROOT

根特征,只会引用其他对象,不会被其他对象引用

栈中本地变量、方法区中静态变量、本地方法栈中的变量、正在运行的线程

1.7到1.8虚拟机变化

1、1.8没有永久代,替换它的是元空间,元空间使用本地内存空间

2、方法区所存储类信息大小不确定,转移到本地内存不占用虚拟机内存

类加载过程

1、加载,读取类字节码文件,在堆中分配内存

2、验证,校验字节码文件正确性

3、准备,给类的静态变量分配内存,赋初始值

4、解析,动态链接,将静态方法的符号引用替换为直接引用(包含内存地址信息)

5、初始化,给类的静态变量设置指定值,执行静态代码块

排查JVM问题

正常运行系统

1、使用jmap查看JVM各个区域使用情况

2、通过jstack查看线程运行情况,如线程阻塞

3、通过jstat查看垃圾回收情况,Full GC频繁需要进行调优

4、通过jvisualvm工具辅助分析

5、Full GC频繁,尝试增大年轻代大小

6、查找占用CPU最多的线程,定位到具体方法,优化方法

已经发生OOM系统

1、发生OOM时,生成dump内存文件,内存溢出Out of Memory Error

2、利用jvisualvm工具分析dump文件

3、根据dump文件找到异常对象、异常线程(占用CPU高),定位到具体代码

JVM诊断工具

1、JDK自带java visualVM

2、阿里的Arthas

深拷贝浅拷贝

浅拷贝

拷贝基本数据类型的值,以及实例对象引用地址,内部类属性指向同一对象

深拷贝

拷贝基本数据类型、实例对象引用地址所指向的对象,内部类属性指向不同对象

STW

1、stop the word,进行GC时会停止用户线程,影响用户体验

2、无STW,用户线程一直执行

浙ICP备11005866号-12