JVM总结
2020-06-22 11:19:32 0 举报
JVM总结
作者其他创作
大纲/内容
返回地址
不能在栈上
PS:STW muti-thread mark cpoying
Old
对象在内存上分配
3. 运算
PS:STW muti-thread mark sweep-compact
根类加载器判断是否自己加在过。加载过直接返回,否则:
4.3 回收算法
灰色节点
操作数栈
对内存进行压缩整理,清理出连续的内存空间
4.4 垃圾回收器
8个字节markword
否
对象内存分配
慢,整理出内存连续
verification
concueernt swqqp
4.4.1 CMS 回收过程
Serial
mark-sweep
应用类加载器判断是否自己加在过。加载过直接返回,否则向上抛
resolution
实例数据(instance data)
loading
b style=\
引用计数
old
线程公有
将非垃圾直接拷贝至“新的区域”
解析:将类中的符号引用转换为直接引用
5. 调优
2.2. 内存区域的划分
没有任何一个JDK版本的默认垃圾回收器是CMS!!!因为使用它,对调优者要求太高了,需要技巧手段来规避其致命的缺点,但是有时候避无可避。
linking
4或8个字节的类型指针指向类对象(ClassPointer)
remark
对垃圾的占位直接标记删除
根类加载器在自己的加载范围内查找类进行加载,如果正常加载则返回,否则委派给子加载器
mark-copying
双亲委派的过程
白色节点
栈帧的局部变量
CMS:Concurrent mark sweep
Garbage first:逻辑上分代,物理上分代,划分出不同的region
标记垃圾的算法
垃圾回收算法
Serial Old
运算
Serial:STW single thread mark cpoying
回收的内存区域
动态链接
程序计数器
CMS的处理方法:把黑的变灰
自身未被标记
主要是针对堆上的eden+from+to+old,metaspace达到限额会触发FullGC并进行扩张
垃圾回收
验证:文件格式校验,需满足jvm规范要求,例如coffebaby
一位标识偏向锁
终态:只有黑的和白的,白的就是垃圾
分配在TLAB
4.1 垃圾回收针对的内存区域
算法:三色标记法
尝试在栈上分配
4位对象age
ExtentionClassLoader
1. 对象为基础数据类型,在栈上分配;2. 如果是“大”对象,在不会返回给其他栈帧引用的情况下(无逃逸),会对“大”对象进行标量替换,替换成各个基本类型数据,然后在栈上分配
ZGC
对齐(padding)【8的倍数】
PN:算法上=PS只不过为配合CMS使用
2. 对象创建
n次回收
from
其他位的存储和锁的状态有关
服务启动流程
三色标记必须解决的问题:此过程是垃圾回收线程和工作线程并发进行,因此要处理这个场景:灰色指向白色的指针没了,黑色多了一个指针指向这个白色
创建对象
黑色节点
direct memory
2.3. 对象在内存上的分配
JVM
内存回收算法
根可达(根搜索)
垃圾回收器
mark-compact
4. 垃圾回收
预备:对类的静态变量赋默认值(“半初始化”)
metaspace
类加载
2.1.1 markword
ParNew
尝试在TLAB分配
BootStrapClassLoader
自身被标记,其属性节点未被全部标记
加载:通过双亲委派模型,将class进行加载
initialzing
Parallel Scavenge
对象
数组
Serial Old:STW single thread mark sweep-compact
自身被标记,并且其属性节点均被标记
进行类加载时,如果有自定义类加载器,则先确认:自定义类加载器是否加在过。加载过直接返回,否则向上抛
Eden
需要解决循环引用问题
调优
STW,由根节点出发单线程进行初始标记
G1的处理方法:把灰到白消失的指针存起来,remark阶段配合RSET进行处理
concurrent mark
应用类加载器在自己的加载范围内查找类进行加载,如果正常加载则返回,否则委派给子加载器
Parallel Old
判断是不是特别大
快,但是浪费地儿
1. 类加载过程
JVM方法栈
AppcationClassLoader
多线程进行并发标记
4.4.2 三色标记算法
CustomerClassLoader
两位锁竞争
native方法栈
运行时,栈帧:
STW 对并发标记过程中产生的垃圾变化进行重新标记
用于eden区域
对象的内存布局
to
用于old区域
G1
preparation
CMS
jvm内存区域划分
ZGC:逻辑上也不分代啦
TLAB 上不行
指定根节点,根据引用搜索
碎片化过于严重时,会触发SerialOld做垃圾回收!!!
扩展类加载器判断是否自己加在过。加载过直接返回,否则向上抛
标记垃圾
4个字节 数组长度(length)
init mark
自定类加载器在自己的加载范围内查找类进行加载,如果正常加载则返回,否则抛出:ClassNotFound
是
2.1. 对象内存布局
扩展类加载器在自己的加载范围内查找类进行加载,如果正常加载则返回,否则委派给子加载器
可以分配
1.1 双亲委派模型
基于双亲委派模型,几个问题
线程私有
相对快,但是产生内存碎片
eden
4.2 如何标记出垃圾
局部变量表
并发标记清理
0 条评论
回复 删除
下一页