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