JVM中的对象及引用

一:JVM中对象创建的过程
1:类加载(双亲委派加载class文件)
2:检查加载,当new一个对象时先检查对象对应的class文件是否已经被加载,如果没有加载则返回到第一步类加载。
3:分配内存:划分内存一般有指针碰撞和空闲列表
  指针碰撞用于连续整齐的内存区域,当分配内存后指针后移。
  空闲列表用于断断续续的内存空间(CMS垃圾回收后),内存列表会标记哪些内存区域已使用哪些未使用。
分配内存时为了避免多线程造成的影响,一般会选用CAS机制或者本地线程分配缓冲(TLAB)。
  CAS机制(Compare And Swap):线程分配内存时先判断当前内存是否为空,如果为空则预处理数据,最后在写入内存前比较当前内存状态和刚开始是否一致。如果一致则使用内存,不一致则说明内存被使用需要继续申请其他内存。
   本地线程分配缓冲(TLAB):JVM会给每个线程一个私有的不用竞争的内存区域供使用。
4:内存空间初始化:这里并不是执行构造方法,而是而是完成初始赋值。例如int类型的变量默认赋值为0,boolean类型默认赋值为false。
5:设置:设置对象的对象头信息包括类实例,类的元信息,GC年龄,线程信息以及持有锁信息。
6:对象初始化:调用构造方法初始化类实例。
在这里插入图片描述

二:对象的内存布局
在HotSpot 对象由对象头,实例数据以及对齐填充组成。
  1:对象头主要由两部分组成。第一部分是用于存储对象的自身运行时数据包括哈希值,GC年龄,线程信息以及持有锁信息。第二部分为类型指针主要是指向对象的元数据信息。如果对象是数组类型的则还会有一个表示数组长度的部分。
  2:实例数据就是对象的具体数据信息。
  3:对其填充:HotSpot VM的自动内存管理系统要求对象大小必须是8的倍数,如果没有达到则用空白填充。
在这里插入图片描述

三:对象的访问定位
Java是通过栈上面的reference数据操作堆上面的对象。目前可以通过句柄和直接引用两种方式
  句柄方式是在堆上会存在一个指向当前对象的句柄,然后栈的reference指向句柄,这种方式比较耗资源并且效率低但是当对象不存在时,只需要修改句柄中的实例数据指针而不用修改栈中地址也就可以避免发生空异常现象。
  直接引用就是栈上面存储直接就是对象的地址。这样可以提高效率。
四:判断垃圾的存活
判断垃圾的方式有引用计数和根可达两种。
  引用计数当对象有被引用则计数器加一,当计数器为0的时候表示当前对象是垃圾。但是当两个垃圾对象互相引用的时候就会出现循环引用的问题。
  根可达:以GC Root为起点向下寻找只要是可以查找到的都是根可达的对象,这些跟可达的对象都是存活的对象,反之都是垃圾。
那么哪些是GC Root的对象呢?
1:栈中的对象:虚拟机栈中每个栈帧中局部变量表中的对象。
2:方法区中的静态变量
3:方法区中的常量引用的对象:例如字符串常量池引用的对象
4:本地方法栈中的对象
5:JVM中的内部引用对象(class对象,异常类,类加载器等…)
6:所有被同步锁(Synchronized)持有的对象
7:JVM内部的JMXBean,JVMTI中注册的回调,本地代码缓存
8:JVM实现中的"临时性对象",跨带引用的对象

Class对象要被回收条件不叫苛刻,需要同时满足一下条件才可以(也只是可能回收,还有一些参数可以控制):
1:该类的所有实例都已经被回收,也就是堆中以及没有该对象的实例。
2:加载该类的ClassLoader已经被回收。
3:该类对应的java.lang.class没有任何地方被引用,无法在任何地方通过反射访问该类的方法。
4:参数控制:-Xnoclassgc禁用类的垃圾回收。

五:Java中的引用
Java中有强引用,软引用,弱引用,虚引用
1:强引用:例如Object object = new Object();即为一个强引用,只要强引用还在垃圾回收则永远无法回收该对象。
2:软引用(SoftReference):当发生OOM之前软引用的对象会被垃圾回收
在这里插入图片描述
4:弱引用(WeakReference):垃圾回收时不管有没有OOM都会回收弱引用对象。在这里插入图片描述
5:虚引用(PhantomReference):幽灵引用,最弱,随时都会被回收。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值