美文网首页
Java引用类型之 :引用简介

Java引用类型之 :引用简介

作者: 贪睡的企鹅 | 来源:发表于2019-07-15 11:39 被阅读0次

    1 内存回收

    每一个Java程序中的对象都会占用一定的计算机资源,最常见的,如:每个对象都会在堆空间上申请一定的内存空间。但是除了内存之外,对象还会占用其它资源,如文件句柄,端口,socket等等。当你创建一个对象的时候,必须保证它在销毁的时候会释放它占用的资源。否则程序将会在OOM中结束它的使命。

    在Java中数据内存分配发生在栈和堆中,对于栈中的变量(引用类型,基本类型)会在方法的退出时自动释放,对于new出来对象分配到堆中,不需要程序员来管理内存的分配和释放,Java有自动进行内存管理的神器——垃圾回收器,垃圾回收器会自动回收那些不再使用的对象。那如何判断对象不再使用呢?就是不在被引用的对象。

    2 如何判断对象已死

    引用计数法

    给对象添加一个引用计数器,每当该对象被引用,它的计数器值就+1;当引用实效时,计数器就-1;在任何情况下,当计数器值为0时,就表示该对象不再被使用。

    缺点:它很难解决对象之间相互引用,引起的循环引用问题,会产生无法被释放的内存区域。因此,主流的JVM都没有选用引用计数法来管理内存。

    可达性分析算法

    主流的JVM基本都使用可达性分析算法来判断对象是否存活,通过一系列“GC Roots”的对象作为起始点向下搜索,搜索所走过的路径为引用链,当一个对象没有任何引用链与GC Roots相连,代表该对象不再被使用,将其判定为可回收的对象

    image

    3 GCROOT

    • 方法中局部变量区中的对象引用;

    • Java操作栈中对象引用

    • 常量池中的对象引用;

    • 本地方法栈中的对象引用;

    • 类的Class对象:当每个类被JVM加载时都会创建一个代表这个类的唯一数据类型的Class对象,而这个对象爷同样存放在堆中,当这个类不再被使用时,在方法区中类数据和这个Class对象同样被回收。

    4 引用类型

    最早的JDK中只存在一个引用类型,这样就对于垃圾收集器来说所有的引用对象回收都是平等的。这样对于开发人员来说无法把控对象回收时机,所有对象回收都交给了垃圾收集器

    为了更灵活的控制对象的生命周期,在JDK1.2之后,引用被划分为强引用、软引用、弱引用、虚引用四种类型,每种类型有不同的生命周期,它们不同的地方就在于垃圾回收器对待它们会使用不同的处理方式。

    这4种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

    相关文章

      网友评论

          本文标题:Java引用类型之 :引用简介

          本文链接:https://www.haomeiwen.com/subject/kdagkctx.html