java中有四种引用类型,分别是

强引用

强引用也就是我们通常认为的java中的中的引用关系

通过new创建一个对象,然后赋值给一个变量,这个时候这个变量指向堆中地址的引用就是一个强引用

他收到JVM的管理,当JVM发生GC的时候,如果有强引用指向了空的话,那么这个时候GC就会对这类对象进行进行回收

软引用

-Xmx10m // 配置最大堆内存为10MB

import java.lang.ref.SoftReference;

public class MyReference {

public static void main(String[] args) throws InterruptedException {

// int占用4个字节,创建一个5MB大小的数组

SoftReference softReference = new SoftReference(new int[5 * 1024 * 1024 / 4]);

System.out.println(softReference.get());

System.gc();

Thread.sleep(2000);

System.out.println(softReference.get());

SoftReference softReference1 = new SoftReference(new int[1024 * 1024 / 4]);

System.out.println(softReference.get());

System.out.println(softReference1.get());

}

}

软引用通过SoftReference来指向

GC是不直接回收弱引用的,只有等堆内存不够了,才会回收前面分配的这些对象

软引用用的不多

弱引用

import java.lang.ref.WeakReference;

public class MyReference {

public static void main(String[] args) {

WeakReference weakReference = new WeakReference(new Object());

System.out.println(weakReference.get());

System.gc();

System.out.println(weakReference.get());

}

}

弱引用的话会如果发生GC的话会直接断开

ThreadLocal里面就是用到了弱引用,是这样用的

ThreadLocal用来保存线程独有的信息,可以get/set一个值,这个值是一个泛型,可以自己指定

ThreadLocal不是所有线程共享一个变量,里面是一个map,key是Thread,value是值,而是每个线程有自己的ThreadLocalMap,map里面存的是

Thread里面有一个ThreadLocal.ThreadLocalMap变量,之所以这样是好维护

ThreadLocalMap里面是一个个Entry,Entry的key是ThreadLocal,而且是一个弱引用,在每次GC的时候如果就会GC(如果没有强引用的时候)

但是依然会有内存泄漏的问题,key对应的ThreadLocal可能GC了,但是Entry不会GC,不过JDK开发人员早考虑到了,在get和set方法的时候会判断key为null的情况,如果是的话把entry就设置为null,方便下次回收。不过这个存在的问题就是如果不执行的话那么就会一直存在,依赖于用户

虚引用

public static void main(String[] args) {

ReferenceQueue queue = new ReferenceQueue<>();

PhantomReference phantomReference = new PhantomReference(new Object(),queue);

System.gc();

System.out.println(phantomReference.get());

System.out.println(queue.poll());

}

虚引用的通过get方法是获取不到的,主要用来在对象回收以后获得通知的。

虚引用会用在直接内存中使用,直接内存为了减少内存拷贝的问题,不管网络中的数据还是数据库或者磁盘中的数据,都要先读到内存再进入jvm内存,jvm才可以操作。在netty或jdk中DirectByteBuffer都使用到了,但是问题是直接内存不属于JVM运行时内存,GC算法不会直接处理,其实就是通过DirectByteBuffer虚引用指向了堆外内存,等堆内引用消失以后会通过JNI之类方法回收掉堆外内存

