JVM内存模型
堆:对象
栈:方法调用入栈,调用完弹栈,线程独享
方法区:存放类,字节码,常量池
javap -c xxx.class # 反编译class
JVM调优
减少full gc次数,减少full gc时间
发现垃圾?
引用计数算法
根可达算法
三种垃圾回收算法
Copying 新生代,拷贝有用的小部分
Mark Sweap 标记清除,一半一半
Mark-Compact 标记压缩
垃圾回收器
分代模型:
PS并发+PO #默认
ParNew并发+CMS并发标记清除
不分代模型
G1 #推荐
G1常用参数
调优实战
根据需求进行JVM规划预调优
-server # 以服务端模式运行
-Xms # 最小堆内存
-Xmx # 最大堆内存,最大最小堆内存设置相同(扩缩费时)
-XX: MetaspaceSize # 初始元空间大小 大部分ERP系统直接调整元空间大小即可
-XX: MaxMetaspaceSize # 最大元空间大小
-XX: MaxNewSize # 新生代最大内存,默认16M
-XX:+PrintGCDetails # 输出GC的详细日志
-XX:+PrintCommandLineFlags -version # 查看GC类型
-XX:+PrintFlagsFinal | wc -l # 列出所有XX参数
jps
jinfo pid
jstat -gc pid
jstack pid | more # 排查有没有死锁,
jmap -histo pid # 列出堆中的对象(生产环境不能用,会暂停堆)
CPU超高场景:分析是业务线程还是GC线程
-XX:HeapDumpOnOutOfMemoryError # 自动生成dump文件
可视化工具(生产环境不可能随便开调试端口):jcoonsole和jvisualVM,arthas(阿里)
arthas(阿里):
thread -b # 找死锁
jad file # 在线反编译
redefine #替换线上的class文件