1、强引用

强引用,是在我们的开发工作当中普遍存在的。如果一个对象具有强引用,那就类似我们经常穿的衣服啊等必不可少的生活用品,我们肯定不会把他扔掉,同样jvm的垃圾回收器也不会回收它。当内存空间不足的时候,java虚拟机宁可抛出OOM异常,也不会回收具有强引用的对象来释放内存。我们可以将对象显示的赋值为null,则gc认为该对象不存在引用,这时就可以回收这个对象。具体什么时候收集这要取决于gc的算法。也就是说方法的内部有一个强引用,这个引用保存在栈中,而真正的引用内容(Object)保存在堆中。当这个方法运行完成后就会退出方法栈,则引用内容的引用不存在,这个Object会被回收。

2、软引用

SoftReference:是比强引用弱化的引用,可以让对象豁免一些垃圾回收,软引用通常在对内存比较敏感的程序中,例如高速缓存区,mybatis就是用到了该方式。他的特点就是 存充足的时候不被回收,内存不足时才被回收。

package com.jalja.java.reference;

import java.lang.ref.SoftReference;

/**
* @Auther: XL
* @Date: 2019/12/24 07:50
* @Description:
*/
public class SoftReferenceTest {
public static void main(String [] args) throws Exception{
//softReferenceAmple();
softReferenceNotAmple();
} /**
* 内存充足
*/
private static void softReferenceAmple(){
Object o=new Object();
SoftReference<Object> reference=new SoftReference<>(o);
System.out.println(o);
System.out.println(reference.get()); o=null;
System.gc();
System.out.println(o);
System.out.println(reference.get());
} /**
* 内存不足就回收
*/
private static void softReferenceNotAmple(){
Object o=new Object();
SoftReference<Object> reference=new SoftReference<>(o);
System.out.println(o);
System.out.println(reference.get());
o=null;
try {
byte[]bytes=new byte[30*1024*1024];
}finally {
System.out.println(o);
System.out.println(reference.get());
}
}
}

3、弱引用

WeakReference:无论内存是否足够,只要发生GC 弱引用的对象一定被回收

package com.jalja.java.reference;

import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap; /**
* @Auther: XL
* @Date: 2019/12/24 08:02
* @Description:
*/
public class WeakReferenceTest {
public static void main(String [] args) throws Exception{
weakReferenceTest();
} /**
* 内存充足
*/
private static void weakReferenceTest(){
Object o=new Object();
WeakReference<Object> reference=new WeakReference<>(o);
System.out.println(o);
System.out.println(reference.get()); o=null;
System.gc();
System.out.println("==========GC=========");
System.out.println(o);
System.out.println(reference.get());
}
private static void weakHashMapTest(){
WeakHashMap<String,Object> weakHashMap=new WeakHashMap<>(); }
}

WeakHashMap:

4、虚引用

PhantomReference:

    public static void main(String [] args) throws Exception{
Object o=new Object();
ReferenceQueue<Object> queue=new ReferenceQueue();
PhantomReference<Object> reference=new PhantomReference<>(o,queue);
System.out.println(o);
System.out.println(reference.get());
System.out.println(queue.poll()); o=null;
System.gc();
System.out.println("==========GC=========");
System.out.println(o);
System.out.println(reference.get());
System.out.println(queue.poll());
}

引用队列:ReferenceQueue

package com.jalja.java.reference;

import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference; /**
* @Auther: XL
* @Date: 2019/12/24 08:28
* @Description: ReferenceQueue 引用队列,在GC后悔保留对象的引用
*/
public class ReferenceQueueTest {
public static void main(String [] args) throws Exception{
Object o=new Object();
ReferenceQueue<Object> queue=new ReferenceQueue();
WeakReference<Object> reference=new WeakReference<>(o,queue);
System.out.println(o);
System.out.println(reference.get());
System.out.println(queue.poll()); o=null;
System.gc();
System.out.println("==========GC=========");
System.out.println(o);
System.out.println(reference.get());
System.out.println(queue.poll());
}
}

