JVM
2021-05-08 13:51:50 0 举报
AI智能生成
Jvm模型
作者其他创作
大纲/内容
Class
Constant Pool常量池
字面量(文本字符串、final常量值)
符号引用
类和接口的全限定名
字段的名称和描述符
方法的名称和描述符
垃圾回收器算法
Eden+survivor0+Survivor1
默认比例8:1:1,可用空间90%,避免内存碎片
回收过程 Eden+S 0-> S1 或者 Eden+S1->S0
ParNew算法
什么时候触发回收: 当Eden快满的时候
如何设置系统JVM参数
1. 系统每秒处理多少请求?
2. 每次请求处理多长时间?
3. 每次请求创建多大内存的对象?
4.运行多长时间会触发一次Minor GC?
加载过程
加载
通过类的全限定名获取二进制字节流
在内存生成一个代表这个类的对象java.lang.Class
来源: ZIP包中,jar war ear
动态代理,java.lang.reflect
Proxy接口 ProxyGenerator.generateProxyClass
数组不同过类加载器创建,由java虚拟机直接创建
准备
类变量(静态变量) 分配内存,初始值,分配在方法区
初始化
实例变量初始化,分配在Heap
执行<clinit>: 类变量赋值、静态代码块
接口,不回主动执行父类<clinit>方法
解析
类加载器
类加载器+类 确定唯一性
比较类对象
equals()
isAssignableFrom
isInstance()
instanceOf
启动类加载器
Bootstrap ClassLoader
类加载器 java语言实现,继承自抽象类 java.lang.ClassLoader
运行模型
对象什么时候会进入老年代?
1. 年龄代>=15
2. 动态年龄判断,年龄代n之前所有的对象之和大于50%,把n代及之后的对象放入老年代
3. 设置的大对象参数-XX:PretunureSizeThreshold,大于这个参数的直接进入老年代
4. 老年代空间分配担保机制:Minor GC之前,判断一下老年代的可用空间是否大于新生代所有对象之和,老年代可用空间是否大于历次minor GC进入老年代的平均大小? 满足其中一个就会进入老年代
5. 存活对象没办法放入另一个Survivor里面
什么时候会触发Full GC
1. Minor GC之前,检查发现老年代空间可能不够放下
2. Minor GC之后,对象放不下老年代
如何优化新生代
1. 每秒有多少内存对象产生?
2. 多久会产生一次Minor GC?
3. Minor GC之后还存活多少对象?
4. Survivor是否放得下?
5. 会不会因为放不下频繁进入老年代?
6. 会不会因为动态年龄判断进入老年代?
如何优化老年代
1.对象什么时候会进入老年代?
2. 长期存在的对象会有多少?
3. 多久发生一次Full GC?
4. 什么时候会发生concurrent Mode failure ?
当Full GC,碰巧有一堆对象要进入老年代,放不下的时候,会切换成Serial Old模式,STW
5. 会不会频繁发生对象进入老年代?
G1
region大小=总大小/个数,设置参数: -XX:G1HeapRegionSize
新生代如何分配?起始默认5%,最多不超过60%;Eden:Survivor设置参数-XX:SurvivorRatio
设置最大停顿时间, -XX:MaxGCPauseMillis
超过一个region 50%的判断为大对象
1. 什么时候发生Minor GC
根据设置的MaxGcPauseMillis,统计追踪了内存的回收时间;当达到这个内存阈值的时候启动一次Minor GC
2. 什么时候发生Mixed GC
当老年代的内存空间大于总堆内存的45%的时候
0 条评论
下一页