-
Browser prev = new Browser(); // 获取页面进行浏览
-
SoftReference sr = new SoftReference(prev); // 浏览完毕后置为软引用
-
if(sr.get()!=null){
-
rev = (Browser) sr.get(); // 还没有被回收器回收,直接获取
-
}else{
-
prev = new Browser(); // 由于内存吃紧,所以对软引用的对象回收了
-
sr = new SoftReference(prev); // 重新构建
-
}
这样就很好的解决了实际的问题。
软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收器回收,Java虚拟机就会把这个软引用加入到与之关联的引用队列中。
3、弱引用(WeakReference)
弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程,因此不一定会很快发现那些只具有弱引用的对象。
[java] view plain copy
-
String str=new String(“abc”);
-
WeakReference abcWeakRef = new WeakReference(str);
-
str=null;
当垃圾回收器进行扫描回收时等价于:
[java] view plain copy
-
str = null;
-
System.gc();
如果这个对象是偶尔的使用,并且希望在使用时随时就能获取到,但又不想影响此对象的垃圾收集,那么你应该用 Weak Reference 来记住此对象。
下面的代码会让str再次变为一个强引用:
[java] view plain copy
- String abc = abcWeakRef.get();
弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
当你想引用一个对象,但是这个对象有自己的生命周期,你不想介入这个对象的生命周期,这时候你就是用弱引用。
这个引用不会在对象的垃圾回收判断中产生任何附加的影响。
[java] view plain copy
-
public class ReferenceTest {
-
private static ReferenceQueue rq = new ReferenceQueue();
-
public static void checkQueue() {
-
Reference<? extends VeryBig> ref = null;
-
while ((ref = rq.poll()) != null) {
-
if (ref != null) {
-
System.out.println("In queue: " + ((VeryBigWeakReference) (ref)).id);
-
}
-
}
-
}
-
public static void main(String args[]) {
-
int size = 3;
-
LinkedList<WeakReference> weakList = new LinkedList<WeakReference>();
-
for (int i = 0; i < size; i++) {
-
weakList.add(new VeryBigWeakReference(new VeryBig("Weak " + i), rq));
-
System.out.println("Just created weak: " + weakList.getLast());
-
}
-
System.gc();
-
try { // 下面休息几分钟,让上面的垃圾回收线程运行完成
-
Thread.currentThread().sleep(6000);
-
} catch (InterruptedException e) {
-
e.printStackTrace();
-
}
-
checkQueue();
-
}
-
}
-
class VeryBig {
-
public String id;
-
// 占用空间,让线程进行回收
-
byte[] b = new byte[2 * 1024];
-
public VeryBig(String id) {
-
this.id = id;
-
}
-
protected void finalize() {
-
System.out.println("Finalizing VeryBig " + id);
-
}
-
}
-
class VeryBigWeakReference extends WeakReference {
-
public String id;
-
public VeryBigWeakReference(VeryBig big, ReferenceQueue rq) {
-
super(big, rq);
-
this.id = big.id;
-
}
-
protected void finalize() {
-
System.out.println("Finalizing VeryBigWeakReference " + id);
-
}
-
}
最后的输出结果为:
[java] view plain copy
-
Just created weak: com.javabase.reference.VeryBigWeakReference@1641c0
-
Just created weak: com.javabase.reference.VeryBigWeakReference@136ab79
-
Just created weak: com.javabase.reference.VeryBigWeakReference@33c1aa
-
Finalizing VeryBig Weak 2
-
Finalizing VeryBig Weak 1
-
Finalizing VeryBig Weak 0
-
In queue: Weak 1
-
In queue: Weak 2
-
In queue: Weak 0
4、虚引用(PhantomReference)
“虚引用”顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
虚引用主要用来跟踪对象被垃圾回收器回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列 (ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之 关联的引用队列中。
5、总结
Java4种引用的级别由高到低依次为:
强引用 > 软引用 > 弱引用 > 虚引用
通过图来看一下他们之间在垃圾回收时的区别:
当垃圾回收器回收时,某些对象会被回收,某些不会被回收。垃圾回收器会从根对象Object来标记存活的对象,然后将某些不可达的对象和一些引用的对象进行回收,如果对这方面不是很了解,可以参考如下的文章:
传送门:Java内存管理 http://blog.csdn.net/mazhimazh/article/category/1907599
通过表格来说明一下,如下:
Docker步步实践
目录文档:
①Docker简介
②基本概念
③安装Docker
④使用镜像:
⑤操作容器:
⑥访问仓库:
⑦数据管理:
⑧使用网络:
⑨高级网络配置:
⑩安全:
⑪底层实现:
⑫其他项目:
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0
KZvUi2-1725661864822)]
⑧使用网络:
[外链图片转存中…(img-sx9LmVWZ-1725661864822)]
⑨高级网络配置:
[外链图片转存中…(img-ZdjUQWlV-1725661864823)]
⑩安全:
[外链图片转存中…(img-TuUDaPDo-1725661864823)]
⑪底层实现:
[外链图片转存中…(img-vAgkYfy3-1725661864824)]
⑫其他项目:
[外链图片转存中…(img-hSn676ud-1725661864824)]
加入社区:https://bbs.csdn.net/forums/4304bb5a486d4c3ab8389e65ecb71ac0