今天在看
blog
的时候学习到了
java reference
方面的知识,这些知识是个人的学习笔记,参考blog为:
http://www.ibm.com/developerworks/cn/java/j-lo-langref/index.html?ca=drs-希望各位能拍砖,让我能了解到更深入的内容以及不足,感激
StrongReference
:
我们知道,当你调用例如
String test =
new String(“test”);
(PS:
这里只是代码实例,千万不要这么写代码,因为这是
s
tupid
的,会浪费内存空间
)
的时候,
test
在这里是
StrongReference
的,是强引用,强引用可以直接访问目标对象,
强引用所指向的对象在任何时候都不会被系统回收,强引用可能导致内存泄漏。所以如果你要设计一个
java
缓存系统,可以考虑少使用强引用,因为这样会让你的程序在无法预知的情况下出现
oom
,而缓存化是可以允许数据丢失,而去持久化层拿数据的。
强引用的特点:
(1)
强引用可以直接访问目标对象。
(2)
强引用所指向的对象在任何时候都不会被系统回收。
(3)
强引用可能导致内存泄漏。
SoftReference
:
SoftReference
所指向的对象,在没有强引用指向的情况下,是可以被
jvm
回收的,
gc
会根据当前的内存使用情况,以及
SoftReference
的
get()
方法的调用情况来决定是否回收,这与
WeakReference
是有很大区别的,下面的代码实例可以看出。
SoftReference
特点:
(1)
软引用使用
get()
方法取得对象的强引用从而访问目标对象。
(2)
软引用所指向的对象按照
JVM
的使用情况(
Heap
内存是否临近阈值)来决定是否回收。
(3)
软引用可以避免
Heap
内存不足所导致的异常。
当垃圾回收器决定对其回收时,会先清空它的
SoftReference
,也就是说
SoftReference
的
get()
方法将会返回
null
,然后再调用对象的
finalize()
方法,并在下一轮
GC
中对其真正进行回收。
WeakReference
:
WeakReference
与
SoftReference
的调用方法基本相同,但是弱与
SoftReference
,
WeakReference
所指向的对象只要进行系统垃圾回收,不管内存使用情况如何,永远对其进行回收(
get()
方法返回
null
)。
WeakReference
特点:
(1)
弱引用使用
get()
方法取得对象的强引用从而访问目标对象。
(2)
一旦系统内存回收,无论内存是否紧张,弱引用指向的对象都会被回收。
(3)
弱引用也可以避免
Heap
内存不足所导致的异常。
Soft&Weak
代码实例:
package com.taobao.reference.test;
import java.lang.ref.PhantomReference;
import java.lang.ref.SoftReference;
import java.lang.ref.WeakReference;
import org.junit.Test;
public class AllReferenceTest {
private static final
SoftReference<TestBean> softTest =
new
SoftReference<TestBean>(new TestBean("soft"));
private static final
WeakReference<TestBean> weakTest =
new
WeakReference<TestBean>(new TestBean("weak"));
/*private
PhantomReference<TestBean> phantomTest =
new
PhantomReference<TestBean>(new TestBean("weak"));*/
@Test
public void
soft_test_method(){
System.gc();
//
这里你会得到你想要的结果
System.out.println(softTest.get().getName());
}
@Test
public void
weak_test_method(){
//System.gc();
//
这里你也会得到你想要的结果,但是将
gc
的注释去掉之后,你会发现
//
返回
null
了,这就是
Weak
和
Soft
的区别。
System.out.println(weakTest.get().getName());
}
static class TestBean{
private String name;
public
TestBean(String name) {
this.name =
name;
}
public String
getName() {
return name;
}
public void
setName(String name) {
this.name =
name;
}
}
}
PhantomReference
:
PhantomReference
当你调用它的
get
方法的时候,你会发现一只为
null
,那么它是干神马用的呢?它其实是用来跟踪对象被垃圾回收的状态,通过查看引用队列中是否包含对象所对应的虚引用来判断它是否即将被垃圾回收,从而采取行动。
代码实例:
public static void main(String[] args) {
ReferenceQueue<String>
refQueue = new ReferenceQueue<String>();
PhantomReference<String>
referent = new PhantomReference<String>(
new String("T"),
refQueue);
System.out.println(referent.get());//
null
System.gc();
System.runFinalization();
System.out.println(refQueue.poll() ==
referent); //true
}
特点:
(1)
虚引用永远无法使用
get()
方法取得对象的强引用从而访问目标对象。
(2)
虚引用所指向的对象在被系统内存回收前,虚引用自身会被放入
ReferenceQueue
对象中从而跟踪对象垃圾回收。
(3)
虚引用不会根据内存情况自动回收目标对象。
注意的地方:
其实
SoftReference, WeakReference
以及
PhantomReference
的构造函数都可以接收一个
ReferenceQueue
对象。当
SoftReference
以及
WeakReference
被清空的同时,也就是
Java
垃圾回收器
准备
对它们所指向的对象进行回收时,调用对象的
finalize()
方法之前,它们自身会被加入到这个
ReferenceQueue
对象中,此时可以通过
ReferenceQueue
的
poll()
方法取到它们。而
PhantomReference
只有当
Java
垃圾回收器对其所指向的对象
真正进行回收
时,会将其加入到这个
ReferenceQueue
对象中,这样就可以追综对象的销毁情况。
分享到:
相关推荐
这本书的学习笔记将帮助读者深入理解ANTLR4的工作原理和实践应用。 ANTLR4的核心功能包括: 1. **语法定义**:ANTLR4允许用户使用EBNF(扩展巴科斯范式)来定义语法规则,这是一种形式化的语法描述语言。这些规则...
### Think in Java 学习笔记知识点总结 #### 第1章:对象导论 - **一切皆为对象**:Java 中的几乎所有事物都是对象,对象通过发送消息的方式进行交互。 - **对象模型**:每个对象都有自己的存储空间,该空间由其他...
在表达式(Java Expressions)和引用(Describe a reference variable)部分,我们学习了如何使用这些基本数据类型和标识符来构建复杂的代码结构,以及如何声明和使用变量。 总结来说,Java Day02的学习涵盖了JRE的...
* 数据类型:Java中的数据类型包括基本类型(primitive type)和引用类型(reference type)。 * 运算符:Java中的运算符包括算术运算符、比较运算符、逻辑运算符、赋值运算符等。 * 控制流语句:Java中的控制流语句...
Annotation [java] 代码注释 [ænәu'teiʃәn] anonymous adj.匿名的[ә'nɒnimәs]'(反义:directly adv.直接地,立即[di'rektli, dai'rektli]) apply v.应用,适用 [ә'plai] application n.应用,应用程序 [,æ...
Java读书笔记.pdf Java读书笔记.pdf是关于Java编程语言的读书...Java读书笔记.pdf涵盖了Java编程语言的基础知识、语法、编程技术和应用场景等多方面的内容,对于Java初学者和开发者来说是一个非常有价值的学习资源。
里面包有如下的一些java资料 Ant使用指南.pdf cvs.pdf Eclipse入门-- Eclipse的使用简介及插件开发.PDF eclipse插件开发.doc Eclipse插件开发系列.pdf Hibernate_3.2.0_Reference_zh_CN.chm Hibernate_DEV_GUIDE.pdf...
### Java学习笔记知识点详解 #### 一、Java 编译与执行流程 - **源代码文件**:`.java` 文件是 Java 源代码文件,包含 Java 语言编写的类和方法。 - **编译器**:使用 `javac` 命令将 `.java` 文件编译成 `.class` ...
Java是一种广泛使用的面向对象编程语言,它的核心特性之一就是面向对象。面向对象编程(OOP)与面向过程编程相比,更注重对象的使用而非过程。在面向对象编程中,一切皆为对象,对象包含了属性(描述对象的状态)和...
【hibernate-学习笔记】 ...以上是对“hibernate-学习笔记”的简要介绍,尚学堂hibernate笔记.doc和Hibernate_3.2.0_Reference_zh_CN.chm两个文档将提供更详细的信息和实例,帮助你深入学习和实践Hibernate。
### 深入理解Java虚拟机(JVM)的关键知识点 #### 一、Java与Java虚拟机的关系 Java语言的设计者们为了...通过学习JVM内部的具体实现细节,可以帮助开发者更好地编写代码,优化程序性能,解决实际运行中遇到的问题。
张龙的Java SE课程笔记详尽地涵盖了这些知识点,对于Java学习者来说,是一份极具价值的学习资源。通过深入学习和实践,你可以扎实掌握Java编程基础,为进一步深入学习Java EE或Android开发打下坚实的基础。
首先,我们来了解一下Java的基本数据类型,它们分为两大类:原始类型(Primitive Types)和引用类型(Reference Types)。在本笔记中主要讨论的是原始类型,包括字符型(char)、整数型(byte, short, int, long)、...
### 《HEAD FIRST JAVA》笔记知识点总结 #### 第一章 进入Java的世界(基本概念) - **Java的工作原理与发展简史**: - Java是一种跨平台、面向对象的编程语言,由Sun Microsystems公司于1995年推出。它的设计...
在Java中,数据类型分为两大类:基本数据类型(Primitive Data Types)和引用数据类型(Reference Data Types)。 基本数据类型是Java语言预定义的,它们包括四种类别: 1. 整数型(Integer Types):byte、short...
**Object-C 学习笔记** Objective-C(简称Obj-C或Objective C)是苹果公司基于C语言开发的一种面向对象编程语言,主要用于iOS和macOS平台的应用程序开发。它在C语言的基础上添加了Smalltalk风格的消息传递机制,...
标题中的"Spring学习笔记之一“why spring”"表明了这篇笔记主要探讨的是Spring框架的核心价值和使用背景。在IT行业中,Spring是一个广泛使用的Java企业级应用开发框架,它以其依赖注入(Dependency Injection,DI)...
2.使用VS.NET中的Add Web Reference菜单选项 23..net Remoting 的工作原理是什么? 答:服务器端向客户端发送一个进程编号,一个程序域编号,以确定对象的位置。 24.在C#中,string str = null 与 string str = ...
《Spring3学习笔记题记》 在IT领域,Spring框架是Java开发中不可或缺的一部分,尤其在企业级应用中,Spring以其强大的功能和灵活性备受青睐。本文将深入探讨Spring3版本的相关知识点,帮助开发者更好地理解和使用这...
【学习笔记C++】 在深入探讨C++编程语言的学习笔记之前,我们首先理解C++的基础概念。C++是一种静态类型的、编译式的、通用的、大小写敏感的、不仅支持过程化编程,也支持面向对象编程的程序设计语言。它是C语言的...