Object obj = new Object();
以上代码实际上分为2段语义:
-
Object obj
会反映到Java栈的本地变量表中,作为reference类型数据 -
new Object()
会反映到Java堆中,作为存储了Object类型所有实例的结构化内存,这块内存不固定,且还要能查到此对象类型数据,使用的方法有句柄池和直接指针 -
new Object()
对象又分为对象头Header
、实例数据Instance Data
和填充数据Padding
(内存空间初始化零值
,设置对象头
,执行init构造器
)
对象头分为MarkWord->存储运行时数据hashcode,年龄代,锁状态
和Klass Pointer->确认对象是哪个类
句柄池 堆中有一块内存存放句柄池,对象移动时,只需要改变句柄指针
直接指针 直接指向对象地址,直接定位,少一次指针定位
引用状态
在JDK1.2之前,Java中引用的定义很传统:如果引用类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用。这种定义很纯粹,但是太过于狭隘,一个对象只有被引用或者没被引用两种状态。
我们希望描述这样一类对象:当内存空间还足够时,则能保留在内存中;如果内存空间在进行垃圾收集后还是非常紧张,则可以抛弃这些对象。很多系统的缓存功能都符合这样的应用场景。在JDK1.2之后,Java对引用的概念进行了扩充,将引用分为强引用、软引用、弱引用、虚引用4种,这4种引用强度依次减弱
- 强引用:代码中普遍存在的类似”Object obj = new Object()”这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象
- 软引用:描述有些还有用但并非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。Java中的类SoftReference表示软引用
- 弱引用:描述非必需对象。被弱引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。Java中的类WeakReference表示弱引用
- 虚引用:这个引用存在的唯一目的就是在这个对象被收集器回收时收到一个系统通知,被虚引用关联的对象,和其生存时间完全没关系。Java中的类PhantomReference表示虚引用