精华内容
参与话题
问答
  • 四种引用类型说明虚引用的补充说明“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收...

    四种引用类型说明

    这里写图片描述

    虚引用的补充说明

    “虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
    虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。
    ReferenceQueue queue = new ReferenceQueue ();
    PhantomReference pr = new PhantomReference (object, queue);
    程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。如果程序发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。(finalize被触发的源头?)

    展开全文
  • 浅解四种Java引用

    2016-08-23 09:45:04
    最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解...理解Java Cache实现、学习Java引用与Java垃圾回收机制的关系 内存资源是有限的,需要合理的利用。Cache不是仅仅HashMap那么简单,Jav...
    最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档、代码以及几篇文章。做个小结,如有错误,欢迎指正。

    之所以想学习一下Java培训的几种引用类型,原因有两个:

    理解Java Cache实现、学习Java引用与Java垃圾回收机制的关系

    内存资源是有限的,需要合理的利用。Cache不是仅仅HashMap那么简单,Java引用与Java垃圾回收机制也有非常紧密的关系www.lampbrother.net
    避免对Java引用的错误使用

    某个同事把5000+交易数据放到一个HashMap里面,用一个Spring Singleton Bean的全局属性指向该HashMap。大量运用这种技术,很快就报out of memory。再大的内存也架不住对内存的错误使用。理解原理有助于我们尽量少犯或不犯低级错误。


    Java引用与Java垃圾回收机制的关系
    当Java虚拟机(JVM)觉得内存不够用的时候,会触发垃圾回收操作(GC),清除无用的对象,释放内存。可是如何判断一个对象是否是垃圾呢?其中的一个方法是计算指向该对象的引用数量,如果引用数量为0,那么该对象就为垃圾(Thread对象是例外),否则还有用处,不能被回收。但是如果把引用数为0的对象都回收了,还是不能满足内存需求怎么办?Java把引用分为4种类型,垃圾回收器会尝试回收只有弱引用的对象。

    按照一个对象的引用可达(Reachable)强度,由强到弱分为5类,如下:

    强可达(Strong Reachable)

    在一个线程内,无需引用直接可达,新创建的对象是强可达的。
    软可达(Soft Reachable)

    不是强可达的,但是通过一个软引用(SoftReference)可达。
    弱可达(Soft Reachable)

    既不是强可达也不是软可达,但是通过一个弱引用(WeakReference)可达。
    虚可达(Phantom Reachable)

    既不是强可达,不是软可达,也不是弱可达,但是通过一个虚引用(PhantomReference)可达。
    不可达(Unreachable)

    没有任何引用指向对象。

    比较好、容易理解的是Java垃圾回收器会优先清理可达强度低的对象。另外有两个重要的点:

    强可达的一定不会被清理
    JVM保证抛出out of memory之前,清理所有的软引用对象


    兄弟连Java培训分享以下4种Java引用
    在实现一个缓存系统的时候,如果全部使用强引用,那么你需要自己去手动的把某些引用clear掉(引用置位null),否则迟早会抛出out of memory错误。缓存系统引入弱引用或者软引用的唯一原因是,把引用clear的事情交由Java垃圾回收器来处理,cache程序自己置身事外。

    几种弱引用的使用方式非常相近。下面分别介绍4种引用类型。

    强引用(StrongReference)
    我们平时申明变量使用的就是强引用,普通系统99%以上都是强引用。比如,
    String s = "Hello World"


    弱引用(WeakReference)
    垃圾回收器某个时刻决定回收软可达的对象的时候,会清理软引用,并可选的把引用存放到一个引用队列(ReferenceQueue)。

    软引用(SoftReference)
    类似弱引用,只不过Java虚拟机会尽量让软引用的存活时间长一些,迫不得已才清理。

    虚引用(PhantomReference)
    仅用来处理资源的清理问题,比Object里面的finalize机制更灵活。get方法返回的永远是null,Java虚拟机不负责清理虚引用,但是它会把虚引用放到引用队列里面。

    两个测试例子
    使用HashMap,会报out of memory错误。

    [java] view
    plain copy

    public static void main(String[] args) {

    Map<String, String> list = new HashMap<String, String>();

    long i = 1;

    while (i < 100000000L) {

    list.put(

    String.valueOf(i),

    "JDJJDJJJJJJJJJJ%%%%%%%%JJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKJJJJJJ"

    + "JJJKKKKKHDDDJDJDJDJDJDJDJDJJDJDJDJDJDJDJJDJDJDJDJJDJDJJJJJJJJJ"

    + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ"

    + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJ");

    // 测试第一个是否依然存活

    if (i % 100000 == 0) {

    System.out.println(list.get(String.valueOf(1)));

    }

    i++;

    }

    }

    使用WeakHashMap,不会报out of memory错误。

    [java] view
    plain copy

    public static void main(String[] args) {

    Map<String, String> list = new WeakHashMap<String, String>();

    long i = 1;

    while (i < 100000000L) {

    list.put(

    String.valueOf(i),

    "JDJJDJJJJJJJJJJ%%%%%%%%JJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKJJJJJJ"

    + "JJJKKKKKHDDDJDJDJDJDJDJDJDJJDJDJDJDJDJDJJDJDJDJDJJDJDJJJJJJJJJ"

    + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ"

    + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJ");

    // 测试第一个是否依然存活

    if (i % 100000 == 0) {

    System.out.println(list.get(String.valueOf(1)));

    }

    i++;

    }

    }

    小结
    Java语言里面数组(Array)、列表(List)、Map等容器,对里面的每一个对象都有一个引用,大数据的情况下要小心内存泄露。弱引用只适合cache等特殊场景,对于那些一定不能Java让垃圾回收器回收的对象,要使用强引用。
    展开全文
  • 四种Java引用浅解

    2016-08-21 16:06:53
    最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档、代码以及几篇文章。做个小结,如有错误,欢迎指正。 之所以想学习一下Java的...Cache不是仅仅HashMap那么简单,Java引用与Ja

    最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档、代码以及几篇文章。做个小结,如有错误,欢迎指正。

    之所以想学习一下Java的几种引用类型,原因有两个:

    • 理解Java Cache实现、学习Java引用与Java垃圾回收机制的关系
      内存资源是有限的,需要合理的利用。Cache不是仅仅HashMap那么简单,Java引用与Java垃圾回收机制也有非常紧密的关系。
    • 避免对Java引用的错误使用
      某个同事把5000+交易数据放到一个HashMap里面,用一个Spring Singleton Bean的全局属性指向该HashMap。大量运用这种技术,很快就报out of memory。再大的内存也架不住对内存的错误使用。理解原理有助于我们尽量少犯或不犯低级错误。

    Java引用与Java垃圾回收机制的关系

    当Java虚拟机(JVM)觉得内存不够用的时候,会触发垃圾回收操作(GC),清除无用的对象,释放内存。可是如何判断一个对象是否是垃圾呢?其中的一个方法是计算指向该对象的引用数量,如果引用数量为0,那么该对象就为垃圾(Thread对象是例外),否则还有用处,不能被回收。但是如果把引用数为0的对象都回收了,还是不能满足内存需求怎么办?Java把引用分为4种类型,垃圾回收器会尝试回收只有弱引用的对象。

    按照一个对象的引用可达(Reachable)强度,由强到弱分为5类,如下:

    • 强可达(Strong Reachable)
      在一个线程内,无需引用直接可达,新创建的对象是强可达的。
    • 软可达(Soft Reachable)
      不是强可达的,但是通过一个软引用(SoftReference)可达。
    • 弱可达(Soft Reachable)
      既不是强可达也不是软可达,但是通过一个弱引用(WeakReference)可达。
    • 虚可达(Phantom Reachable)
      既不是强可达,不是软可达,也不是弱可达,但是通过一个虚引用(PhantomReference)可达。
    • 不可达(Unreachable)
      没有任何引用指向对象。

    比较好、容易理解的是Java垃圾回收器会优先清理可达强度低的对象。另外有两个重要的点:

    • 强可达的一定不会被清理
    • JVM保证抛出out of memory之前,清理所有的软引用对象

    4种Java引用

    在实现一个缓存系统的时候,如果全部使用强引用,那么你需要自己去手动的把某些引用clear掉(引用置位null),否则迟早会抛出out of memory错误。缓存系统引入弱引用或者软引用的唯一原因是,把引用clear的事情交由Java垃圾回收器来处理,cache程序自己置身事外

    几种弱引用的使用方式非常相近。下面分别介绍4种引用类型。

    强引用(StrongReference)

    我们平时申明变量使用的就是强引用,普通系统99%以上都是强引用。比如,String s = "Hello World"

    弱引用(WeakReference)

    垃圾回收器某个时刻决定回收软可达的对象的时候,会清理软引用,并可选的把引用存放到一个引用队列(ReferenceQueue)。

    软引用(SoftReference)

    类似弱引用,只不过Java虚拟机会尽量让软引用的存活时间长一些,迫不得已才清理。

    虚引用(PhantomReference)

    仅用来处理资源的清理问题,比Object里面的finalize机制更灵活。get方法返回的永远是null,Java虚拟机不负责清理虚引用,但是它会把虚引用放到引用队列里面。

    两个测试例子

    使用HashMap,会报out of memory错误。

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. public static void main(String[] args) {  
    2.         Map<String, String> list = new HashMap<String, String>();  
    3.         long i = 1;  
    4.         while (i < 100000000L) {  
    5.             list.put(  
    6.                     String.valueOf(i),  
    7.                     "JDJJDJJJJJJJJJJ%%%%%%%%JJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKJJJJJJ"  
    8.                             + "JJJKKKKKHDDDJDJDJDJDJDJDJDJJDJDJDJDJDJDJJDJDJDJDJJDJDJJJJJJJJJ"  
    9.                             + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ"  
    10.                             + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJ");  
    11.   
    12.             // 测试第一个是否依然存活  
    13.             if (i % 100000 == 0) {  
    14.                 System.out.println(list.get(String.valueOf(1)));  
    15.             }  
    16.   
    17.             i++;  
    18.         }  
    19.     }  

    使用WeakHashMap,不会报out of memory错误。

    [java] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. public static void main(String[] args) {  
    2.         Map<String, String> list = new WeakHashMap<String, String>();  
    3.         long i = 1;  
    4.         while (i < 100000000L) {  
    5.             list.put(  
    6.                     String.valueOf(i),  
    7.                     "JDJJDJJJJJJJJJJ%%%%%%%%JJJJJJJJJJJJJJJKKKKKKKKKKKKKKKKKJJJJJJ"  
    8.                             + "JJJKKKKKHDDDJDJDJDJDJDJDJDJJDJDJDJDJDJDJJDJDJDJDJJDJDJJJJJJJJJ"  
    9.                             + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJ"  
    10.                             + "JJJJJJJJJJJJJJJJJJJJJJJJJJJJ");  
    11.   
    12.             // 测试第一个是否依然存活  
    13.             if (i % 100000 == 0) {  
    14.                 System.out.println(list.get(String.valueOf(1)));  
    15.             }  
    16.   
    17.             i++;  
    18.         }  
    19.     }  


    小结

    Java语言里面数组(Array)、列表(List)、Map等容器,对里面的每一个对象都有一个引用,大数据的情况下要小心内存泄露。弱引用只适合cache等特殊场景,对于那些一定不能Java让垃圾回收器回收的对象,要使用强引用。

    参考连接

    展开全文
  • Java 四种引用

    2020-07-01 19:37:39
    最近被问到了Java四种引用类型,其实这个东西我之前有个概念,但是记得不是很清楚了。借着这个机会复习一下。 引用的概念 其实这个和Java的GC很相关,当虚拟机内存不足的时候发生GC,那么到底需要回收哪些对象呢?...

    背景

    最近被问到了Java的四种引用类型,其实这个东西我之前有个概念,但是记得不是很清楚了。借着这个机会复习一下。

    引用的概念

    其实这个和Java的GC很相关,当虚拟机内存不足的时候发生GC,那么到底需要回收哪些对象呢?这里有很多GC算法,但是基本都逃不过一个基本的理念:计算对象的引用状况。比如引用计数,可达性分析等等,本质上都是在考察该对象是不是被其他对象引用。但是如果虚拟机发现现在所有的对象都是被引用的,那么这个时候该回收谁?为了区分这些对象呗引用的"强度",jdk在1.2之后,增加了三种其他类型的引用。

    强引用

    这个就是我们平时的赋值操作。

    public class Main {
        public static void main(String[] args) {
            Object o=new Object();
        }
    }
    

    比如这种,就是强引用。强引用的对象在gc分析它确实是存在被引用的时候,是不会被回收的。

    软引用

    这个一般描述为还有用,但是不是必须的对象,在gc的时候可以选择牺牲它来阻止OOM。其实很类似于缓存,在JVM内存充足的时候可以存活,在JVM内存即将耗尽时选择退出。

    public class Main {
        public static void main(String[] args) {
            ReferenceQueue q=new ReferenceQueue();
            Object obj=new Object();
            SoftReference sr=new SoftReference(obj,q);
            if(sr!=null){
                obj=sr.get();
            }
        }
    }
    

    弱引用

    用于描述比软引用更加“没用“的对象。在发生GC的时候,一定会被回收。

    public class Main {
        public static void main(String[] args) {
            ReferenceQueue q=new ReferenceQueue();
            Object obj=new Object();
            WeakReference wk=new WeakReference(obj,q);
            if(wk!=null){
                obj=wk.get();
            }
        }
    }
    

    虚引用

    这个看名字就发现问题了,它不能用于获取对象实例。GC时也会被直接回收。
    基本就是这些了。其实貌似在项目代码里面没咋见过这些东西的使用。

    展开全文
  • java四种引用

    2020-03-31 12:35:20
    引用,弱引用,软引用,幽灵引用引用 就算调用GC,强引用不能被回收 class ClassA{ /** * 对象在销毁前会检测对象中有没有重写finalize方法,有的话会 * 先调用finalize()方法。 * @throws Throwable */ ...
  • java四种对象引用

    2020-07-13 19:48:48
    引用引用引用引用引用 Strongly Reference 指在程序代码之中普遍存在的引用赋值,即:Object obj = new Object()。 无论任何情况下,只要强引用关系还存在,垃圾收集器就永远不会回收掉被引用的对象...
  • java四种引用类型

    万次阅读 2020-05-11 10:04:53
    编程语言都有自己操作内存中元素的方式,例如在 C 和 C++ 里是通过指针,而在 Java 中则是通过“引用”。 java不同于c/c++,它不需要程序员自已来管理内存(分配,释放内存),java 会自己来管理内存,比如销毁...
  • Java四种引用

    2019-06-13 11:37:35
    Java四种引用
  • Java四种引用类型

    千次阅读 2019-05-12 19:01:34
    文章目录引用类型简介对象可达性判断GC Roots对象可达性判断可达性状态类型可达性判断规则状态转换Reference类定义状态变化四种引用类型实现强引用FinalReference软引用SoftReference弱引用WeakReference虚引用...
  • java 四种引用

    2019-05-10 16:53:11
    java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的...Java中提供这四种引用类型主要有两个目的: 第一是可以让程序员通过代码的方式决定某些对象的生命周期; 第二是有利于JVM进行垃圾回收。 ...
  • 谈谈Java四种引用

    2020-11-03 20:11:51
    Java中的四种引用引用引用引用引用(又称幽灵引用) 强引用 我们写代码的过程中,用到的几乎都是强引用,也就是使用new关键字创建出来的对象。强引用,顾名思义,就是引用特别强,在进行GC(垃圾回收)...
  • java四种引用分类

    2020-07-25 11:47:09
    引用:代码中普遍存在的,只要强引用还存在,垃圾收集器就不会回收掉被引用的对象。 软引用:SoftReference,用来描述还有用但是非必须的对象,当内存不足的时候会回收这类对象。 弱引用:WeakReference,用来描述...
  • Java四种引用方式

    2020-07-16 16:30:42
    文章目录Java四种引用方式强引用引用引用引用总结 Java四种引用方式 强引用 class TestReference{ // 方便垃圾回收时显示 @Override protected void finalize() throws Throwable { System.out.println...

空空如也

1 2 3 4 5 ... 20
收藏数 4,150
精华内容 1,660
关键字:

四种java引用

java 订阅