JVM对象创建与内存分配机制深度剖析

一、对象的创建

1、类加载检查

2、分配内存

(1)划分内存的方法:

1)指针碰撞(默认)

2)空闲列表

(2)解决并发问题的方法:

1)CAS(compare and swap)

2)本地线程分配缓冲

3、初始化零值

4、设置对象头

对象在内存中存点布局可以分为3块领域:对象头、实例数据和对齐填充。

5、执行<init>方法(程序员赋值、执行构造方法)

二、对象大小与指针压缩

1、什么是java对象的指针压缩

从jdk1.6 update14开始,在64bit操作系统中,JVM支持指针压缩。

2、为什么要进行指针压缩?

提高效率(减少内存占用、GC压力)

关于对齐填充:对于大部分处理器,对象以8字节整数倍来对齐填充都是最高效的存取方式。

三、对象内存分配

1、对象内存分配流程图

2、对象栈上分配

JVM通过逃逸分享确定该队形不会被外部访问。如果不会逃逸可以将对象在栈上分配。

对象逃逸分析:就是分析对象动态作用域,当一个对象在方法中被定义后,它可能被外部方法所使用,例如:作为调用参数传递到其他地方中。

标量替换:通过逃逸分析确定该对象不会被外部访问时,JVM不会创建该对象,而是将该对象成员变量分解若干个被这个方法使用的成员变量所代替。

3、对象在Eden区分配

4、大对象直接进入老年代

5、长期存活的对象将进入老年代

6、对象动态年龄判断

年龄1+年龄2+年龄n的多个年龄对象总和超过了Survivor区域的50%,此时就会把年龄n(含)以上的对象都放入老年代

7、老年代空间分配担保机制

提前预判,看看老年代的可用内存大小,是否大于之前每一次minor gc后进入老年代的对象的平均大小。预判成功,直接进入full gc。预判失败,重新minor gc。

四、对象内存回收

1、引用计数法

2、可达性分析算法

将GC Roots对象作为起点,从这些节点开始向下搜索引用的对象,找到的对象都标记为非垃圾对象,其余未标记的对象都是垃圾对象。

GC Roots根节点:线程栈的本地变量、静态变量、本地方法栈的变量等等。

3、常规引用类型

java的引用类型一般分为四种:强引用、软引用、弱引用、虚引用

4、finalize()方法最终判定对象是否存活

5、如何判定一个类是无用的类

(1)该类所有的对象实例都已经被回收,也就是java堆中不存在该类的任何实例;

(2)加载该类的ClassLoader已经被回收

(3)该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方通过反射该类的方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值