JVM
2023-08-11 14:08:56 0 举报
AI智能生成
深入理解jvm的相关参数
作者其他创作
大纲/内容
直接内存回收流程:只能等老年代满了后触发Full GC,顺便清理直接内存
JVM性能调优
魔数:class文件头4个字节,表明文件的类型
版本信息
常量池
访问标志
类索引、父类索引、接口索引集合
字段表集合
Class文件结构
类文件结构
通过类的全限定名获取该类的二进制字节流
将二进制字节流所代表的静态结构转化成方法区的运行时数据结构
在内存中创建Class对象,作为方法区的数据访问入口
加载
验证
准备
解析
连接
初始化
使用
卸载
类的生命周期
启动类加载器 Bootstrap ClassLoader
扩展类加载器 Extension ClassLoader
应用程序类加载器 Application ClassLoader
类型
JVM初始化加载
Class.forName()动态加载
ClassLoader.loadClass()动态加载
类加载方式
类加载器
虚拟机加载的类信息
常量:存放在运行时常量池
静态变量
即时编译后的代码
方法区:永久代,回收效率低
Eden:8
From Survior:1
To Survior:1
新生代
老年代
堆
直接内存(堆外内存):java虚拟机之外的内存,NIO会用到
线程共享
本地方法栈:为JVM运行Native方法准备的空间
局部变量表:大小在编译时确定,不会变动
操作数栈
动态链接
方法出口信息
栈帧区域
StackOverFlowError:不允许动态扩展情况下,线程请求栈的深度超过当前JAVA虚拟机的最大深度
OutOfMemoryError:允许动态扩展情况下,线程请求栈内存使用完了,不能动态扩展
异常
虚拟机栈
程序计数器:唯一不会内存溢出的区域
线程独占
哈希码
GC分代年龄
锁状态标志
线程持有的锁
偏向线程ID
偏向时间戳
指针碰撞:针对使用复制和标记整理算法实现的业务,内存是大块的
空闲列表:针对内存都是小空间,需要维护内存列表处理
对象分配内存方式
句柄方式:需要通过引用类型的变量找到句柄进而找到对象
直接指针:去除句柄池,直接通过应用类型访问对象,但需要额外策略存储对象在方法去中类信息的地址
对象访问 方式
对象头
实例数据:成员变量的值,包含父类和本类
对齐填充:补全字节数,提供占位符作用
内存布局
JVM内存结构
引用计数器法:很难解决对象直接循环引用的关系
java虚拟机栈(栈帧中的本地变量表)中引用的对象
本地方法栈中引用的对象
方法区中常量引用的对象
方法区中类静态属性引用的对象
可达性分析法:所有和GC Roots关联的都是有效对象
判断对象是否存活
强引用:new对象的数据,gc永远不会回收被引用的对象
软引用:在jvm内存不足时会触发回收,常用于实现内存敏感的缓存
弱引用:不论内存是否充足jvm都会回收
虚引用
引用分类
回收队中无用对象:finalize()方法会将对象放入F-Queue队列,但是如果资源需要耗时,立即停止
标记清除算法:效率不高,会产生内存碎片
复制算法(新生代):内存空间降低一半
标记整理算法(老年代)
新生代:复制算法
老年代:标记清除算法,标记整理算法
分代收集算法
垃圾回收算法
垃圾收集策略及算法
Serial垃圾收集器(单线程)
ParNew垃圾收集器(多线程):追求降低用户停顿时间
Parallel Scavenge垃圾收集器(多线程):追求CPU吞吐量,较短时间完成任务
新生代垃圾收集器
Serial Old垃圾收集器(单线程)
Parallel Old垃圾收集器(多线程)
初始标记
并发标记
重新标记
并发清除
老年代垃圾收集器
最终标记
筛选回收
HotSpot垃圾收集器
MinorGC:回收新生代
Major GC/Full GC:回收老年代,Full GC速度比MinorGC慢十倍
对象优先在Eden分配
大对象直接进入老年代
长期存活的对象进入老年代
动态对象年龄判定:
空间分配担保:通过清除老年代废弃数据来扩大老年代空闲空间,以便给新生代做担保
System.gc()调用
老年代空间不足
永久代空间不足
CMS GC出错
统计的Minor GC晋升到旧生代的平均大小大于老年代的剩余空间
触发Full GC的原因
内存分配和回收策略
JVM
0 条评论
回复 删除
下一页