`
robinjoe
  • 浏览: 44868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】Java高级进阶学习-Java的内存回收(3)

阅读更多

(3)弱引用
  弱引用与软引用有点相似,区别在于弱引用所引用对象的生存期更短。弱引用通过WeakReference类实现,弱引用和软引用很像,但弱引用的引用级别更低。对于只有弱引用的对象而言,当系统垃圾回收机制运行时,不管系统内存是否足够,总会回收该对象所占用的内存。当然,并不是说当一个对象只有弱引用时,它就会立即被回收,正如那些失去引用的对象一样,必须等到系统垃圾回收机制运行时才会被回收.

下面程序示范了弱引用所引用对象也会被系统垃圾回收的过程.
import java.lang.ref.*;
import java.util.*;
public class WeakReferenceTest
{
public static void main(String[] args) throws Exception
{
//创建一个字符串对象
String str = new String("网络时空");
//创建一个弱引用,让此弱引用引用到"网络时空"字符串
WeakReference<String> wr = new WeakReference<String>(str); //①
//切断str引用和"网络时空"字符串之间的引用
str = null; //②
//取出弱引用所引用的对象
System.out.println(wr.get()); //③

List<String> list=new ArrayList<String>();
list.add(wr.get());

//强制垃圾回收
System.gc();
System.runFinalization();
//再次取出弱引用所引用的对象
System.out.println(wr.get()); //④
}
}

运行结果如下

Java高级进阶学习-Java的内存回收(3)

 

说明如下
上面程序创建了一个“网络时空”的字符串对象,并让str引用变量引用它。执行①行处代码时,系统创建了一个弱引用对象,并让该对象和str引用同一个对象。当程序执行到②行代码时,切断了str和"网络时空"字符串对象之间的引用关系,此时系统图如下所示
内存中分布效果图如下

Java高级进阶学习-Java的内存回收(3)


  从此内存中图示可以看出,此时“网络时空”字符串对象只有一个弱引用对象引用它,程序依然可以通过这个弱引用对象来访问字符串常量,程序中③行代码依然输出“网络时空”,接下来程序强制垃圾回收,如果系统垃圾回收机制启动,只有弱引用的对象就会被清理掉。当程序执行④行代码时,通常就会看到输出null,这表明该对象已经被清理掉了

总结说明:

1.弱引用具有很大的不确定性,因为每次垃圾回收机制执行时都会回收弱引用所引用的对象,而垃圾回收机制的运行又不受程序员的控制,因此程序获取弱引用所引用的java对象时必须小心空指针异常,通过弱引用所获取的java对象可能是null

2.由于垃圾回收的不确定性,当程序希望从弱引用中取出被引用对象时,可能这个被引用对象已经被释放了。如果程序需要使用被引用的对象,则必须重新创建该对象,这个可能可以采用如下风格的代码完成。

伪码形式表示如下

//取出弱引用所引用的对象

obj=wr.get();

//如果取出的对象为null

if(obj==null)

{

  //重新创建一个新的对象,将其使用强引用来引用它

obj=recreateIt();

//取出弱引用所引用的对象,将其赋给wr变量

wr=new WeakReference(obj);

}

...//操作obj对象

//再次切断obj和对象之间的关联

obj=null;

 

 

(4)虚引用
  软引用和弱引用可以单独使用,但虚引用不能单独使用,单独使用虚引用没有太大的意义。虚引用的主要作用就是跟踪对象被垃圾回收的状态,程序可以通过检查虚引用关联的引用队列中是否包含指定的虚引用,从而了解虚引用所引用的对象是否将被回收.
  引用队列由java.lang.ref.ReferenceQueue类表示,它用于保存被回收对象的引用。当把软引用,弱引用和引用队列联合使用时,系统回收被
引用的对象之后,将会把被回收对象对应的引用添加到关联的引用队列中。与软引用和弱引用不同的是,虚引用在对象被释放之前,将把它对应的虚引用添加到关联的队列中,这使得可以在对象被回收之前采取行动。
虚引用通过PhantomReference类实现,它完全类似于没有引用。虚引用对对象本身没有大的影响,对象甚至感觉不到虚引用的存在。如果一个
对象只有一个虚引用,那它和没有引用的效果大致相同。虚引用主要用于跟踪对象被垃圾回收的状态,虚引用不能单独使用,虚引用必须和队列ReferenceQueue联合使用.

  下面程序与上面程序基本类似,只是使用了虚引用来引用字符串对象,虚引用无法获取它引用的对象,下面程序还将和引用队列结合使用,可以看到,被虚引用所引用对象被垃圾回收后,虚引用将被添加到引用队列中。

import java.lang.ref.*;
public class PhantomReferenceTest
{
public static void main(String[] args)
throws Exception
{
//创建一个字符串对象
String str = new String("网络时空");
//创建一个引用队列
ReferenceQueue<String> rq = new ReferenceQueue<String>();
//创建一个虚引用,让此虚引用引用到"网络时空"字符串
PhantomReference<String> pr =
new PhantomReference<String>(str , rq);
//切断str引用和"网络时空"字符串之间的引用
str = null;
//试图取出虚引用所引用的对象,
//程序并不能通过虚引用访问被引用的对象,所以此处输出null
System.out.println(pr.get()); //①
//强制垃圾回收
System.gc();
System.runFinalization();
//取出引用队列中最先进入队列中引用与pr进行比较
System.out.println(rq.poll() == pr); //②
}
}

Java高级进阶学习-Java的内存回收(3)

 

  因为系统无法通过虚引用来获得被引用的对象,所以执行①处的输出语句,程序将输出null(即使此时未进行强制垃圾回收)。当程序强制垃圾回收后,只有虚引用引用的字符串对象将会被垃圾回收,当被引用的对象被回收后,对应引用将被添加到关联的引用队列中,因而将在②处代码处看到输出true.

 

分享到:
评论

相关推荐

    java经典面试题目-面经-java-Java语言的进阶概念-常用的库和框架-并发编程-网络编程-Web开发-面经

    Java中的GC(垃圾回收)是什么?如何手动触发对象的垃圾回收? 什么是Java中的设计模式?列举一些常见的设计模式。 什么是Java中的单例模式?如何实现线程安全的单例模式? 什么是Java中的生命周期回调方法?列举...

    Web服务器三剑客运维配置实战 Nginx+JVM+Tomcat+HTTP协议.zip

    ├─4.05 java细腻及讲解-jvm虚拟机常识-常用垃圾回收算法.mp4 ├─4.06 jvm运维实用排障工具.mp4 ├─4.07 jvm运维实用排障工具-jps-jstack.mp4 ├─4.08 jvm运维实用排障工具-jinfo-jstat.mp4 ├─4.09 jvm运维...

    Java进阶教程解密JVM视频教程

    * 系统地学习 JVM 内存结构,垃圾回收、字节码与类加载技术。 * 在内存结构章节,能够学习掌握 JVM内存溢出现象,堆栈内存结构,利用内存诊断工具排查问题。彻底分析 StringTable的相关知识与性能优化,掌握直接内存...

    java 进阶之路.zip

    面试高频算法、akka、多线程、NIO...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    JVM内存回收权威指南

    JVM内存回收最全的手册书籍,详细介绍了各种内存回收算法,是Java程序员进阶的必备书籍

    Java开发者技术书籍大全 - Java入门书籍.zip

    包括:,Java基础及进阶书籍,...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    Java 性能优化实战 21 讲2021年

    │ 开篇词 Java 性能优化,是进阶高级架构师的炼金石.mp4 │ 02 理论分析:性能优化有章可循,谈谈常用的切入点.mp4 │ 03 深入剖析:哪些资源,容易成为瓶颈?.mp4 │ 04 工具实践:如何获取代码性能数据?....

    java8集合源码分析-toBeTopJavaArchitect:Java架构师--成神之路

    java8 集合源码分析 Java架构师--成神之路 修改记录 版本 编写时间 作者 描述 v1.0.0 2019-10-29 Rock.Sang 梳理大纲 v1.0.1 2019-11-15 Rock.Sang 完善所有目录结构 v1.0.2 2020-01-07 Rock.Sang 添加英语模块 v...

    Java面试题合集最新版2024.zip

    二、Java进阶知识 集合框架:熟悉Java集合框架中的List、Set、Map等接口及其实现类,如ArrayList、HashSet、HashMap等。 泛型:理解泛型的概念及其在Java中的应用,如泛型类和泛型方法。 并发编程:了解Java中的...

    Java性能优化实战视频全集

    01 理论分析:性能优化,有哪些衡量指标?需要注意什么?.mp4 02 理论分析:性能优化有章可循,...17 高级进阶:JVM如何完成垃圾回收?.mp4 18 高级进阶:JIT如何影响JVM的性能?.mp4 19 高级进阶:JVM常见优化参数.mp4

    java7hashmap源码-AndroidOffer:只为帮助您获得更好的报价

    内存回收 & 状态机 JVM 类加载机制 垃圾回收算法对比 JVM 内存区域,开线程影响哪块区域内存? [对 Dalvik、ART 虚拟机有什么了解?对比?]( 虚拟机对比.md) 垃圾回收机制和调用 System.gc()的区别? 谈谈对 java ...

    《算法竞赛进阶指南》(Algorithm Competition Advanced Guide)中例题和习题的练习代码.zip

    Java是一种高性能、跨平台的面向...自动内存管理(垃圾回收): Java具有自动内存管理机制,通过垃圾回收器自动回收不再使用的对象,使得开发者不需要手动管理内存,减轻了程序员的负担,同时也减少了内存泄漏的风险。

    36.二手手机回收平台系统-基于JSP技术+ Mysql+Java+ B/S可运行源码+数据库+开发文档+lw

    36.二手手机回收平台系统|基于JSP技术+ Mysql+Java+ B/S结构的二手手机回收平台系统设计与实现(可运行源码+数据库+设计文档) 二手手机回收平台系统的主要使用者分为管理员;个人中心、用户管理、手机品牌管理、手机...

    Java开发者技术书籍大全.zip

    健壮性与高性能:Java通过垃圾回收机制确保内存的有效管理,同时也能通过JIT编译器优化来提升运行时性能。 标准库丰富:Java拥有庞大的类库,如Java SE(Java Standard Edition)包含基础API,用于开发通用应用...

    java某百货店POS积分管理系统-积分点更新生成以及通票回收处理(源代码+论文).rar

    【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或...

    java某百货店POS积分管理系统_积分点更新生成以及通票回收处理(源代码+论文).rar

    【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。【附加价值】:项目具有较高的学习借鉴价值,也可直接拿来修改复刻。对于有一定基础或...

Global site tag (gtag.js) - Google Analytics