jvm
2022-03-09 19:14:43 0 举报
Java虚拟机
作者其他创作
大纲/内容
大量的类信息导致溢出
HotSpot的算法实现细节
Full GC
局部变量表
筛选对象是否有必要执行finalize()方法
本地方法栈
常量池
判别方法
对齐填充
obj1的引用指向obj2的实例
使用句柄访问
一块确定大小的内存块从Java堆中划分出来
对象的访问定位
并发的可达性分析
为对象分配空间
没有必要执行
obj1
类加载完成之后,将每个class常量池中的符号引用值转存到运行时常量池中
标记清除算法
obj3
对象的内存布局
内存分配和回收都具备font color=\"#f57c00\
CMS收集器
若使用NIO或者直接/间接使用了DirectMenory
暂停即STW
产生条件- 线程请求的栈深度大于虚拟机所允许的最大深度- 栈帧太大
任何一个对象的finalize()方法只会被系统调用一次
并发失败的应急预案:1.冻结用户线程的执行2.临时启用SerialOld收集器来进行老年代的垃圾收集
每次回收只关注如何保留少量存活而不是去标记那些大量将要被回收的对象
Java VM中涉及
Class文件结构
这两个参数在JDK 9开始废弃
每个线程在Java堆中设置本地线程分配缓冲
Serail的多线程并行版本
基本思路
作用
常量池的字面量,指的是数据的值
强分代假说
吞吐量就是处理器用于运行用户代码的时间与处理器总消耗的时间的比值
记忆集与卡表
obj2的引用指向obj3的实例
运行时数据区域 (Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域 )
堆内存溢出
实例数据
符号引用主要设涉及编译原理方面的概念
运行时常量池可用于获取类信息
没有则进行相应的类加载过程(第7章)
新生代收集器单线程客户端模式下默认新生代收集器
熬过越多次垃圾收集过程的对象就越难以消亡
reference中存储的是对象地址
Appel式回收
虚拟机栈的reference中存储的是句柄地址
本地方法栈中JNI(Native方法)引用的对象
Parallel Old是Parallel Scavenge的老年代版本Parallel Old也是注重吞吐量
具体的访问方式有两种
font color=\"#f57c00\
魔数与Class文件的版本
MinorGC
在常量池中定位类的符号引用
直接内存
后面有些数据需要用0表达\"不引用任何一个常量池项目\"的含义
本机内存溢出
被同步锁(synchronized)持有的对象
Parallel Scavenge收集器
针对老年代设计
允许
JDK 5 CMS收集器当老年代使用了68%的空间就会被激活 -XX:CMSInitiatingOccu-pancyFraction 这个参数可用来提高CMS的触发百分比
引用强度逐渐减弱
字段的名称和描述符
3. 在内存中生成一个类代表这类的java.lang.Class对象,作为方法区这个类的各种数据访问的入口
分配内存空间时有同步问题
内存溢出
ParNew收集器
各个运行时区域内存分配概述
绝大多数对象都是朝生夕灭
2. 将这个字节流所代表的静态储存结构转化为方法区的运行时数据结构
对象头
- 新生代收集器- 使用多条线程进行垃圾收集- 其余的行为与Serial完全一致- 运行在服务端模式下的HotSpot VM的首选新生代收集器- 能与CMS收集器配合
遇到new指令
成立
产生StackOverflow
OOMPermGen space
卡表在高并发状态会有\"伪共享\
字符串常量池
常量,如使用final修饰的值(包括静态变量、实例变量和局部变量)
一个接口的多个实现类需要的内存可能会不一样一个方法所执行的不同条件分支所需要的内存也可能不一样
- 老年代收集器- 单线程- 供客户端模式下使用
在对象头中设置类型指针指向对应类型数据的地址
跨代引用假说
引用分类
1. 通过一个类的“全限定名”来获取此类的二进制字节流
类对象和普通的实例对象是不同的,类对象是在类加载的时候生成的,普通的实例对象一般是在调用new之后创建
继续检查老年代最大可用连续空间是否大于历次晋升到老年代对象的平均大小
分代收集名词
- 存放编译后的类信息- 是方法区的一部分- 每个class都有-运行时常量池相对于class文件常量池的另外一个特性是具备动态性,java语言并不要求常量一定只有编译器才产生,也就是并非预置入class文件中常量池的内容才能进入方法区运行时常量池,运行期间也可能将新的常量放入池中
运行时常量池
Mark Word
设计原则
唯一作用是确定这个文件是否为一个能被虚拟机接受的Class文件
G1收集器
无符号数(基本数据类型)
解决标记清除算法面对大量可回收对象执行效率低的问题
不允许
在对象中添加一个引用计数器
Java程序视角
对象真正存储的有效信息
同时兼顾了垃圾收集的时间开销和内存空间的有效利用
判定对象是否被回收过程
Java虚拟机空间是否规整由所采用的垃圾收集器是否带有空间压缩整理的能力决定
方法区和运行时常量池溢出
obj3的引用指向obj1的实例
- 存在于方法区(method are)- 每个VM中只有一份- 类加载完成,经过验证、准备阶段之后存放在字符串常量池中
- 老年代收集器span style=\"font-size: inherit;\
回收方法区
局部变量槽
经典垃圾收集器内存回收的实践者
虚拟机栈和本地方法栈溢出
GCroots 根对象作为起始节点集
Java 堆的不确定性
以后发生Minor GC只有包含了跨代引用的小块内存里的对象才会被加入到GC roots进行扫描
B
代表有21项常量值
假说奠定了设计原则
包括class文件元信息描述、编译后的代码数据、引用类型数据、类文件常量池
虚拟机先查看-XX:HandlePromotionFailure参数的设置值是否允许担保失败
动态年龄判定
对分配到的内存空间进行初始化零值
方法的名称和描述符
长期存活的对象将进入老年代
分代假说
虚拟机栈中引用的对象
Java对象在虚拟机的创建
小于
运行时常量池
主要回收两部分内容
obj2
不是永远都必须达到年龄阈值才进入老年代
命名以_info结尾
Java堆
初始化
引用计数式垃圾收集/直接垃圾收集
类和接口的全限定名
Serial Old收集器
新生代收集器多线程
表(由多个无符号数或其他表作为数据项构成的符合数据结构)
程序计数器
基本流程创建字符串之前检查常量池中是否存在,如果存在则获取其引用,如果不存在则创建并存入,返回新对象引用
类加载过程
处理方法对Dump出来的堆转储快照进行分析
JDK 7以上提示OOMJava heap space
分类
标记整理算法
一系列连续的某一类型的数据为某一类型的集合
对象继续存活
一般老年代进行担保
- jdk6及以前字符串常量池中存放的是字符串常量- 存放位置为永久代
虚拟机栈
异常情况
指定指令: -XX:MaxDirectMemorySize不指定则默认与Java堆最大值一致(由- Xmx指定)
弱分代假说
包含了class文件常量池进入运行时常量池的过程
字面量
分代收集理论
class文件中除了包含类的版本、字段、方法、接口等描述信息外,还有一项信息就是 常量池(constant pool table),用于存放编译器生成的各种字面量(Literal)和符号引用(Symbolic References)
类型指针即对象指向它的类型元数据的指针(使用直接指针访问对象时)
不从0开始计数的原因?
对象死亡
跨代引用相对于同代引用来说仅占极少数
Class文件是一组以字节为基础单位的二进制流
JDK6 提示OOMPermGen space
比如0x0016=22
栈帧分配多少内存在编译器就可知
年龄大于等于该年龄的对象就可以直接进入老年代
参数类型+返回值类型
不要求虚拟机在方法区中实现垃圾收集
引用指向对象
常量池/class文件常量池/静态常量池
半区复制的垃圾收集算法
希望引用还可以描述一类对象
内存泄漏
Java程序会通过栈上的Reference数据操作堆上的具体对象
Parallel Old收集器
A
- jdk7字符串常量池中存放的是指定字符串首次出现的引用- 存放位置为Java堆
OOM
标记复制算法
主要用于在运行时解析得到类的直接引用
本质差异是前者是移动式的后者是非移动式的垃圾收集算法
大对象直接在老年代分配
部分收集/Partial GC- 新生代收集/Minor GC/YoungGC- 老年代收集/Major GC/Old GC 只有CMS会有这种行为- 混合收集/Mixed GC G1收集器会有这种行为整堆收集/Full GC 收集整个Java堆和方法区的垃圾收集
运行时常量池中字符串常量池溢出
垃圾收集算法内存回收的方法论
指向句柄池中的对应句柄
.......
垃圾收集算法
Serial收集器
采用CAS配失败重试的方式保证更新操作的原子性
引用计数法
常量池存放的内容:存放两大类常量:字面量和符号引用
- 不是必然存在的- 没有特别的含义仅仅起占位符的作用- 因为HotSpot虚拟机的自动内存管理系统要求对象起始地址必须是8字节的整数倍
加载
内存分配策略
可达性分析法Java语言采用
类加载的“解析阶段”还会将这些符号引用所翻译出来的直接引用(直接指向实例对象的指针)存储在 运行时常量池 中
对象没有finalize()方法
默认容量为1009-XX:StringTableSize通过这个参数可以指定字符串常量池的容量
符号引用
文件格式采用类似C语言结构体的伪结构来存储数据
常量池入口
- 下面的关注点/目标是吞吐量- 下面的收集器有自适应调节策略
固定可作为GC roots的对象
字段也就是类或者接口中声明的变量,包括类级别变量(static)和实例级的变量
C
追踪式垃圾收集/间接垃圾收集
方法区
句柄池中的句柄包含了对象实例数据与类型数据的地址信息
设置对象头信息
堆栈信息OOMJava heap space
finalize()方法已经被虚拟机调用过
各个数据项的具体含义
反映虚拟机内部情况的JMXBean...
有必要执行
使用直接指针访问
Java堆中有句柄池
不成立
0 条评论
回复 删除
下一页