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