美文网首页
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引用类型之 :引用简介

    1 内存回收 每一个Java程序中的对象都会占用一定的计算机资源,最常见的,如:每个对象都会在堆空间上申请一定的内...

  • 一文读懂java中的Reference和引用类型

    一文读懂java中的Reference和引用类型 简介 java中有值类型也有引用类型,引用类型一般是针对于jav...

  • Java中使用到的引用类型

    简介 从JDK1.2开始,Java中的引用类型分为四种,分别是:①强引用(StrongReference)②软引用...

  • Glide弱引用缓存与java的强引用、软引用、弱引用、幻象引用

    java的强引用、软引用、弱引用、幻象引用,引用队列总结 java除了原始数据类型的变量,其他所有都是引用类型。 ...

  • 金山电面总结

    1 java引用类型 4种引用类型:强引用(StrongReference),软引用(SoftReference...

  • 面试题笔记

    Java中引用类型的区别,具体的使用场景 Java中引用类型分为四类:强引用、软引用、弱引用、虚引用。 强引用:强...

  • Java引用类型之 :软引用

    1 简述 软引用是使用SoftReference创建的引用,它是比强引用弱的引用类型。如果一个对象不存在任何强引用...

  • Java引用类型之 :强引用

    1 简述 强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器宁愿抛出OOM(OutOfMemoryEr...

  • Java引用类型之 :虚引用

    1 简述 虚引用是使用PhantomReference创建的引用,虚引用也称为幽灵引用或者幻影引用,是所有引用类型...

  • java向上转型

    java 之向上转型 当父类对象引用变量引用子类对象时,被引用对象的类型决定了调用谁的成员方法,引用变量类型决定可...

网友评论

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

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