对于一个Java对象,存储主要分为两种,一种是内存堆(Heap),内存堆是无序的,主要用来存放创建的Java对象;一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程中使用Java引用指向Java对象。对于Reference引用的“那些事”,随着金色美丽号漂浮在海面上,一切看起来是那么的平静,但大家似乎都在忙于手中的事情……突然魏博问了萨博一个问题:我们都都知道JVM调优是从事Java开发必须掌握甚至提升的重要环节。那么,你知道堆和栈,它们各自的存储机制是什么吗?针对这个问题,就像当初探索世界末日的梦??想一样,萨博是这样回答韦伯的:对于一个Java对象来说,存储主要分为两种,一种是内存堆(Heap),而内存堆是无序的,主要用来存放创建的Java对象;一种是内存栈(Stack),主要用来存放Java引用,然后在管理过程中使用Java引用指向Java对象。听了萨博的回答,韦伯靠在甲板上,点了一根猩红色的香烟,吸了一口,对萨博道:“那你能详细解释一下这个报价机制吗?”萨博想了想,于是就有了下面的故事……GC的基本原理【垃圾收集器】在介绍Reference引用的概念之前,我们需要清楚的知道内存栈(Stack)和内存堆(Heap)的JVM虚拟机的结构分布和基本情况如上图所示。综上所述,我们可以理解为Java的内存管理其实就是对对象的管理,包括对象实例的分配和释放。其中,GC的存在负责在对象“不可达”时回收该对象。当系统在创建对象实例时,即使用new关键字创建对象时,GC开始监控对象的地址、大小和使用状态。一般来说,Java的GC机制都有特定的回收算法。GC通常使用有向图来记录队列中的所有对象,通过这种方式判断甚至标记哪些对象“可达”,哪些对象“不可达”。当GC判断某些对象不可达时,GC有责任回收相关的内存空间。能否被垃圾回收机制回收取决于机器和平台,但主要是根据对象是否有对该对象的引用来判断。Reference引用的基本概述引用对象的抽象基类。此类定义所有引用对象共有的操作。因为引用对象是与垃圾收集器密切合作实现的,所以这个类可能不会被直接子类化。不难发现,Reference机制对JVM的垃圾回收活动是敏感的。Reference的继承关系或实现由JDK自定义,引用实例由JVM创建。一般不建议继承Reference来实现自定义的引用类型,但是可以继承已有的引用类型。JDK提供了强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和幻引用(PhantomReference)、引用队列(ReferenceQueue)和析构引用(FinalReference)等引用类型。[??注意事项]:强引用可能对垃圾回收活动不敏感。自继承引用实现自定义引用类型对于重复造轮子意义不大。销毁引用(FinalReference),是对不同JDK版本的专门虚拟引用,需要注意实际源码的对比分析。5.Reference是所有被引用对象的基类。引用引用类型分析强引用(StrongReference):Java中最常见的类型是强引用,也是最常见的引用类型。处于可达状态,是不可能被垃圾回收机制回收的,即使这个对象以后再也不会被JVM使用,也不会被回收。软引用(SoftReference):对于一个只有软引用的对象,当系统内存充足时不会被回收,当系统内存空间不足时会被回收。软引用经常用在对内存敏感的程序中。弱引用:它的生命周期比软引用短。对于只有弱引用的对象,只要垃圾回收机制运行,不管JVM的内存空间是否足够,对象占用的内存总会被回收。PhantomReference:不能单独使用,必须和引用队列配合使用。幻象引用的主要目的是跟踪被垃圾收集的对象的状态。引用队列(ReferenceQueue):最终引用:【??注意事项】:强引用可能对垃圾回收活动不敏感,也没有对应的类型表示,也就是说强引用是无处不在的,比如Objectobject=newObject();.软引用、弱引用和虚引用都是java.lang.ref.Reference的直接子类。在JDK11之前,只有四种引用。这些引用是JVM创建的,所以直接继承java.lang.ref.Reference来创建自定义引用类型是无效的,但是可以直接继承已有的引用类型,比如java.lang.ref.Reference。lang.ref.Cleaner继承自java.lang.ref.PhantomReference。特殊的java.lang.ref.Reference子类java.lang.ref.FinalReference与Object#finalize()相关,而java.lang.ref.Finalizer是java.lang.ref.FinalReference的子类。
