java的几种引用之二
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import java.util.Map;
import java.util.WeakHashMap;
public class Ref {
public Ref(){
}
public static void main(String[] args){
try {
// test1();
// test2();
// test3();
// test4();
// test5();
test6();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
/**
* 强引用,JVM的默认实现
* @throws InterruptedException
*/
public static void test1()throws InterruptedException{
Object obj = new Object();
Object strong =obj;
obj =null;
//一个对象具有强引用垃圾机制不会回收它,当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题
System.gc();
Thread.sleep(1000);
System.out.println("strong="+strong);
}
/**
* WeakReference 弱引用 当所引用对象在JVM,内不再强引用是,GC后 weak reference 将会被自动回收
* @throws InterruptedException
*/
public static void test2() throws InterruptedException{
Object obj = new Object();
WeakReference<Object> wr = new WeakReference<Object>(obj);
obj=null;
System.gc();
Thread.sleep(1000);
System.out.println("wr.get()="+wr.get());
System.out.println("wr="+wr);
wr.clear();
System.out.println("w111r="+wr.get());
}
/**
* SoftReference 软引用 SoftReference 于 weakReference 的特性基本一致,最大区别在于
* SoftReference 会尽可能长的保留引用直到JVM 内存不足时才会被回收(虚拟机保证)
* @throws InterruptedException
*/
public static void test3() throws InterruptedException{
Object obj = new Object();
SoftReference<Object> sr = new SoftReference<Object>(obj);
obj=null;
System.gc();
Thread.sleep(1000);
System.out.println("sr.get()="+sr.get());
}
/**
* PhantomReference 虚引用 Phantom Reference 与 WreakReference 和 SoftReference 有
* 很大的不同,因为get()方法永远返回null
* @throws InterruptedException
*/
public static void test4() throws InterruptedException{
Object obj = new Object();
ReferenceQueue<Object> rq = new ReferenceQueue<Object>();
PhantomReference<Object> pr = new PhantomReference<Object>(obj, rq);
System.out.println("pr.get()="+pr.get());
}
/**
* ReferenceQueue
* @throws InterruptedException
*/
public static void test5() throws InterruptedException{
Object obj = new Object();
ReferenceQueue<Object> rq = new ReferenceQueue<Object>();
WeakReference<Object> pr = new WeakReference<Object>(obj, rq);
System.out.println("**pr.enqueue()="+pr.enqueue());
System.out.println("**pr.isEnqueued()="+pr.isEnqueued());
System.out.println("**pr="+pr);
System.out.println("**rq.poll()="+rq.poll());
obj=null;
System.gc();
System.out.println("pr.enqueue()="+pr.enqueue());
System.out.println("**pr.isEnqueued()="+pr.isEnqueued());
System.out.println("pr="+pr);
System.out.println("rq.poll()="+rq.poll());
System.out.println("obj5="+obj);
}
/**
* 使用WeakReference 作为key,一旦没有指向key 的强引用
* weakHashMap 在gc 后将自动删除相关的
* @throws InterruptedException
*/
public static void test6()throws InterruptedException{
Map<Object,Object> map = new WeakHashMap<Object,Object>();
Object key = new Object();
Object value = new Object();
map.put(key,value);
key =null;
System.out.println("value="+value);
System.out.println("key="+key);
System.out.println("map.containsValue(value)="+map.containsValue(value));
System.out.println("map="+map);
System.gc();
Thread.sleep(1000);
System.out.println("value="+value);
System.out.println("key="+key);
System.out.println("map.containsValue(value)="+map.containsValue(value));
System.out.println("map="+map);
}
}转
java的几种引用之二的更多相关文章
- Java中四种引用:强、软、弱、虚引用
这篇文章非常棒:http://alinazh.blog.51cto.com/5459270/1276173 Java中四种引用:强.软.弱.虚引用 1.1.强引用当我们使用new 这个关键字创建对象时 ...
- Java 8 的新特性和Java 的4种引用方式
一.接口的增强 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: interface Formula { double ca ...
- Java基础:Java的四种引用
在Java基础:java虚拟机(JVM)中,我们提到了Java的四种引用.包括:强引用,软引用,弱引用,虚引用.这篇博客将详细的讲解一下这四种引用. 1. 强引用 2. 软引用 3. 弱引用 4. 虚 ...
- java的四种引用,强弱软虚和jvm优化
1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.如下: Object o=new Object(); // 强引用 当内存 ...
- Java的四种引用方式
一.引用基本概念 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用.虚引用. 1.强引用(StrongRef ...
- Java的四种引用
1.强引用(StrongReference)强引用是使用最普遍的引用.如果一个对象具有强引用,那垃圾回收器绝不会回收它.当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程 ...
- JAVA的四种引用,强弱软虚用到的场景
1.强引用 最常用的引用类型,如Object object = new Object(),只要强引用存在,GC必定 不回收,即使当前内存空间不足,jAVA虚拟机宁愿抛出OutofMemoryError ...
- java 的几种引用
从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期.这四种级别由高到低依次为:强引用.软引用.弱引用和虚引用. 1.强引用 本章前文介绍的引用实际上都是强引用, ...
- Java虚拟机(五)Java的四种引用级别
1.前言 HotSpot采取了可达性分析算法用来判断对象是否被能被GC,无论是引用计算法还是可达性分析算法都是判断对象是否存在引用来判断对象是否存活.如果reference类型的数据中存储的数值代表的 ...
随机推荐
- strcpy和strcat易忽略点
首先来看一段C程序: #include <stdio.h> #include <string.h> #include <stdlib.h> void GetMem( ...
- selenium headlesschrome下设置最大窗口模式
做微博登录的时候,用selenium的chrome界面模式,可以用下面方式显示最大窗口: from selenium.webdriver.chrome.options import Options c ...
- Vue.js源码——事件机制
写在前面 因为对Vue.js很感兴趣,而且平时工作的技术栈也是Vue.js,这几个月花了些时间研究学习了一下Vue.js源码,并做了总结与输出.文章的原地址:https://github.com/an ...
- [翻译] 编写高性能 .NET 代码--第二章 GC -- 配置选项
配置选项 在基于"less rope to hang yourself with"思想下,.NET 框架没有给开发提供很多太多的配置选项.但在大多数情况下,GC会跟你的硬件配置,及 ...
- ubuntu下boost编译安装
ubuntu下boost编译安装 boost 安装 1.依赖安装 apt-get install mpi-default-dev libicu-dev python-dev python3-dev l ...
- [译]前端JS面试题汇总 Part 1(事件委托/this关键字/原型链/AMD与CommonJS/自执行函数)
原文:https://github.com/yangshun/front-end-interview-handbook/blob/master/questions/javascript-questio ...
- django-表单
一.从Request对象中获取信息 1.URL相关的信息 属性/方法 说明 举例 request.path 除域名以外的请求路径,以正斜杠开头 "/hello/" request. ...
- 1.4 random模块
Python中的random模块用于生成随机数,下面介绍一下random模块中最常用的几个函数. 国际惯例,用模块之前先导入: >>> import random (一)random ...
- Java集合框架(五)—— Map、HashMap、Hashtable、Properties、SortedMap、TreeMap、WeakHashMap、IdentityHashMap、EnumMap
Map Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组值用于保存Map里的key,另一组值用于保存Map里的value,key和value都可以是任何引用类型的数据.Map的ke ...
- 腾讯云+校园扶持计划是bug还是福利
前言 上午突然收到好友的微信消息.打开一看是关于关腾讯云"云+校园扶持计划".仔细看下了意思就是用户可以花360大洋购买腾讯云服务器配置为1核2G,1M带宽的服务器3年.(腾讯 ...