`

Java虚拟机学习 - 对象引用强度

    博客分类:
  • JVM
 
阅读更多

本文原文链接:http://blog.csdn.net/java2000_wl/article/details/8090276 转载请注明出处!

无论是通过计数算法判断对象的引用数量,还是通过根搜索算法判断对象引用链是否可达,判定对象是否存活都与“引用”相关。

引用主要分为 :强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)、虚引用(PhantomReference) 四种,引用的强度依次骤减。

强引用:

 

就是指在代码之中普遍存在的,类似:“Object objectRef = new Obejct”,这种引用,只要强引用还存在,永远不会被GC清理。

软引用:

用来描述一些还有用,但并非必须存在的对象,当Jvm内存不足时(内存溢出之前)会被回收,如果执行GC后,还是没有足够的空间,才会抛出内存溢出异常。

通过SoftReference类来实现软引用,SoftReference很适合用于实现缓存。另,当GC认为扫描的SoftReference不经常使用时,可会进行回收。

使用方法:

 

  1. User user = new User();  
  2. SoftReference<Object> softReference  = new SoftReference<Object>(user);  
  3. softReference.get();  

弱引用

弱引用也是用来描述一些还有用,但并非必须存在的对象,它的强度会被软引用弱些,被弱引用关联的对象,只能生存到下一次GC前,当GC工作时,无论内存是否足够,都会回收掉弱引用关联的对象。JDK通过WeakReference类来实现。

当获取时,可通过weakReference.get方法获取,可能返回null

可传入一个ReferenceQueue对象到WeakReference构造,当引用对象被表示为可回收时,isEnqueued返回true

 

  1.               User user = new User();  
  2. WeakReference<User> weakReference = new WeakReference<User>(user);  
  3. weakReference.get();  
  4.   
  5. ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();  
  6. WeakReference<User> weakReference2 = new WeakReference<User>(user, referenceQueue);  
  7. //当引用对象被标识为可回收时  返回true,  即当user对象标识为可回收时,返回true  
  8. weakReference.isEnqueued();  

虚引用

虚引用称为“幻影引用”,它是最弱的一种引用关系,一个对象是否有虚引用的存在,完全不会对生存时间构成影响。为一个对象设置虚引用关联的唯一目的就是希望能在这个对象被GC回收时收到一个系统通知。通过PhantomReference类实现。

值得注意的是:phantomReference.get方法永远返回null, 当user从内存中删除时,调用isEnqueued会返回true

 

  1. User user = new User();  
  2. ReferenceQueue<User> referenceQueue = new ReferenceQueue<User>();  
  3. PhantomReference<User>  phantomReference = new PhantomReference<User>(user, referenceQueue);  
  4. //即当user对象标识为可回收时,返回true  
  5. System.out.println(phantomReference.isEnqueued());  
  6. //永远返回null  
  7. System.out.println(phantomReference.get());  

其他相关类:

 

  1. WeakCache weakCache  = new WeakCache();  
  2. SoftCache softCache = new SoftCache();  
  3. WeakHashMap weakHashMap  = new WeakHashMap();  

 

  当垃圾回收机制运行,扫描引用关系,GC会对这三种类型的引用进行不同的处理,简单来说,GC首先会判断所扫描到的引用是否为Reference类型,如果为Reference类型,且其所引用的对象无强引用,则认为该对象为相应的Reference类型,之后GC在垃圾回收时这些对象则根据Reference类型的不同进行相应处理。

分享到:
评论

相关推荐

    Java 虚拟机面试题1

    Java虚拟机面试题1主要涵盖了Java虚拟机(JVM)的相关知识,包括JDK和JRE的区别、Java历史版本的特性、运行时数据区域、垃圾收集算法、类加载机制、虚拟机与物理机的区别、方法调用、指令集、编译过程、并发与线程等...

    Java基础复习笔记02对象状态、引用种类、垃圾回收形式

    垃圾回收是Java虚拟机(JVM)自动进行内存管理的重要机制,它负责回收不再使用的对象所占的内存。JVM中主要采用以下几种垃圾回收算法: 1. **标记-清除算法**:这是最基础的收集算法,分为“标记”和“清除”两个阶段...

    JAVA基础面试笔试历年真题总结

    - 应用场景:最常见的引用类型,如直接赋值的对象引用。 - 特点:只要有强引用指向的对象,垃圾回收器永远不会回收。 **3.2 软引用(Soft Reference)** - 应用场景:适合用于实现内存敏感的高速缓存。 - 特点:当...

    JAVA核心知识点整理.pdf

    本地方法不是由Java虚拟机实现,而是在本地方法接口中定义的。 - **堆(Heap)**:是线程共享的运行时数据区,所有类实例和数组的内存均从此处分配。 - **方法区/永久代**:用于存储已被虚拟机加载的类信息、常量、...

    Java后端技术面试汇总-2019

    - **强引用、软引用、弱引用、虚引用**:不同强度的引用类型。 - **Java内存模型JMM**:定义了主内存与线程工作内存之间的抽象行为。 **1.6 设计模式** - **常见的设计模式**:单例模式、工厂模式、策略模式、...

    jvm如何判断对象己死详解

    在JDK 1.2之后,Java引入了四种不同强度的引用类型:强引用、软引用、弱引用和虚引用。它们按照从强到弱的顺序排列: 1. 强引用:最常见的引用类型,只要强引用存在,垃圾收集器就不会回收对象。除非显式设置为null...

    jvm垃圾回收机制详解,学习过程,如有侵权请联系删除

    Java虚拟机(JVM)的垃圾回收机制是Java开发中至关重要的一个概念,它负责自动管理内存中的对象,确保程序的稳定运行。垃圾回收(GC)是JVM内置的一种内存管理策略,旨在防止内存泄漏和内存溢出。当对象不再被程序...

    04.GC要做的事情1

    GC(Garbage Collection)是Java虚拟机中一个非常重要的组件,负责回收Java堆和方法区中不再使用的对象,以避免内存泄露和溢出。那么,GC要做的事情是什么? 首先,GC需要确定哪些内存需要被回收。Java虚拟机中,...

    2_垃圾回收2

    Java垃圾回收机制是Java虚拟机(JVM)自动管理内存的一种策略,它的主要目标是自动识别并释放不再使用的对象,从而避免内存泄漏。本篇文章将详细介绍垃圾回收的几个关键概念和算法。 首先,如何判断对象可以被回收...

    JVM相关的常见面试问题汇总.pdf

    - **定义**: JVM全称Java Virtual Machine,即Java虚拟机,是Java程序运行的底层平台。 - **作用**: 它为Java应用程序提供了一个运行环境,可以执行Java字节码。 - **组成部分**: - **JVM规范**: 规定了JVM的行为和...

    简单谈谈Java垃圾回收

    1. `finalize`不是必须的,Java虚拟机并不保证一定会调用这个方法。 2. `finalize`方法只能被调用一次,即使在`finalize`执行过程中对象重新变得可达,也不会再次调用`finalize`。 3. 自定义`finalize`方法时,建议...

    编译原理全套

    10.2.1 Java虚拟机语言简介 10.2.2 Java虚拟机 10.2.3即时编译器 *10.3 无用单元收集 10.3.1 标记和清扫 10.3.2 引用计数 10.3.3 拷贝收集 10.3.4 分代收集 10.3.5 渐增式收集 10.3.6 编译器与收集...

Global site tag (gtag.js) - Google Analytics