JVM
2019-09-22 12:34:35 480 举报
AI智能生成
登录查看完整内容
为你推荐
查看更多
JVM
作者其他创作
大纲/内容
Java 堆溢出
虚拟机栈溢出
本地方法栈溢出
方法区溢出
常量池溢出
本机直接内存溢出
实战
优点:判定效率高
1.引用计数算法
GC Roots\
栈帧中本地变量表中引用的对象
方法区类静态属性引用的对象
方法区中常量引用的对象
方法栈JNI引用的对象
强引用 Object obj = new Object
软引用 有用非必须
弱引用 非必须
虚引用 最弱的引用
作为GC Roots对象
第一次标记 是否执行finalize
第二次标记 finalize方法是否可以和Gc root重新建立关系
不可达对象是否死亡判断
枚举根节点
安全点
安全区域
2.可达性分析算法
对象回收的判断
垃圾回收效率较低
废弃常量
1.该类所有实例都被回收
2.加载该类的ClassLoader被回收
无用类
回收内容
方法区回收
1.首先标记出所有需要回收的对象
2.在标记完成后统一回收掉所有被标记的对象
缺点1:标记和清除过程的效率都不高
缺点2:产生大量不连续的内存碎片
标记清除算法(最基础算法)
1.内存按容量划分为大小相等的两块
3.将都是垃圾对象的那块清空内存
缺点1:在对象存活率较高时,复制操作次数多,效率降低
缺点2:內存缩小了一半;需要額外空间做分配担保(老年代)
复制算法
1.标记步骤和标记清除算法相同
标记整理算法
新生代
标记-清理或者标记-整理
老年代
分代收集算法
垃圾收集算法
单线程
Serial(最基本的收集器)
Serial的多线程版本
ParNew收集器
新生代收集器
吞吐量较高
多线程
Parallel Scavenge收集器
Serial的老年代版本
Serial Old收集器
Parallel的老年代版本
Parallel Old收集器
回收停顿时间短
标记-清除
1.初始标记
2.并发标记
3.重新标记
4.并发清除
CMS收集器
并行并发
分代收集
空间整合
可预测停顿
G1收集器
垃圾收集器
GC日志最前面时间是虚拟机启动以来经过的秒数
【GC 【Full GC 垃圾收集的停顿类型
GC日志
垃圾回收
什么是类的加载机制
1.通过类的全限定名称获取此类的二进制流
2.将这个二进制字节流所代表的静态存储结构转化为方法区的运行时数据结构
5.加载和连接是交叉进行的
加载
确保Class文件的字节流中包含的信息符合当前虚拟机要求
文件格式验证
元数据验证
字节码验证
符号引用验证
验证
为类变量分配内存并设置类变量初始值
准备
1.类或接口的解析
2.字段解析
3.类方法解析
4.接口方法解析
解析
连接
收集类中所有类变量的赋值动作和静态语句块中的合并语句
子类的clinit()执行之前,父类clinit()一定执行完成
不会执行父接口的(),除非要使用父接口中定义的变量
执行构造器 <clinit>
初始化
使用
卸载
类加载的生命周期
将虚拟机识别的类库加载到内存
启动类加载器(引导类加载器)(虚拟机中的一部分)
扩展类加载器
负责加载ClassPath上指定的类库
应用程序类加载器
自定义类加载器
其他的类加载器(独立于虚拟机外部)
工作过程
沙箱安全机制:自己写的java.lang.String.class类不会被加载,这样便可以防止核心API库被随意篡改
避免类的重复加载:当父亲已经加载了该类时,就没有必要子ClassLoader再加载一次,保证被加载类的唯一性
优点
双亲委派模型
类加载器
类加载机制
局部变量表
操作数栈
动态连接
方法返回地址
运行时栈帧结构
静态分派
分派
虚拟机字节码执行引擎
分支主题
1.较小的内存
2.当前线程执行的字节码行号指示器
3.字节码指示器:通过改变这个计数器的值来选取下一条需要执行的指令
4.线程私有
6.不会内存溢出
程序计数器PCR
1.线程私有
2.生命周期和线程相同
C.所需的内存在编译器就确定
1.局部变量表
2.操作数栈
3.动态连接
4.返回地址
A:线程请求的栈深度大于虚拟机允许的深度
5.异常情况
3.每个方法创建栈帧
java虚拟机栈
2.执行的是native方法
3.异常情况和虚拟机栈相同
本地方法栈
1.jvm中内存最大的一块
2.线程共享
3.存放对象实例
4.垃圾回收的主要区域
1.Eden
2.From Survivor
3.To Survivor
5.新生代
6.老年代
7.多个线程私有的分配缓存区TLAB
8.物理上不连续的内存空间
9.异常:内存溢出
Java 堆
1.线程共享
3.运行时常量池(存储编译器生成的字面量和符号引用)
(永久代)方法区
运行时数据区域
NIO中使用这块内存居多
非堆内存受总内存大小限制
直接内存
A:检查这个指令的参数能否在常量池中找到类的符号引用
C:没有的话先进行类加载过程
1.new 指令创建对象
A:指针碰撞
B:空闲列表
同步
按照线程划分在不同的空间TLAB
D:并发情况下线程不安全
2.分配内存方式
第二部分类型指针(通过这个指针确定是哪个类的实例)
数组的话还存储数据的长度
A:对象头
存储顺序受分配策略的影响:相同宽度的字段总是被分配到一起
父类中的字段信息在子类之前
B:实例数据
虚拟机要求对象大小是8字节的整数倍
C:对齐填充
3.对象的内存布局
直接指针访问 详细看对象指针图 优点:速度块
4.对象的访问定位
对象的创建
对象主要分配在新生代的Eden区域
年轻代
大对象直接进入老年代
1.虚拟机给对象添加年龄计数器
2.动态年龄判断
3.空间分配担保
长期存活的对象进入老年代
内存分配策略
jps 显示指定系统内所有的虚拟机进程
jstat 监视虚拟机各种运行状态的信息
jmap 生成堆转储快照
jhat 虚拟机堆转储快照分析工具
jstack 生成虚拟机当前时刻的线程快照
常用的工具
由无符号数和表构成
class文件是一组以8字节为基础单位的二进制流
类文件结构
JVM
0 条评论
回复 删除
下一页