JVM知识整理
2021-07-19 11:46:40 0 举报
AI智能生成
继续修改
作者其他创作
大纲/内容
JVM,Hotspot,Open JDK
JVM参数
JVM运行过程
OOM问题
发生OOM地方
堆内OOM
内存溢出
jmap命令查看服务配置参数是否正常
jstat查看当前运行各代回收情况
通过设置参数,导出dump文件分析
内存泄漏
开发人员操作不当导致,dump出文件分析
堆外OOM
触发fullGC时被回收
调用ByteBuffer的cleaner的clean(),内部还是调用System.gc(),所以一定不要-XX:+DisableExplicitGC
可能导致的原因
死循环创建对象
静态变量、方法过多,导致内存占用又没办法被回收
大对象,且放入集合(多大算大)
频繁的string字符串拼接
排查JVM问题
命令
jmap
jstat
jsp
jstack
jinfo
分析工具
eclipse memory analyzer(mat)
jdk自带的visual VM
优化技术
栈上分配
逃逸分析
标量替换
同步消除
组成部分
JMM(运行时数据区)
虚拟机栈
本地方法栈
pc计数器
方法区(metaspace)
堆
组成部分
新生代(1/3)
Eden(8/10)
s0(1/10)
s1(1/10)
老年代(2/3)
堆内存、堆外存
堆内存由GC负责回收
堆外存,默认64M
Execute engine(执行器引擎)
即时编译器
即时编译器类型
C1
C2
C1+C2(JDK8默认开启)
热点代码检测
计数器探测
方法调用计数器
回边计数器(循环体)
采样探测
GC(垃圾回收器)
GC回收器类型
新生代回收器
serial
搭配:serial old、CMS
parnew
搭配:serial old、CMS
parallel scavenge
搭配:serial old,parallel old
G1
写屏障 + SATB
老年代回收器
parallel old
serial old
CMS
回收过程
初始标记
GC ROOT
哪些可以成为GC ROOT
虚拟机栈本地变量引用对象
本地方法栈JNI引用的对象
方法区静态变量,常量所引用的对象
为什么要选这些
当前存活的对象作为遍历的根节点
判断对象是否存在
可达性分析
引用计数法
给对象添加一个引用计数器,有地方用到+1,引用时效-1,当引用计数为0时,表示对象不再被使用
存在循环引用的问题
并发标记
重新标记
增量写屏障
三色标记
对象类型
白色
灰色
黑色
标记过程
并发清理
并发重置
-xx:+useConcMarkSweepGC
GC算法
标记清楚
标记压缩
复制算法
分带算法
GC过程
各代GC
Young GC、minor GC:只收集young gen的GC
Old GC:只收集old gen的GC。只有CMS的concurrent collection是这个模式
Mixed GC:收集整个young gen以及部分old gen的GC。只有G1有这个模式
Full GC:收集整个堆,包括young gen、old gen、perm gen(如果存在的话)等所有部分的模式。老年代内存不足时触发
major GC:收集清理永久代
类加载器
类加载器类型
启动类加载器(bootstrap class Loader)
扩展类加载器(extensions class Loader)
应用程序类加载器(application class Loader)
用户自定义加载器(user class Loader)
类加载过程
加载
将class文件加载到JMM方法区中
验证
验证二进制文件是否有效
准备
为类中的静态变量分配内存
解析
文件中的符号引用转变成直接引用
初始化
类中的静态变量和静态方法初始化
双亲委派机制
当一个类收到类加载请求时,不会自己去加载此类,而是将其委派给父类加载,如果父类不能加载,反馈回子类,再有子类完成类的加载
优点
防止重复加载同一个.class 文件,保证加载一遍,确保数据安全
核心.class文件不会被篡改,父类加载后,子类如果重新加载那只能说明两个类不是同一个类,确保了class执行的安全
NI(native interface 本地库接口)
0 条评论
下一页