Java若_【JAVA基础】JAVA四种引用(强软若虚)相关推荐

  1. JVM的四种引用:强,软,弱,虚(与gc有关)

    JVM的四种引用 强 软 弱 虚 强 gc时不回收 软 软引用对象在gc时,在内存溢出前,会回收; 弱 弱引用对象在gc时,不论内存使用情况都会回收; 虚 虚引用对象在gc后,会发送一条通知给 Ref ...

  2. 【深入Java虚拟机JVM 08】JVM四种引用-强引用、软引用、弱引用、虚引用

    说明:文章所有内容均摘自<深入理解Java虚拟机:JVM高级特性与最佳实践(第二版)> 无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象的引用链是否可达,判定对象是 ...

  3. java中的强软弱虚_详解Java的四种引用——强软弱虚,颠覆你的认知!

    强软弱虚 java中的数据被类型分为了两类,它们分别是基本类型和引用类型.一般我们new出来的对象都属于引用类型的范畴.我们知道java是有垃圾回收机制的一种语言,根据垃圾回收时的策略,java将对于 ...

  4. java分布式_分布式锁的四种JAVA实现方式

    前言 作为这一段时间学习分布式锁的总结,本文总结了四种Java分布式锁的实现方式,简单编写了代码,进行模拟实现.相关代码存放在我的github仓库. 为什么要用锁 系统内,有多个消费者,需要对同一共享 ...

  5. Java中被你忽视的四种引用

    正文开始前,有必要先了解下Java内存分配与回收,请见我的相关博文. ---------------------------------- Java的数据类型分为两类:基本数据类型.引用数据类型. 基 ...

  6. Java的四种引用——强软弱虚

    https://blog.csdn.net/hbn13343302533/article/details/106993108/

  7. 垃圾回收之如何判断对象可以回收、四种引用以及实际案例操作

    垃圾回收 JVM内存结构中的堆存在垃圾回收机制,我们接下来就来详细地学习一下垃圾回收的相关知识. 1. 如何判断对象可以回收 1.1 引用计数法 只要一个对象被其他变量所引用,那就让这个对象的计数+1 ...

  8. java 四种内存_不可访问内存 Java四种引用包括强引用,软引用,弱引用,虚引用...

    小结: 1.不可访问内存是指一组没有任何可访问指针指向的由计算机程序进行动态分配的内存块. 2.垃圾收集器能决定是否一个对象还是可访问的:任何被确定不可访问的对象将会被释放. https://zh.w ...

  9. java将一个整数按字节输出_在java中的整数类型有四种,分别是 byte  short int long 其中byte只有一个字节 0或1,在此不详细讲解。其他的三种类型如下:1、...

    在java中的整数类型有四种,分别是 byte  short int long 其中byte只有一个字节 0或1,在此不详细讲解. 其他的三种类型如下: 1. 基本类型:short 二进制位数:16 ...

  10. 【Java基础】四种Java引用类型

    四种引用类型说明 虚引用的补充说明 "虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期.如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在 ...

最新文章

  1. 美颜算法之自动祛斑算法实现 | 案例分享
  2. python 运算太慢怎么办_python:网络安全攻击与防御的工具
  3. LeetCode 01两数之和02两数相加
  4. 【收藏】win10利用WSL2安装docker的2种方式
  5. apache站点优化—数据压缩
  6. SAP table HRP1000的妙用
  7. Oracle自动性能统计
  8. Linux开发cocos2dx程序环境搭建
  9. linux用vfork创建进程,[Linux进程]使用vfork创建子进程并且执行命令
  10. C语言里面具有外部链接的静态变量这里的链接是什么意思
  11. (5)通过Node.js 运行JS代码
  12. 使用Spring框架对接Twitter(一)
  13. SQLite 入门教程(四)增删改查,有讲究 (转)
  14. ElectronNetTest
  15. 适合编写C语言代码的编程软件有哪些?大学生赶紧行动起来!
  16. 气象数据之积温数据的获取与处理
  17. 走进Linux内核网络 套接字的秘密—socket与sock
  18. 沈向洋:为何读论文这么难?
  19. vant步进器传值_有赞开源的Vue 2.0 的 Mobile 组件库 Vant
  20. Python获取免费代理IP,并全部测试一遍,结果大失所望

热门文章

  1. SAP Spartacus scss 变量--cx-spatial-base赋值的地方
  2. Eclipse里选择Servlet Run As Server后,自动生成了哪些资源?
  3. 使用Javap分析Java代码里的static final的工作原理
  4. 2015-03-19 My Appointment text read case
  5. what does packaging mean in pom.xml
  6. Document Builder: 怎样根据document ID使用API获得document的所有数据
  7. workflow and email in QD3 - IS_INBOX_USER method
  8. 在同一个workprocess里对两张表分别使用online update和update function module update
  9. 另一种无法enable ABAP source code tool的原因
  10. Install Cloud foundry MTA plugin