zg-JVM总结
2021-04-13 10:09:12 23 举报
AI智能生成
zg-JVM总结
作者其他创作
大纲/内容
JVM流程
jvm执行流程
编译class类文件
运行jvm
类加载
加载
验证
准备
解析
初始化
静态变量赋值
执行静态代码块
什么时候初始化一个类
包含main方法
new 对象的时候
继承父类,要初始化父类
反射调用
jdk1.7动态语言
使用
卸载
类的加载器和双亲委派
启动类加载器Bootstrap ClassLoader
扩展类加载器Extention ClassLoader
应用程序类加载器 Application ClassLoader
自定义类加载器
双亲委派模型
避免多层级的加载器结构重复加载类
先去父类找已经加载的类是否存在,如果父类不存在则继续上推父类,顶级父类不存在则授权下级的加载器重新加载
什么是双亲委派
为什么需要双亲委派
字节码执行引擎
垃圾回收算法
标记清除
原理
缺点
压缩算法
方式
缺点
复制算法
回收方式,将内存一分为二,将存活对象放到存活区域,清理垃圾区域
缺点:内存空间没有有效利用
优化算法: 新生代划分三个区域;Eden区,surver1区、surver2区
优点:提升回收效率
垃圾回收
可达性分析算法
GC ROOTS
方法的局部变量
类的静态变量
垃圾回收触发的条件
新生代满
老年代满
哪些变量引用的对象不能被回收
方法的局部变量
类的静态变量
java对象的引用类型
强引用
一个变量引用一个对象,强引用的对象不会被回收
软引用
jvm内存不够才会回收
弱引用
每次gc就会回收
虚引用
管理堆外内存
finalize
年轻代对象到老年代条件
MaxTenuringThreshold 幸存者年龄达到15岁
动态对象年龄:年龄1(20%)+年龄2(31%) + 年龄3(10%) 大于幸存空间的一半,那么就会把 这个年龄及以上 对象放入老年代 年龄2 和年龄3 进入老年代
年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n以上的对象都放入老年代
超大对象直接放入老年代 PretenureSizeThreshold
伊甸园的 存活对象太大,大于幸存内存区域,直接放入老年代
老年代空间担保分配规则
minorGC 前的判断
老年代垃圾回收算法
标记整理算法
原理
1、标记垃圾对象 2、将存活的对象紧凑的放在一起,防止产生碎片 3、清理垃圾
缺点
STOP THE WORLD
在 Minor GC和 FULL GC 的时候会停止程序的运行,然后垃圾回收器创建一个垃圾回收线程,并选择垃圾回收算法开始进行垃圾回收
垃圾回收器
新生代
复制算法
ParNew
-XX:+UseParNewGC
Serial
老年代
标记清除算法
CMS
1/初始标记,STOP THE WORLD,标记出GC ROOT 引用的对象
2、并发标记,对已有的GC ROOT 进行追踪,不会停止线程的工作
3、 ,重新标记 进入STOP THE WORLD,对变动过的对象重新标记
4、并发清理
CMS 造成的问题
内存碎片,因为采用了标记清理算法
对CPU资源敏感,抢占cpu
浮动垃圾:在并发标记阶段,产生了新的垃圾,因为 在并发标记阶段,原来可达的对象变得不可达了, 为什么 重新标记没有作用,因为假如并发标记 创建了对象gc root因为需要重新找gcroot 开始遍历,增加重新标记的开销
分支主题
子主题 1
CMS触发时机,
JDK1.6 默认92%触发CMS
Concurrent Mode Failure
并发清理过程中,新生代到老年代的并发内存空间占满,将会触发Concurrent Mode Failure
自动采用Seria OLd 代替cms
CMS 的内存碎片
开启碎片整理 ,会再触发一下stop the word-XX:+UseCMSCompactAtFullCollection
分支主题
子主题 2
触发老年代FUll GC 的条件
1、年轻代Minor GC 前 清理的全部对象大小大于老年代剩余内存大小,没有设置空间担保策略
2、设置了空间担保策略,但是年轻代gc每次平均存活的内存大小大于老年代的内存大小
3、minor gc 后存活对象的内存大小大于 survivor区域大小,并 大于 老年代的内存大小
4、老年代的可用空间内存小于设定的比例,触发full gc jdk1.6 是92% -XX:CMSInitiatingOccupancyFaction
G1
特点:
把java堆内存拆分成大小相等的多个Regin
设置垃圾回收的预期停顿时间
核心设计思路
把内存拆分成多个大小的Regin
追踪每个Regin 的内存大小以及回收的预估时间
回收时控制垃圾回收的时间在预估范围内,同时回收尽可能多的垃圾对象
参数
使用G1 -XX:+UseG1GC 每个region 大小%2048,必须是2的倍数
XX:G1NewSizePercent 设置新生代内存大小 初始状态默认是5%
-XX:G1MaxNewSizePercent 新生代不超过60%
新生代回收后region 的数量会减少
-XX:SurvivorRatio 定义Eden 和Survivor 的区域,默认是8 代表 Eden 占用80% 两个survior 各占10%
问题
每个Regin多大
新生代有多少Regin
新生代如何动态增加regin
eden和surivo的分配
什么时候垃圾回收
垃圾回收算法
G1 特有的停顿时间的作用
什么时候对象进入老年代
大对象的存放?
参数调优
-XX:+CMSParallelInitialMarkEnabled表示在初始标记的多线程执行,减少STW;
-XX:+CMSScavengeBeforeRemark:在重新标记之前执行minorGC减少重新标记时间;
-XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,降低STW;
-XX:CMSInitiatingOccupancyFraction=92和-XX:+UseCMSInitiatingOccupancyOnly配套使用,如果不设置后者,jvm第一
次会采用92%但是后续jvm会根据运行时采集的数据来进行GC周期,如果设置后者则jvm每次都会在92%的时候进行gc;
-XX:+PrintHeapAtGC:在每次GC前都要GC堆的概况输出
分支主题 8
自由主题
0 条评论
下一页