Weak references & Soft references 柔光的暖阳◎ 2022-06-13 12:21 142阅读 0赞 看ThreadLocal源码的时候,产了一个疑问。 看来有问题,还是应该找英文原版啊, 中文博客文章害死人啊,也许是之前看博客看书没有读的仔细的原因。 一直以为弱引用就是在GC的时候就会立刻回收掉的,软引用是内存不够用的时候,GC才会去回收的。 但这里有一个前提:是没有任何强引用对象的时候才会去做的。 如下文:If there are no strong references to the widget. ## Weak references ## > A weak reference, simply put, is a reference that isn’t strong enough to force an object to remain in memory. Weak references allow you to leverage the garbage collector’s ability to determine reachability for you, so you don’t have to do it yourself. You create a weak reference like this: > > WeakReference weakWidget = new WeakReference(widget); > and then elsewhere in the code you can use weakWidget.get() to get the actual Widget object. Of course the weak reference isn’t strong enough to prevent garbage collection, so you may find (if there are no strong references to the widget) that weakWidget.get() suddenly starts returning null. ## Soft references ## > A soft reference is exactly like a weak reference, except that it is less eager to throw away the object to which it refers. An object which is only weakly reachable (the strongest references to it are WeakReferences) will be discarded at the next garbage collection cycle, but an object which is softly reachable will generally stick around for a while. > > SoftReferences aren’t required to behave any differently than WeakReferences, but in practice softly reachable objects are generally retained as long as memory is in plentiful supply. This makes them an excellent foundation for a cache, such as the image cache described above, since you can let the garbage collector worry about both how reachable the objects are (a strongly reachable object will never be removed from the cache) and how badly it needs the memory they are consuming. And Peter Kessler added in a comment: > The Sun JRE does treat SoftReferences differently from WeakReferences. We attempt to hold on to object referenced by a SoftReference if there isn’t pressure on the available memory. One detail: the policy for the “-client” and “-server” JRE’s are different: the -client JRE tries to keep your footprint small by preferring to clear SoftReferences rather than expand the heap, whereas the -server JRE tries to keep your performance high by preferring to expand the heap (if possible) rather than clear SoftReferences. One size does not fit all. ## 一个小例子 ```java package arthur.dy.lee.test; import java.lang.ref.WeakReference; /** * Created by Administrator on 2017/7/6. */ public class TestWeakReference { public static void main(String[] args) { Car car = new Car(22000, "silver"); WeakReference<Car> weakCar = new WeakReference<Car>(car); int i = 0; while (true) { if (weakCar.get() != null) { i++; System.out.println("Object is alive for " + i + " loops - " + weakCar); } else { System.out.println("Object has been collected."); break; } } //car.doSomething(); } } class Car { int price; String name; public Car() { } public Car(int price, String name) { this.price = price; this.name = name; } public void doSomething(){ } } 这个例子网上抄过来的,如果没有下面的car.doSomething(); 那么会打印 > …….. > Object is alive for 91107 loops - java.lang.ref.WeakReference@e9e54c2 > Object is alive for 91108 loops - java.lang.ref.WeakReference@e9e54c2 > Object is alive for 91109 loops - java.lang.ref.WeakReference@e9e54c2 > Object is alive for 91110 loops - java.lang.ref.WeakReference@e9e54c2 > Object is alive for 91111 loops - java.lang.ref.WeakReference@e9e54c2 > Object has been collected. 如果加上car.doSomething();那么在while循环的时候,car一直是强引用,不会被GC,那么weakCar.get() 永远都不会为 null,即:System.out.println(“Object has been collected.”);永远都不会被执行。 参考: [https://stackoverflow.com/questions/299659/what-is-the-difference-between-a-soft-reference-and-a-weak-reference-in-java][https_stackoverflow.com_questions_299659_what-is-the-difference-between-a-soft-reference-and-a-weak-reference-in-java] [https_stackoverflow.com_questions_299659_what-is-the-difference-between-a-soft-reference-and-a-weak-reference-in-java]: https://stackoverflow.com/questions/299659/what-is-the-difference-between-a-soft-reference-and-a-weak-reference-in-java
相关 HTTP Referer 什么是HTTP Referer HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过 绝地灬酷狼/ 2022年09月30日 00:36/ 0 赞/ 23 阅读
相关 Reference C++中 的引用在涉及到初始化和参数传递时,也必须满足了类似C中指针参数传递时的要求: 右侧具备的限定符,都必须在左侧出现。 所以,下面的代码都是存在 你的名字/ 2022年09月18日 10:47/ 0 赞/ 113 阅读
相关 Weak references & Soft references 看ThreadLocal源码的时候,产了一个疑问。 看来有问题,还是应该找英文原版啊, 中文博客文章害死人啊,也许是之前看博客看书没有读的仔细的原因。 一直以为弱引用就 柔光的暖阳◎/ 2022年06月13日 12:21/ 0 赞/ 143 阅读
相关 Storyboard References Storyboard References 允许你从 segue 中引用其他 storyboard 中的 viewController。这意味中你可以保持不同功能模块化 浅浅的花香味﹌/ 2022年06月05日 09:37/ 0 赞/ 155 阅读
相关 Dockerfile reference Docker can build images automatically by reading the instructions from a `Dockerfile`. A 谁践踏了优雅/ 2022年01月31日 06:31/ 0 赞/ 169 阅读
相关 Python - References 01 - Python文档 Python:[https://www.python.org/][https_www.python.org] Documentat Love The Way You Lie/ 2022年01月08日 02:23/ 0 赞/ 153 阅读
相关 textbook references \ math 1. Teubner-Taschenbuch der Mathematik ![1587951-20190228224249679-1316853576.jp 朱雀/ 2021年12月24日 15:45/ 0 赞/ 182 阅读
相关 http header referer和referer policy Referer 是 HTTP 请求header 的一部分,当浏览器(或者模拟浏览器行为)向web 服务器发送请求的时候,头信息里有包含 Referer 。比如我在ww 拼搏现实的明天。/ 2021年12月12日 13:23/ 0 赞/ 716 阅读
相关 Kaggle Reference [机器学习课程][Link 1]: https://sweetpotato.xyz/static/ai/jqxx/day01/section1.html 如何在 Kaggle 迈不过友情╰/ 2021年11月02日 04:44/ 0 赞/ 179 阅读
还没有评论,来说两句吧...