JVM_03-0对象的创建和回收
2022-09-06 10:29:55 0 举报
AI智能生成
JVM_03-0对象的创建和回收
作者其他创作
大纲/内容
对象内存回收
引用计数法
可达性分析算法
GC Roots
线程栈的本地变量
静态变量
本地方法栈的变量
常见引用类型
强引用
软引用
弱引用
虚引用
finalize()方法最终判定对象是否存活
对象内存分配
对象内存分配流程图
对象栈上分配
逃逸分析
没有逃逸出方法的对象可以直接分配在栈内存里,当方法结束时跟随栈内存一起被回收掉。
JDK7之后默认开启逃逸分析,如果要关闭使用参数(-XX:-DoEscapeAnalysis)
开启逃逸分析参数(-XX:+DoEscapeAnalysis)
标量替换
通过逃逸分析确定该对象不会被外部访问
并且对象可以被进一步分解时
JVM不会创建该对象,而是将该对象成员变量分解若干个被这个方法使用的成员变量所代替
这些代替的成员变量在栈帧或寄存器上分配空间,这样就不会因为没有一大块连续空间导致对象内存不够分配
对象在Eden区分配
大多数情况下,对象在新生代中 Eden 区分配
Eden 区没有足够空间进行分配
发起一次Minor GC
Minor GC/Young GC
指发生新生代的的垃圾收集动作,Minor GC非常频繁,回收速度一般也比较快
Major GC/Full GC
一般会回收老年代 ,年轻代,方法区的垃圾,Major GC的速度一般会比Minor GC的慢10倍以上
Eden与Survivor区默认8:1:1
大对象直接进入老年代
参数 -XX:PretenureSizeThreshold 可以设置大对象的大小
参数只在 Serial 和ParNew两个收集器下有效
G1有单独的大对象定义
大对象尽早的进入老年代,要不然在年轻代挪过来挪过去,会造成年轻代不够用频繁的GC
长期存活的对象将进入老年代
每一个对象年龄有(Age)计数器。
如果对象在 Eden 出生并经过第一次 Minor GC 后仍然能够存活,并且能被 Survivor 容纳的话,将被移动到 Survivor 空间中
将对象年龄设为1
对象在 Survivor 中每熬过一次 MinorGC
年龄就增加1岁
它的年龄增加到一定程度,就会被晋升到老年代中
默认为15岁
CMS收集器默认6岁
不同的垃圾收集器会略微有点不同
参数 -XX:MaxTenuringThreshold
设置晋升到老年代的年龄阈值
对象动态年龄判断
老年代空间分配担保机制
对象的创建
类加载检查
分配内存
分配方法
“指针碰撞”(Bump the Pointer)
Java堆中内存是绝对规整的
所有用过的内存都放在一边,空闲的内存放在另一边
中间放着一个指针作为分界点的指示器
“空闲列表”
Java堆中的内存并不是规整
已使用的内存和空 闲的内存相互交错
虚拟机就必须维护一个列表,记录上哪些内存块是可用的
解决并发问题的方法
CAS(compare and swap)
CAS配上失败重试的方式
TLAB
每个线程在Java堆中预先分配一小块内存
-XX:+/-UseTLAB参数来设定虚拟机是否使用TLAB
JVM会默认开启
-XX:TLABSize 指定TLAB大小
默认大小伊甸园的1%
初始化
设置对象头
对象在内存中存储的布局
对象头(Header)
MarkWord
32位占4字节
64位占8字节
KlassPointer类型指针
开启指针压缩占4字节
关闭指针压缩占8字节
数组长度
4字节,只有数据对象才有
实例数据(Instance Data)
对齐填充(Padding)
loss due to the next object alignment
保证对象是8个字节的整数倍(计算机最优的寻址算法)
java对象的指针压缩
jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩
jvm配置参数
哪些信息会被压缩
对象的全局静态变量(即类属性)
对象头信息:64位平台下,原生对象头大小为16字节,压缩后为12字节
对象的引用类型:64位平台下,引用类型本身大小为8字节,压缩后为4字节
对象数组类型:64位平台下,数组类型本身大小为24字节,压缩后16字节
执行<init>方法
0 条评论
下一页