上犹电脑信息网我们一直在努力
您的位置:上犹电脑信息网 > 电脑怎么了 > Java 4 种引用类型(Reference)

Java 4 种引用类型(Reference)

作者:上犹日期:

返回目录:电脑怎么了

今天小编给各位分享reference的知识,文中也会对其通过Java 4 种引用类型(Reference)和Java里什么是引用类型?等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入正文!

内容导航:
  • Java 4 种引用类型(Reference)
  • Java里什么是引用类型?
  • 佳音北大青鸟分享java编程引用类型分析?
  • 昌平北大青鸟分享java编程引用类型分析?
  • 一、Java 4 种引用类型(Reference)

    GC 的基本思想是考察每个对象的可触及性(可达性),就是从GC Root开始是否可以访问到这个对象。如果可以,则可达,否则就是不可达。在Java中,可作为GC Roots的对象包括:

    JVM栈(栈中的本地变量表)中的引用的对象方法去中类静态属性引用的对象方法区中常量引用的对象本地方法栈中JNI(Native方法)引用的对象

    对于可触及性,可以包含以下3种状态。

    可触及的:从根节点开始,可以到达这个对象。可复活的:对象的所有引用都被释放,但是对象有可能在finalize()函数中复活不可触及的:对象的finalize()方法别调用过,并且没有被复活(finalize()方法只会被调用一次)

    Java中提供了4个级别的引用:强引用、软引用、弱引用和虚引用。

    强引用

    强引用是程序中一般使用的引用类型。强引用的对象是可触及的、不可被回收的。例如:

    StringBuffer str = new StringBuffer("Hugege");StringBuffer str1 = str;

    上述代码内存示意图如下:

    强引用内存示意图

    ​​​​​​​强引用包含以下特点:

    可以直接访问目标对象所指向的对象在恩和时候都不会被系统回收,JVM宁愿抛出OOM,也不会回收对象可能导致内存泄漏软引用

    软引用是比强引用弱一点的引用类型。一个对象如果只持有软引用,那么当堆空间不足时,就会被回收(由 SoftReference 实现)。代码如下:

    /** * 软引用在系统堆内存不足是,被回收 *  * VM Args: -Xmx10M *  * @author xuefeihu * */public class SoftRef {public static class User {public int id;public String name;public User(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + "]";}}public static void main(String[] args) {User u = new User(1, "xuefeihu");SoftReference<User> userSoftRef = new SoftReference<User>(u);u = null;System.out.println(userSoftRef.get());System.gc();System.out.println("After GC: ");System.out.println(userSoftRef.get());byte[] b = new byte[1024 * 985 * 7]; // 这里与JDK的版本有关(笔者JDK8),过小不会回收,过大会OOMSystem.gc();System.out.println(userSoftRef.get());}}

    增加上述GC参数,运行结果如下:

    User [id=1, name=xuefeihu]After GC: //内存充足时GCUser [id=1, name=xuefeihu]null //内存不足是GC,数据已被清除

    综上,GC未必会回收软引用的对象,但是当内存不足时,软引用对象就会被回收,因此软引用对象不会引起内存溢出。

    引用队列

    每个软引用都可以附带一个引用队列,当对象的可达性状态发生变化时(由可达变为不可达),软引用对象就会进入引用队列。通过这个队列,可以追踪对象的回收情况。代码如下:

    /** * 每个软引用都可以附带一个引用队列,当对象的可达性状态发生变化时(由可达变为不可达), * 软引用对象就会进入引用队列。通过这个队列,可以追踪对象的回收情况。 *  * VM Args: -Xmx10M *  * @author xuefeihu * */public class SoftRefQ {public static class User {public int id;public String name;public User(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + "]";}}static ReferenceQueue<User> softQueue = null;public static class CheckRefQueue extends Thread {@Overridepublic void run() {while (true) {if (softQueue != null) {UserSoftReference obj = null;try {obj = (UserSoftReference) softQueue.remove();} catch (Exception e) {e.printStackTrace();}if (obj != null) {System.out.println("user id = " + obj.uid + " is delete");}}}}}public static class UserSoftReference extends SoftReference<User> {int uid;public UserSoftReference(User referent, ReferenceQueue<? super User> q) {super(referent, q);uid = referent.id;}}public static void main(String[] args) throws InterruptedException {Thread t = new CheckRefQueue();t.setDaemon(true);t.start();User u = new User(1, "xuefeihu");softQueue = new ReferenceQueue<User>();UserSoftReference userSoftRef = new UserSoftReference(u, softQueue);u = null;System.out.println(userSoftRef.get());System.gc();// 内存足够,不会被回收System.out.println("After GC :");System.out.println(userSoftRef.get());System.out.println("try to create byte array and GC");byte[] b = new byte[1024 * 985 * 7];System.gc();System.out.println(userSoftRef.get());Thread.sleep(1000);}}

    使用上述VM参数,执行结果如下:

    User [id=1, name=xuefeihu] After GC :User [id=1, name=xuefeihu] //内存充足时,GC结果try to create byte array and GC //内存不足时GCuser id = 1 is delete //引用队列探测到对象被删除null //对象已回收
    弱引用

    弱引用是一种比软引用还弱的一种引用。GC时只要发现,就会对其进行回收。一旦被回收时,就会加入到一个引用队列中(和软引用很像),Java中使用WeakReference实现。demo如下:

    /** * 弱引用在GC时就会被回收 *  * @author xuefeihu * */public class WeakRef {public static class User {public int id;public String name;public User(int id, String name) {this.id = id;this.name = name;}@Overridepublic String toString() {return "User [id=" + id + ", name=" + name + "]";}}public static void main(String[] args) {User u = new User(1, "xuefeihu");WeakReference<User> userWeakRef = new WeakReference<User>(u);u = null;System.out.println(userWeakRef.get());System.gc();// 不管当前内存空间足够与否,都会回收它的内存System.out.println("After GC: ");System.out.println(userWeakRef.get());}}

    上述代码运行结果如下:

    User [id=1, name=xuefeihu]After GC: null

    从结果看来,不论内存状况,每次GC都会清除弱引用的对象。

    虚引用(幽灵引用)

    虚引用是所有引用中最弱的一个。持有虚引用的对象,和没有引用几乎一样,随时都有可能被回收,因此也叫幽灵引用。当使用虚引用的get()方法获得强引用时,总是失败的。虚引用必须和引用队列一起使用,作用于跟踪垃圾回收过程。

    下面示例使用虚引用跟踪一个可复活对象的回收。

    /** * 使用虚引用跟踪一个可复活对象的回收 *  * 当GC回收对象时,如果发现有虚引用,就会将其放入引用队列 * 虚引用必须和引用队列一起使用,它的作用在于跟踪垃圾回收过程。 *  * @author xuefeihu * */public class TraceCanReliveObj {public static TraceCanReliveObj obj;static ReferenceQueue<TraceCanReliveObj> phantomQueue = null;public static class CheckRefQueue extends Thread {@Overridepublic void run() {while(true) {if(phantomQueue != null) {PhantomReference<TraceCanReliveObj> objt = null;try {objt = (PhantomReference<TraceCanReliveObj>) phantomQueue.remove();} catch (Exception e) {e.printStackTrace();}if(objt != null) {System.out.println("TraceCanReliveObj is delete by GC");}}}}}@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("CanReliveObj finalize called");obj = this;}@Overridepublic String toString() {return "I am CanReliveObj";}public static void main(String[] args) throws InterruptedException {Thread t = new CheckRefQueue();t.setDaemon(true);t.start();phantomQueue = new ReferenceQueue<TraceCanReliveObj>();obj = new TraceCanReliveObj();PhantomReference<TraceCanReliveObj> phantomRef = new PhantomReference<TraceCanReliveObj>(obj, phantomQueue);obj = null;System.gc();Thread.sleep(1000);if(obj == null) {System.out.println("obj 是 null");} else {System.out.println("obj 可用");}System.out.println("第2次GC");obj = null;System.gc();Thread.sleep(1000);if(obj == null) {System.out.println("obj 是 null");} else {System.out.println("obj 可用");}}}

    上述代码执行结果如下:

    CanReliveObj finalize called // 对象复活obj 可用第2次GC //对象无法复活TraceCanReliveObj is delete by GC //引用队列捕获到对象被回收obj 是 null

    参考:《实战Java虚拟机》

    一、Java里什么是引用类型?

    Java的引用类型:

    引用类型是一个对象类型,值是什么呢?它的值是指向内存空间的引用,就是地址,所指向的内存中保存着变量所表示的一个值或一组值。

    Java 提供两种不同的类型:引用类型和原始类型(或内置类型)。

    引用类型和原始类型的行为完全不同,并且它们具有不同的语义。

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。

    对象引用实例变量的缺省值为 null,而原始类型实例变量的缺省值与它们的类型有关。同时为了面向对象操作的一致性。

    这些基本类型都有相应的封装类型:Integer、Short、Long、Byte、Float、Double、Character等。

    二、佳音北大青鸟分享java编程引用类型分析?

    我们在使用java编程开发语言开发软件的时候通常都会new对象,然后通过对对象的引用来实现不同的编程需求,而今天电脑培训就一起来了解一下,java编程开发语言中都有哪些常见的引用方法。
    1:虚引用1.1简介:虚引用是所有引用中强度弱的,它完全类似于没有引用,在java.reflact.PhantomReference类中实现。
    虚引用对象本身没有太大影响,对象甚至感觉不到虚引用的存在。
    如果一个对象存在虚引用,那么它和没有引用的效果大致相同,虚引用无法引用任何堆中的对象作用:虚引用主要用于跟踪对象被JVM垃圾回收的状态,可以通过它来手机GC的行为。
    可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用锁引用的对象是否被回收。
    注意:虚引用无法单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用.被虚引用所引用对象被垃圾回收后,虚引用将被添加到引用队列中。
    2:弱引用简介:弱引用和虚引用有点类似,不同之处在于虚引用锁引用的对象生存期比虚引用长一点。
    虚引用在java.reflact.WeakReference类实现。
    在系统进行垃圾回收的时候,不管系统内存是否足够,总是回收该对象所占用的内存.但是弱引用的强度是要大于虚引用的3:软引用简介:软引用比弱引用的强度高一点,它是通过java.reflact.SoftReference来实现。
    对于软引用来说,当系统内存空间足够时,它不会被系统回收,程序中改对象的引用也是有效的。
    而当系统的内存空间不够时,系统将会回收它。
    作用:软引用是强引用好的替代,它一定程度上可以避免系统内存不足的异常,可以充分使用软引用来解决内存紧张的问题。
    4:强引用简介:强引用很常见,在平时的程序中,我们新new一个对象,比如Objectobject=newObject();那么这个object就是指向object对象的强引用。
    强引用的特点就是:被引用的java对象绝对不会被垃圾回收机制回收,即使系统的内存非常紧张,即使java以后也用不到,jvm不会回收强引用所引用的java对象。

    三、昌平北大青鸟分享java编程引用类型分析?

    我们在使用java编程开发语言开发软件的时候通常都会new对象,然后通过对对象的引用来实现不同的编程需求,而今天电脑培训就一起来了解一下,java编程开发语言中都有哪些常见的引用方法。
    1:虚引用1.1简介:虚引用是所有引用中强度弱的,它完全类似于没有引用,在java.reflact.PhantomReference类中实现。
    虚引用对象本身没有太大影响,对象甚至感觉不到虚引用的存在。
    如果一个对象存在虚引用,那么它和没有引用的效果大致相同,虚引用无法引用任何堆中的对象作用:虚引用主要用于跟踪对象被JVM垃圾回收的状态,可以通过它来手机GC的行为。
    可以通过检查与虚引用关联的引用队列中是否已经包含指定的虚引用,从而了解虚引用锁引用的对象是否被回收。
    注意:虚引用无法单独使用,虚引用必须和引用队列(ReferenceQueue)联合使用.被虚引用所引用对象被垃圾回收后,虚引用将被添加到引用队列中。
    2:弱引用简介:弱引用和虚引用有点类似,不同之处在于虚引用锁引用的对象生存期比虚引用长一点。
    虚引用在java.reflact.WeakReference类实现。
    在系统进行垃圾回收的时候,不管系统内存是否足够,总是回收该对象所占用的内存.但是弱引用的强度是要大于虚引用的3:软引用简介:软引用比弱引用的强度高一点,它是通过java.reflact.SoftReference来实现。
    对于软引用来说,当系统内存空间足够时,它不会被系统回收,程序中改对象的引用也是有效的。
    而当系统的内存空间不够时,系统将会回收它。
    作用:软引用是强引用好的替代,它一定程度上可以避免系统内存不足的异常,可以充分使用软引用来解决内存紧张的问题。
    4:强引用简介:强引用很常见,在平时的程序中,我们新new一个对象,比如Objectobject=newObject();那么这个object就是指向object对象的强引用。
    强引用的特点就是:被引用的java对象绝对不会被垃圾回收机制回收,即使系统的内存非常紧张,即使java以后也用不到,jvm不会回收强引用所引用的java对象。

    关于reference的问题,通过《佳音北大青鸟分享java编程引用类型分析?》、《昌平北大青鸟分享java编程引用类型分析?》等文章的解答希望已经帮助到您了!如您想了解更多关于reference的相关信息,请到本站进行查找!

    本文标签:Reference(3)

    相关阅读

    • 电脑无法开机怎么解决

    • 上犹电脑怎么了
    • 今天小编给各位分享电脑启动不了怎么解决的知识,文中也会对其通过电脑无法开机怎么解决和电脑开不开机怎么办?等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注
    • Java 4 种引用类型(Reference)

    • 上犹电脑怎么了
    • 今天小编给各位分享reference的知识,文中也会对其通过Java 4 种引用类型(Reference)和Java里什么是引用类型?等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现
    • Win7光盘映像文件怎么打开?

    • 上犹电脑怎么了
    • 今天小编给各位分享win7镜像的知识,文中也会对其通过Win7光盘映像文件怎么打开?和“Ghost_WIN7_X64.iso”的光盘映像文件后怎么打开?等多篇文章进行知识讲解,如果文章内容对您有帮
    • 663.经济学人-The triumph of big government-1

    • 上犹电脑怎么了
    • 今天小编给各位分享triumph的知识,文中也会对其通过663.经济学人-The triumph of big government-1和哪款app可以每天看经济学人、时代周刊这些杂志?等多篇文章进行知识讲解,如果文章内容对
    • C 属性(Property)

    • 上犹电脑怎么了
    • 今天小编给各位分享property的知识,文中也会对其通过C 属性(Property)和object -c 中property 有什么作用?等多篇文章进行知识讲解,如果文章内容对您有帮助,别忘了关注本站,现在进入
    关键词不能为空
    极力推荐

    电脑蓝屏_电脑怎么了_win7问题_win10问题_设置问题_文件问题_上犹电脑信息网

    关于我们