Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)
书上P65.
StrongReference(强引用)
类似Object obj = new Object() 这类的引用 就是强引用.
SoftReference(软引用)
用来描述一些有用但并非必需的对象. 在系统将要发生内存溢出异常前, 将会把这些对象列进回收范围之中, 进行二次回收.(如果这次回收了之后, 内存还是不足, 那么就会抛出内存溢出异常)
执行下面这段代码的时候, 设置一下虚拟机参数-Xms2m -Xmx2m. 设置最大堆内存. 不然程序要运行很久才能堆内存溢出....
import java.lang.ref.SoftReference;
import java.util.ArrayList;
import java.util.List; /**
* VM Options: -Xms2m -Xmx2m
*/
public class Main {
public static void main(String[] args) {
Dog<String> dog = new Dog<>(new String("1234321"));
System.out.println("内存溢出之前: " + dog.get()); // 1234321 try {
for (List<Object> arrayList = new ArrayList<>(); ; )
arrayList.add(new Object());
} catch (Throwable e) {
System.out.println("内存溢出时:" + dog.get()); // null
}
} static class Dog<V> extends SoftReference<Object> {
public Dog(V value) {
super(value);
}
}
}
输出结果如下:
WeakReference(弱引用)
弱引用也是用来描述非必需对象的, 强度比软引用还要弱. 被弱引用关联的对象只能生存到下一次垃圾收集器发生之前. 当垃圾收集器工作时, 无论当前内存是否足够, 都会被回收掉. (这里指的是"只有弱引用"的情况, 如果同时还被其他强引用关联了, GC Root可达, 那么当然不会被回收了.)
import java.lang.ref.WeakReference; public class Main {
public static void main(String[] args) {
Integer a = new Integer(111);
String b = new String("222");
Node wrc = new Node(a, b);
System.out.println("gc之前: " + wrc.get());
System.out.println(wrc.value);
a = null;
System.gc();
System.out.println("gc之后: " + wrc.get());
System.out.println(wrc.value); }
} class Node<K, V> extends WeakReference<Object> {
V value; public Node(K key, V value) {
super(key);
this.value = value;
}
}
PhantomReference(虚引用, 幽灵引用, 幻影引用)
这是最弱的引用. 这个不会影响到对象的生存时间. 也无法通过ge()来获取到对象实例(永远是null).
不过可以用虚引用让一个对象被收集器回收时执行一段通知.
本段例子来自于https://www.baeldung.com/java-phantom-reference
/**
* https://www.baeldung.com/java-phantom-reference
*/
public class PhantomReferenceTest {
public static void main(String[] args) {
ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
List<LargeObjectFinalizer> references = new ArrayList<>();
List<Object> largeObjects = new ArrayList<>(); for (int i = 0; i < 3; ++i) {
Object largeObject = new Object();
largeObjects.add(largeObject);
references.add(new LargeObjectFinalizer(largeObject, referenceQueue));
} for (PhantomReference<Object> reference : references) {
System.out.println(reference.isEnqueued());
} largeObjects = null;
System.gc(); for (PhantomReference<Object> reference : references) {
System.out.println(reference.isEnqueued());
} for (Reference<?> referenceFromQueue; (referenceFromQueue = referenceQueue.poll()) != null; referenceFromQueue.clear()) {
((LargeObjectFinalizer) referenceFromQueue).finalizeResources();
}
} static class LargeObjectFinalizer extends PhantomReference<Object> { LargeObjectFinalizer(Object referent, ReferenceQueue<? super Object> q) {
super(referent, q);
} void finalizeResources() {
System.out.println("clearing ...");
}
}
}
输出结果如下:
Java四种引用--《深入理解Java虚拟机》学习笔记及个人理解(四)的更多相关文章
- Java虚拟机15:再谈四种引用状态
JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分 ...
- Java虚拟机19:再谈四种引用状态
JVM的四种引用状态 在Java虚拟机5:Java垃圾回收(GC)机制详解一文中,有简单提到过JVM的四种引用状态,当时只是简单学习,知道有这么一个概念,对四种引用状态理解不深.这两天重看虚拟机这部分 ...
- JAVA四种引用方式
JAVA四种引用方式: java.lang.ref: 强引用(直接变量赋值) 软引用(SoftReference): 只有在要发生OOM错误之前才会回收掉老的软引用对象,应用场景主要防止内存溢出.(缓 ...
- Java虚拟机(五)Java的四种引用级别
1.前言 HotSpot采取了可达性分析算法用来判断对象是否被能被GC,无论是引用计算法还是可达性分析算法都是判断对象是否存在引用来判断对象是否存活.如果reference类型的数据中存储的数值代表的 ...
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- Java四种引用包括强引用,软引用,弱引用,虚引用。
Java四种引用包括强引用,软引用,弱引用,虚引用. 强引用: 只要引用存在,垃圾回收器永远不会回收Object obj = new Object();//可直接通过obj取得对应的对象 如obj.e ...
- Java 中的四种引用及垃圾回收策略
Java 中有四种引用:强引用.软引用.弱引用.虚引用: 其主要区别在于垃圾回收时是否进行回收: 1.强引用 使用最普遍的引用.如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会 ...
- JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例
简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...
- Java基础:Java的四种引用
在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...
随机推荐
- (五)图数据库数neo4j据备份与恢复
1.备份方式 neo4j目前有三种备份方式: (1)java在线备份,通过java程序可在neo4j启动状态下备份数据,也可远程备份(社区版本目前不支持) (2)neo4j-admin工具,可在neo ...
- python高级(4)—— 虚拟环境安装使用
虚拟环境 什么是虚拟环境 对电脑稍微有点常识的朋友相信都玩过,比如VMware,virtualbox,或者你用电脑端的模拟器玩手机端的游戏也是一样,其实就是一个假的空间,在Python这里,虚拟环境就 ...
- DVWA-XSS学习笔记
DVWA-XSS XSS概念:由于web应用程序对用户的输入过滤不严,通过html注入篡改网页,插入恶意脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击. XSS类型: 反射型XSS:只是简单地把 ...
- jpa 解决org.hibernate.lazyinitializationexception could not initialize proxy - no session
org.hibernate.LazyInitializationException: could not initialize proxy [org.alan.entity.SysUser#1] - ...
- 抓包工具Charles安装时需要注意的地方
最新接到一个任务,需要为app端的升级提供新的接口.以前没有搞过这个,其实搞完之后也就那样!其中有很重要的一点,就是需要用到抓包工具,进行联调测试,观看app端的数据情况. 抓包工具最常用的两个:fi ...
- 使用docker安装mysql和redis
本文介绍在linux下使用docker安装mysql和redis. 原文地址:代码汇个人博客 http://www.codehui.net/info/59.html 测试环境:centos7.6,do ...
- 【shell实例】定时21:00-21:05,循环调用DSQL脚本,其它时段自动退出
1.功能描述: 每日21:00定时调起test.sh,循环调起DSQL脚本test.dsql,直到21:05程序自动退出,捕获日志到相应log文件中. 2.日志文件: (1)日期.log文件中含Err ...
- Storm入门(五)Twitter Storm如何保证消息不丢失
转自:http://xumingming.sinaapp.com/127/twitter-storm如何保证消息不丢失/ storm保证从spout发出的每个tuple都会被完全处理.这篇文章介绍st ...
- 001_Go hello world
一.go获取程序参数及指针地址示例 package main import ( "fmt" "os" ) func main() { fmt.Println(o ...
- ASP.NET Core 2.2 十九. Action参数的映射与模型绑定
前文说道了Action的激活,这里有个关键的操作就是Action参数的映射与模型绑定,这里即涉及到简单的string.int等类型,也包含Json等复杂类型,本文详细分享一下这一过程.(ASP.NET ...