Java编程语言:java中四种引用!欢迎补充

综合编程 2018-05-22 阅读原文

Java内存管理包括内存分配和内存回收。

内存分配:程序员通过new对象,JVM会自动为该对象分配内存。

内存回收:Java在JVM虚拟机上增加了垃圾回收(Garbage Collection)机制,用以在合适的时间触发垃圾回收,将不需要的内存空间回收释放,避免无限制的内存增长导致的OOM.

其实GC时主要看这个对象是否有引用指向该对象。按照这种引用的强弱的关系, 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用、弱引用和虚引用。

四种引用

强引用(StrongReference)

是指创建一个对象并把这个对象赋给一个引用变量。比如 Object tv = new Object();

强引用有引用变量指向时永远不会被垃圾回收,JVM宁愿抛出OutOfMemory错误也不会回收这种对象。小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

如果程序确实不在用到某个强引用变量,通常可以手动将这个引用指向赋值为null。比如常见的集合中 claer() 方法。下面这段代码就是 ArrayList 的 clear()

/** * Removes all of the elements from this list. The list will * be empty after this call returns. */ public void clear() { modCount++; // clear to let GC do its work for (int i = 0; i < size; i++) elementData[i] = null; size = 0; }

2.软引用(SoftReference)

SoftReference softRef = new SoftReference(T t);softRef.get()

3.弱引用(WeakReference)

WeakReference weakRef = new WeakReference(T t);weakRef.get()

4.虚引用(PhantomReferece)

顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。

任何时候都可以被GC回收,引用是最弱的。

ReferenceQueue queue = new ReferenceQueue ();

PhantomReference pr = new PhantomReference (object, queue);小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

由于引用关系最弱,并且源码中的get方法直接返回null,所以必须配合ReferenceQueue使用

public T get() { return null; }

Q:Android中为什么不推荐使用软引用(SoftReference)?

Avoid Soft References for Caching

In practice, soft references are inefficient for caching. The runtime doesn't have enough information on which references to clear and which to keep. Most fatally, it doesn't know what to do when given the choice between clearing a soft reference and growing the heap.

在实践中,软引用(soft references)在缓存中是低效的,因为runtime并没有足够的信息来判别应该清除或者保留哪个 SoftReference(持有的对象),更无法判定当 App 要求更多内存的时候,是应该清除 SoftReference,还是增大 App 的Heap。

The lack of information on the value to your application of each reference limits the usefulness of soft references. References that are cleared too early cause unnecessary work; those that are cleared too late waste memory.

你的程序的引用的信息的缺失导致软引用用处的局限性。过早清除的引用会导致无用功,太晚清除又会浪费内存。小编推荐一个学JAVA的学习裙【 一三三,九三零,六九三】,无论你是大牛还是小白,是想转行还是想入行都可以来了解一起进步一起学习!裙内有开发工具,很多干货和技术资料分享!

Most applications should use an android.util.LruCache instead of soft references. LruCache has an effective eviction policy and lets the user tune how much memory is allotted.

大多数程序应该使用android.util.LruCache来替代软引用,LruCache有着更高效的回收策略,并让用户协调要分配多少内存。

Q:如果一个对象同时有强引用和弱引用与之关联,那GC的时候会回收吗?

伪代码T t = new T(); WeakReference tRef = new WeakReference(t);

很显然GC的时候这个t不仅有弱引用还有强引用关联,此时是不会回收的。

Q: 既然虚引用形同虚设,那么它有什么作用?

网上找这样的描述:

Use Cases

There’re two common use-cases they are used for.

The first technique is to determine when an object was removed from the memory which helps to schedule memory-sensitive tasks. For example, we can wait for a large object to be removed before loading another one.

The second practice is to avoid using the finalize method and improve the finalization process.

第一个就是能够知道这个对象回收时机,能在对象被GC时收到系统通知

第二个就是避免使用 finalize

由于目前没有真正用过虚引用,欢迎补充,多谢~~

简书

责编内容by:简书阅读原文】。感谢您的支持!

您可能感兴趣的

二叉查找树 – 删除节点 详解(Java实现)... 在浏览 二叉查找树(三)之 Java的实现 时,发现所有操作都很容易理解,只有 删除 看的很糊涂。原文作者在方法上也没有任何注释,因此理解起来很不容易。因此本文是在这篇的基础上,对 删除 操作进行详细的讲解,所以如果你对二叉查找树还...
Conversion of Milliseconds to UTC Time in Java I'm trying to convert a millisecond time (milliseconds since Jan 1 1970) to a time in UTC in Java. I've seen a lot of...
Pixel Count in Java Ok, after battling for the entire afternoon, I cant seem to get the right answer. Basically, I have a very simple setup ...
Java 渲染 docx 文件,并生成 pdf 加水印 最近做了一个比较有意思的需求,实现的比较有意思。 需求: 用户上传一个 docx 文件,文档中有占位符若干,识别为文档模板。 用户在前端可以将标签拖拽到模板上,替代占位符。 后端根据标签,获取标签内容...
In defense of `id` Something you can’t see about my dotSwift talk on OOP in FP in Swift is that to make the conference more interesting...