JVM 引用类型的更多相关文章

  1. Java面试步步走

    一.Java 基础 1.Java 集合原理 2.Java 多线程.同步集合.并发集合.阻塞队列.线程池.各种锁等 3.JVM 垃圾回收机制.JVM 引用类型.JVM 内存模型 二.应用技术基础 1)数 ...

  2. JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM ...

  3. 基本数据类型用== 比较数值 引用类型用==比较的是jvm中的地址 比较数值用equal

    基本数据类型用== 比较数值     引用类型用==比较的是jvm中的地址 比较数值用equal

  4. @JVM中对象的引用类型

    JVM中有四种引用类型:强引用.软引用.弱引用.虚引用   强引用(Stong Reference):是指在程序代码中普遍存在的,类似:Object obj = new Object()这类的引用,只 ...

  5. 第三章 JVM内存回收区域+对象存活的判断+引用类型+垃圾回收线程

    注意:本文主要参考自<深入理解Java虚拟机(第二版)> 说明:查看本文之前,推荐先知道JVM内存结构,见<第一章 JVM内存结构> 1.内存回收的区域 堆:这是GC的主要区域 ...

  6. JVM学习(五)对象的引用类型

    一.引言 前面我们学习了JVM的垃圾回收机制,我们知道了垃圾回收是JVM的自发行为:虽然我们可以通过System.gc() 或Runtime.getRuntime().gc()进行显式调用垃圾回收 , ...

  7. JVM垃圾回收机制之引用类型

    一:引用的类型 javac编译器编译源文件后,生成字节码文件,在类加载器加载字节码文件到内存中时,在内存中开辟 空间,栈.堆以及方法区,来存放对象以及引用.引用可以分为四种: 强引用:平常我们在编写程 ...

  8. JVM学习(4)——全面总结Java的GC算法和回收机制

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的 ...

  9. JVM学习(2)——技术文章里常说的堆,栈,堆栈到底是什么,从os的角度总结

    俗话说,自己写的代码,6个月后也是别人的代码……复习!复习!复习!涉及到的知识点总结如下: 堆栈是栈 JVM栈和本地方法栈划分 Java中的堆,栈和c/c++中的堆,栈 数据结构层面的堆,栈 os层面 ...

随机推荐

  1. 自主开发编程语言被指Python套壳,中科院开发者道歉

    中科院计算所团队“完全自主设计.开发和实现”的“木兰”编程语言是Python语言的套壳产品?针对近日这一网络质疑,1月17日,项目负责人.中科院计算所编译实验室员工刘雷在科学网上发表回应称,木兰语言在 ...

  2. 基于EFCore3.0+Dapper 封装Repository

    Wei.Repository 基于EFCore3.0+Dapper 封装Repository,实现UnitOfWork,提供基本的CURD操作,可直接注入泛型Repository,也可以继承Repos ...

  3. 数据库之十一:CASE表达式

    1.简单Case表达式: 基本语法: CASE <表达式> WHEN <表达式> THEN <表达式> WHEN <表达式> THEN <表达式& ...

  4. Spring学习笔记-Spring之旅-01

    使用Spring简化JAVA开发 Spring的四种关键策略: ●基于POJO的轻量级和最小侵入式编程: ●通过依赖注入(DI)和面向接口实现松耦合: ●基于切面(AOP)和惯例进行声明式编程. ●通 ...

  5. Linux的VMware虚拟机无法上网问题

    很多时候,Linux无法上网,不管改成nat模式还是主机模式都不行.这时候可以选择进行重置: 首先点击编辑,之后点击虚拟网络编辑器, 然后移除VMnet0和VMnet8网络,点击确定: 然后再打开虚拟 ...

  6. 假期学习【十】首都之窗百姓信件JavaWweb+Echarts图表展示

    今天主要对昨天爬取的数据进行处理,处理后用Echart图表展示, 效果如下:

  7. 编辑当前目录及其子目录,对比指定文件大小 (bat)

    @echo off :: 设置对比大小校验(单位为kb) set COMPARE=100 ::指定起始文件夹 cd %~dp0/ set DIR_PATH=%cd% :: 输出文件目录 set RES ...

  8. python2.6升级python2.7后,yum不能用了,如何解决

    背景: 跑python的case时候,发现log功能不好用,于是升级了python2.6-->python2.7 but,升级之后,发现yum命令不好用了.怎么办? 百度搜了一下,如何解决: 参 ...

  9. Selenium3+python自动化009- 截图

    一.断言 assert cur_title=='百度一下,你就知道1','title断言失败' 'title断言失败':自定义报错 二.截图 # 调用截屏方法(路径+截图名称)driver.get_s ...

  10. 解决Maven依赖报红的批处理文件

    maven经常因为网络或者其他原因导致仓库jar包下载不完整,导致jar包依赖报红,此小工具可以一键删除未下载完成文件 set REPOSITORY_PATH=E:\deplor\apache-mav ...