`
中国爪哇程序员
  • 浏览: 167961 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

软引用 弱引用 虚引用 代码测试分析

    博客分类:
  • java
 
阅读更多
代码如下:
import java.lang.ref.PhantomReference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;

public class A
{
    public static void main(String[] args)
    {
	System.out.println("begin");
	User user = new User("SoftReference");
	SoftReference<User> softRef = new SoftReference<User>(user);
	System.out.println("user SoftReference hase been GC : " + softRef.isEnqueued());
	user = null;
	System.out.println("user SoftReference hase been GC : " + softRef.isEnqueued());
	System.gc();
	System.out.println("user SoftReference hase been GC : " + softRef.isEnqueued());
	System.out.println("1 :" + (softRef.get() == null));
	System.out.println(softRef.get().getName());
	System.out.println();

	user = new User("WeakReference");
	WeakReference<User> weakRef = new WeakReference<User>(user);
	System.out.println("2 :" + (weakRef.get() == null));
	System.out.println("user WeakReference hase been GC : " + weakRef.isEnqueued());
	user = null;
	System.out.println("user WeakReference hase been GC : " + weakRef.isEnqueued());
	System.out.println("3 :" + (weakRef.get() == null));
	System.gc();
	System.out.println("user WeakReference hase been GC : " + weakRef.isEnqueued());
	System.out.println("4 :" + (weakRef.get() == null));
	System.out.println();

	user = new User("PhantomReference");
	ReferenceQueue<User> refQueue = new ReferenceQueue<User>();
	PhantomReference<User> phantomRef = new PhantomReference<User>(user, refQueue);
	System.out.println("5 :" + (phantomRef.get() == null));
	System.out.println("user PhantomReference hase been GC : " + phantomRef.isEnqueued());
	user = null;
	System.out.println("user PhantomReference hase been GC : " + phantomRef.isEnqueued());
	System.gc();
	System.out.println("user PhantomReference hase been GC : " + phantomRef.isEnqueued());
    }
}

class User
{
    private String name;

    public User(String name)
    {
	this.name = "HELLO WORLD";
    }

    public String getName()
    {
	return name;
    }
}



运行结果:
begin
user SoftReference hase been GC : false
user SoftReference hase been GC : false
user SoftReference hase been GC : false
1 :false
HELLO WORLD

2 :false
user WeakReference hase been GC : false
user WeakReference hase been GC : false
3 :false
user WeakReference hase been GC : false
4 :true

5 :true
user PhantomReference hase been GC : false
user PhantomReference hase been GC : false
user PhantomReference hase been GC : true

软引用分析:
一般用于缓存,只有当JVM内存不足时,才会被GC,所以 user=null,后仍没有被GC。只有把JVM的堆内存设置小些,比较有可能设置出GC效果。另外,当GC认为扫描到的SoftReference不能经常使用时,也进行回收,存活时间可通过: -XX:SoftRefLRUPPolicyMSPerMB 来进行控制,其含义是每MB堆空间中SofteReference的存活时间,默认为1秒。

弱引用:
只要GC,就会被回收。因为当前CPU性能比较高,一个CPU时间轮转周期,就能处理完代码,所以这里手动加了GC。不手动GC在这个时间单元内是不会被GC的,而且GC的场合还汲及  saftpoint。

虚引用 :
无论何时 get()都为空。但测试isEnqueued(), 他可以监控引用对象在内存中的状态,是否被GC。

分享到:
评论

相关推荐

    referenceInJava:Java强引用,软引用,弱引用以及虚引用测试项目

    这个"referenceInJava"项目专注于探讨四种不同类型的引用:强引用、软引用、弱引用和虚引用。这些引用类型与垃圾收集(Garbage Collection, GC)机制密切相关,对于优化内存使用和防止内存泄漏至关重要。 1. **强...

    Java中引用类型传值的代码清单.pdf

    在Java编程语言中,引用类型变量实际上是对象的引用或指针,而非对象本身。当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1....

    LabVIEW中引用的概念及在VI间传递值

    LabVIEW(Laboratory Virtual Instrument Engineering Workbench)是一种图形化编程环境,主要用于开发数据采集、测试测量和控制系统。在LabVIEW中,“引用”是程序设计中的一个重要概念,它允许你直接操作对象,而...

    哈希引用开源程序的测试代码

    在这个场景中,我们关注的是一个开源程序的测试代码,标题为“哈希引用开源程序的测试代码”,这表明我们要讨论的是关于哈希引用的实现及其在实际应用中的测试方法。 哈希引用(Hash Reference)通常涉及到哈希表...

    详细分析指针的运作!判断指针使用的错误,越界!引用错误!指针数据流分析。分析静态数据相关性,java实现!

    通过上述分析,我们可以看到,理解指针的运作和应用数据流分析是提升代码质量和安全性的重要步骤。开发者应熟练掌握这些概念,以避免常见的编程陷阱,并利用现代编程语言提供的工具和技术来优化和保护他们的代码。

    利用引用的方式求圆的面积

    从提供的文件列表来看,`main.cpp`很可能是实现这些函数并进行测试的主要代码文件,而`readme.txt`可能包含项目的一些说明或者编译运行的指南。在`main.cpp`中,我们可能会看到如何调用`fn1`和`fn2`,以及如何处理...

    静态测试-代码审查

    "静态测试-代码审查" 代码审查是静态测试的一种重要方法,它通过对代码的检查和评估来发现和修复错误。代码审查的测试内容包括检查代码与设计的一致性、代码对标准的遵循、代码的逻辑表达的正确性、代码结构的合理...

    sip软电话源代码

    《 sip软电话源代码解析与应用探讨》 在IT领域,sip软电话作为一种基于SIP(Session Initiation Protocol)协议的通信工具,广泛应用于VoIP(Voice over Internet Protocol)网络中,实现语音、视频通话等功能。...

    C++虚函数表测试源码

    首先,理解虚函数的定义:在C++中,当一个基类的指针或引用指向派生类的对象时,如果该基类有一个虚函数,那么通过指针或引用调用这个函数时,会根据实际指向的对象类型来决定调用哪个函数的实现,这就是多态性。...

    googletest 源代码库和测试工程以及搭建教程文档以及实现添加多工程引用

    googletest 源代码库和测试工程以及搭建教程文档以及实现添加多工程引用 里面包含了搭建教程文档,附带debug 和release模式,还添加了工程引用实例(Att工程),本人亲测已经成功跑通,简单方便使用和参考学习

    Unity3D教程:引用第三方DLL解析JSON2

    本教程主要讲解如何在Unity3D中引用第三方DLL来解析JSON,这里以JSON.Net库为例进行说明。 首先,JSON.Net是一个功能强大的开源JSON库,支持.NET Framework 2.0、3.5、4.0以及Silverlight、Windows Phone和Windows ...

    引用计数的c++源码实现

    这意味着我们可以直接在Visual Studio环境中打开此解决方案,编译和运行代码,以测试引用计数的实现是否正确。 通过这种方式实现引用计数,可以避免手动管理内存导致的悬挂指针和内存泄漏问题。然而,引用计数也有...

    java8 探讨与分析匿名内部类、lambda表达式、方法引用的底层实现的测试用例

    在Java 8中,匿名内部类、Lambda表达式和方法引用是重要的新特性,它们极大地简化了代码,提升了代码的可读性和效率。下面将详细探讨这三个知识点,并结合提供的测试用例进行分析。 1. **匿名内部类**: 匿名内部类...

    Jni测试引用第三方静态库和动态库demo

    本文将深入探讨如何在JNI中引用第三方的静态库(.a)和动态库(.so),并基于提供的"Jni测试引用第三方静态库和动态库demo"进行分析。 首先,我们需要了解静态库和动态库的区别。静态库是直接链接到目标程序中的,...

    第七章 Spring4 继承、依赖、引用

    在Spring框架中,继承、依赖和引用是核心的IoC...它们允许我们以声明式的方式管理对象,使得代码更加简洁,测试更加容易,同时提高了代码的复用性和灵活性。在学习和使用Spring框架时,深入理解这些概念至关重要。

    可以引用SharpPcap.Packets,不会报错。

    正确引用后,就可以在代码中导入SharpPcap.Packets命名空间,开始编写网络数据包处理的代码了。 总的来说,SharpPcap是一个强大的工具,通过其提供的Packets命名空间,开发者可以方便地处理网络数据包,进行各种...

    004_android 之项目的目录结构分析与资源引用

    `main`是主代码,`androidTest`用于编写单元测试。 - `java`:存放Java或Kotlin源代码。 - `res`:资源文件夹,包含各种类型的资源如布局、图片、字符串等。 - `AndroidManifest.xml`:应用的配置文件,定义权限...

    代码分析工具 understand 5 Linux 64

    此外,Understand 还能进行代码覆盖率分析,协助测试人员了解测试用例对代码的覆盖程度,从而优化测试策略。 在代码审查和重构过程中,Understand 是一把得力的利器。它的搜索功能强大,支持正则表达式,能快速查找...

    VHDL测试代码对FPGA数码管显示功能进行测试

    通过对以上代码的分析,我们可以了解到如何利用VHDL语言实现对FPGA数码管显示功能的基本测试。从库引用到实体定义,再到架构体的编写,每一步都紧密相连,共同构成了完整的测试方案。通过这样的测试代码,可以在设计...

    mathJax 数学公式插件 本地引用

    5. **测试与优化**:加载页面后,检查数学公式是否正确显示。如果遇到问题,可能需要调整MathJax的配置或者检查路径设置。同时,注意优化加载速度,例如通过压缩JavaScript文件和合并CSS/JS资源。 总的来说,...

Global site tag (gtag.js) - Google Analytics