JVM
2021-04-16 11:19:54 0 举报
JVM总结
作者其他创作
大纲/内容
ZGC
TLAB(线程私有)
方法返回地址
来回切换
堆
与虚拟机栈相似
对齐填充
设置对象头
1.类加载检查 - 首先去检查这个指令的参数是否能在常量池中定位到一个类的符号引用, - 检查这个符号引用代表的类是否已被加载、解析和初始化过。2.内存分配 在类加载检查通过后,接下来虚拟机将为新生对象分配内存。对象所需内存的大小在类 加载完成后便可完全确定,为 对象分配空间的任务等同于把 一块确定大小的内存从Java堆中划分出来。 - 指针碰撞(Bump the Pointer)(默认用指针碰撞) - 空闲列表 解决并发问题 - CAS,失败重试 - TLAB 本地线程分配缓冲 3.初始化 内存分配完成后,虚拟机需要将分配到的内存空间都初始化为零值(不包括对象头),如果使用TLAB,这一工作过程也 可以提前至TLAB分配时进行。4.设置对象头 - MarkWord、类型指针、数组长度5.执行<init>方法
对象实例
类元信息
执行<init>
字符串常量池
CMS:标记清除算法,并发收集器,它第一次实现了让垃圾收集线程与用户线程 (基本上)同时工作初始标记:STW,并记录下gc roots直接能引用的对象,速度很快。 并发标记:因为用户程序继续运行,可能会有导致已经标记过的对象状态发生改变font color=\"#ff3333\
本地方法栈
S1
三色标记
大对象直接进入老年代
引用计数法
老年代
老年代空间分配担保机制
类型指针
符号引用
类加载检查
ParNew跟parallel类似,主要区别就是,可以配合CMS使用
方法区(元空间)
class类元数据
实例数据
用于存放方法参数和方法内部定义的局部变量(基本类型、对象引用reference、returnAddress),容量以变量槽(Variable Slot,称 Slot)为最小单位
方法出口
类型信息类型的常量池( constant pool)域(Field)信息方法(Method)信息除了常量外的所有静态变量对类加载器的引用对Class类的引用方法表
MarkWord
长期存活的对象将进入老年代
运行时常量池
栈帧...
GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等
对象动态年龄判断
数组长度(数组)
对象创建过程
多标:浮动垃圾
GC
年轻代
可达性分析算法
线程
标记-清除算法
局部变量表
1.文本字符串 2.八种基本类型的值 3.被声明为final的常量等
java虚拟机
新生代(1/3)--MinorGC
后入先出栈(LIFO),出栈/入栈操作:从局部变量表或对象实例的字段中复制常量或变量写入到操作数栈,出栈到局部变量表或者返回给方法调用者
S0
JIT
Serial old
分配内存
字面量
serial:单线程、stw、新生代复制算法,老年代标记整理算法
每个栈帧都包含一个指向运行时常量池中该栈所属方法的符号引用,持有这个引用的目的是为了支持方法调用过程中的动态连接(Dynamic Linking),这些符号引用一部分会在类加载阶段或者第一次使用时就直接转化为直接引用,这类转化称为静态链接。另一部分将在每次运行期间转化为直接引用,这类转化称为动态连接
对象头
标记-复制算法
ParNew
G1
new
栈帧
垃圾判断
动态链接
CMS
垃圾收集底层算法实现
标记-整理算法
虚拟机栈
垃圾回收-分代回收
Serial
类加载
对象引用
程序计数器
漏标:增量更新、原始快照STAB、读写屏障.CMS:写屏障+增量更新G1、Shenandoah:写屏障+STABZGC:读屏障为什么CMS引用增量更新G1用STAB
记忆集与卡表 卡表:cardtable记录跨代引用
老年代 2/3
垃圾回收算法
1.类和方法的全限定名 2.字段的名称和描述符 3.方法的名称和描述符。
垃圾收集器
CMS的相关核心参数 1. -XX:+UseConcMarkSweepGC:启用cms 2. -XX:ConcGCThreads:并发的GC线程数 3. -XX:+UseCMSCompactAtFullCollection:FullGC之后做压缩整理(减少碎片) 4. -XX:CMSFullGCsBeforeCompaction:多少次FullGC之后压缩一次,默认是0,代表每次FullGC后都会压缩一 次 5. -XX:CMSInitiatingOccupancyFraction: 当老年代使用达到该比例时会触发FullGC(默认是92,这是百分比) 6. -XX:+UseCMSInitiatingOccupancyOnly:只使用设定的回收阈值(-XX:CMSInitiatingOccupancyFraction设 定的值),如果不指定,JVM仅在第一次使用设定值,后续则会自动调整 7. -XX:+CMSScavengeBeforeRemark:在CMS GC前启动一次minor gc,目的在于减少老年代对年轻代的引 用,降低CMS GC的标记阶段时的开销,一般CMS的GC耗时 80%都在标记阶段 8. -XX:+CMSParallellnitialMarkEnabled:表示在初始标记的时候多线程执行,缩短STW 9. -XX:+CMSParallelRemarkEnabled:在重新标记的时候多线程执行,缩短STW;
eden(8/10)
当前线程执行的字节码指令的行号(地址)
Parallel
初始化
运行时数据区
parallel:serial多线程版本,多线程并行、stw、新生代复制算法,老年代标记整理算法。关注点是吞吐量(高效率的利用CPU)。CMS等垃圾收集器的关注点更多的是用户线程的停 顿时间(提高用户体验)。JDK8 默认
使用Java 8以后,关于元空间的JVM参数有两个:-XX:MetaspaceSize=N和 -XX:MaxMetaspaceSize=N,对于64位JVM来说,元空间的默认初始大小是20.75MB,默认的元空间的最大值是无限。调整元空间的大小需要Full GC,如果应用在启动的时候发生大量Full GC,通常都是由于永久代或元空间发生了大小调整,基于这种情况,一般建议在JVM参数中将MetaspaceSize和MaxMetaspaceSize设置成一样的值,并设置得比初始值要大, 对于8G物理内存的机器来说,一般都设置为256M
操作数栈
Parallel old
0 条评论
回复 删除
下一页