JVM核心知识点
2020-10-10 17:00:57 0 举报
JVM核心知识点
作者其他创作
大纲/内容
运行时数据区
对象超过阀值
分代收集算法根据对象存活周期的不同将内存分为几块,一般分为新生代和老年代,这样可以根据各个年代的特点选择合适的垃圾回收算法。新生代每次垃圾回收会有大量对象死去,只有少量存活,所以选择复制算法,只需付出少量存活对象的成本即可。老年代中对象存活率高,没有额外空间对其分配担保,必须使用“标记-清除”或“标记-整理”算法
执行引擎
BootstrapClassLoader
可以理解为一个指针,指向方法区中的方法当前执行的字节码的位置,线程执行或回复都依赖程序计数器
N
方法调用
加载
OOM
局部变量表
新对象申请内存
栈帧(main)...
JVM
方法出口
Product.java
CustomClassLoader
JIT编译器
JNI本地方法接口
老年代默认占总堆内存的3/2
超大新对象
操作数栈
垃圾收集器
Survivor能否放下
老年代能够放下
栈帧(方法1)
Eden默认栈新生代8/10
AppClassLoader
方法区(元空间)
运行时常量池
Heap堆
静态属性
初始化
交换
拓展Java功能,融合不同编程语言为Java所用调用含有native的方法进入本地方法栈,调用本地方法接口
程序计数器(PC寄存器)
虚拟机栈
Y
From/To交换
登记native方法,交由JNI执行
类元信息(构造函数/接口定义/字段)
链接
SurvivorTo默认栈新生代1/10
Young GC
存活对象
常量池
Eden区能否放下
类加载器
OOM思路:1.尝试调大堆内存2.分析内存(MAT/JProfiler)
程序计数器
-Xms-Xmx一般设置成一样的大小,避免在GC后调整堆大小后带来额外的性能损耗。-Xmn设置年轻代内存空间大小-XX:+HeapDumpOnOutOfMemoryError 内存溢出时自动Dump文件-XX:PrintGCDetails打印GC垃圾回收信息-XX:MaxTenuringThreshold 设置Survivor区对象交换次数
代码优化器
标记-整理算法或标记-压缩算法或标记-整理-清除算法该算法从GC Roots触发,依次标记有引用关系的对象,然后将有引用关系的对象整理到内存空间的另一端,形成连续的已使用空间,最后将已使用空间之外的部分全部清理掉缺点:1.解决了标记-清除算法的缺点,但是内存整理移动需要花费一定时间
探测器
动态链接
ClassLoader类加载器
晋升老年代
对象内存扭转流程
Thread
ExtClassLoader
栈帧(方法2)
中间代码生成器
SurvivorFrom默认栈新生代1/10
JDK6之前常量池在方法区中JDK7常量池在堆中JDK8常量池在元空间
线程共享区域
Interpreter解释器
阀值默认15,Survivor交换14次后进入老年代-XX:MaxTenuringThreshold 可以调整
复制算法或Mark-Copy算法将内存分为大小相同的两块,每次只使用其中一块,垃圾回收时将存活的对象复制到另外一块未激活的空间上,标记未激活的空间为已激活,并将已激活空间标记为未激活并清理其中的所有对象。复制算法可以并行的进行对象标记和空间整理,是目前主流的Young GC算法用于新生代的垃圾回收缺点:1.内存使用率不高,每次只有一半的空间可以被使用
老年代中内存区域大对象存活率高使用标记清除或标记压缩算法
验证
Product.class
JDK8中元空间在本地内存中分配,字符串常量池移至堆内存中。启动类加载大量第三方jar包,或Tomcat部署太多应用,大量动态生成发射类,会导致OOM调优参数:-XX:MetaspaceSize -XX:MaxMetaspaceSize
如何判断一个对象是否可回收?JVM 引入GCRoot概念通过可达性分析算法来进行确认,如果一个对象与GC Roots之间没有直接或间接的引用关系,则表示这个对象是可以回收的。什么对象可以做GC Roots?类静态属性中引用的对象常量引用的对象虚拟机栈中引用的对象本地方法栈中引用的对象局部变量表中的对象
线程私有区域,不进行垃圾回收
老年代能否放下
目标代码生成器
本地方法栈
分配对象内存
解析
标记-清除算法该算法从GC Roots触发,依次标记有引用关系的对象,最后将没有引用关系的对象清除缺点:1.产生大量空间碎片,导致需要分配一个大对象是产生Full GC2.标记和清除阶段的效率不高
本地方法库
放置在From/To区
主要使用复制算法进行垃圾回收Eden区装满触发Young GC存活对象进入Survivor区如果超过Survivor区上限 50% 直接进入老年代每次Young GC之后 Eden区与Survivor To区为空
元空间
Stop The World 又称 STW垃圾回收的某个阶段会暂停整个应用程序的执行
分代收集算法
Full GC
-Xss调整每个线程的堆栈大小
新生代中对象存活率低使用复制算法
新生代默认占总堆内存3/1 -Xmn调整年轻代大小
准备
方法
javac指令
读取/写入
0 条评论
下一页