扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
以下例程11-16的MapCache类的main()方法创建了一个WeakHashMap对象,它存放了一组Key对象的弱引用,此外main()方法还创建了一个数组对象,它存放了部分Key对象的强引用。
例程11-16 MapCache.java
import java.util.*;
import java.lang.ref.*;
class Key {
String id;
public Key(String id) { this.id = id; }
public String toString() { return id; }
public int hashCode() {
return id.hashCode();
}
public boolean equals(Object r) {
return (r instanceof Key)
&& id.equals(((Key)r).id);
}
public void finalize() {
System.out.println("Finalizing Key "+ id);
}
}
class Value {
String id;
public Value(String id) { this.id = id; }
public String toString() { return id; }
public void finalize() {
System.out.println("Finalizing Value "+id);
}
}
public class MapCache {
public static void main(String[] args) throws Exception{
int size = 1000;
// 或者从命令行获得size的大小
if(args.length > 0)size = Integer.parseInt(args[0]);
Key[] keys = new Key[size]; //存放键对象的强引用
WeakHashMap<Key,Value> whm = new WeakHashMap<Key,Value>();
for(int i = 0; i < size; i++) {
Key k = new Key(Integer.toString(i));
Value v = new Value(Integer.toString(i));
if(i % 3 == 0) keys[i] = k; //使Key对象持有强引用
whm.put(k, v); //使Key对象持有弱引用
}
//催促垃圾回收器工作
System.gc();
//把CPU让给垃圾回收器线程
Thread.sleep(8000);
}
}
以上程序的部分打印结果如下:
Finalizing Key 998
Finalizing Key 997
Finalizing Key 995
Finalizing Key 994
Finalizing Key 992
Finalizing Key 991
Finalizing Key 989
Finalizing Key 988
Finalizing Key 986
Finalizing Key 985
Finalizing Key 983
从打印结果可以看出,当执行System.gc()方法后,垃圾回收器只会回收那些仅仅持有弱引用的Key对象。id可以被3整数的Key对象持有强引用,因此不会被回收。
查看本文来源如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者