softreference 看到篇帖子,国外一个技术面试官
发布时间:2023-06-27 17:50:13 分类:资讯 浏览:2233
看到篇帖子, 国外一个技术面试官在面试senior java developer的时候, 问到一个Weak reference相关的问题. 他没有期望有人能够完整解释清楚weak reference是什么, 怎么用, 只是期望有人能够提到这个concept和java的GC相关. 很可惜的是, 20多个拥有5年以上java开发经验的面试者中, 只有两人知道weak reference的存在, 而其中只有一人实际用到过他. 无疑, 在interviewer眼中, 对于weak reference的理解和应用在面试中给了这一个interviewee相当多的加分. 所以, 将我对于这个技术的理解和使用总结在这篇博客里, 希望读者和自己通过读和写这篇帖子, 能够在以后的工作和面试中获得加分.
在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 2)GC被运行.
在现实情况写代码的时候, 我们往往通过把所有指向某个对象的referece置空来保证这个对象在下次GC运行的时候被回收 (可以用java -verbose:gc来观察gc的行为)
Object c=new Car();
c=null;
但是, 手动置空对象对于程序员来说, 是一件繁琐且违背自动回收的理念的. 对于简单的情况, 手动置空是不需要程序员来做的, 因为在java中, 对于简单对象, 当调用它的方法执行完毕后, 指向它的引用会被从stack中popup, 所以他就能在下一次GC执行时被回收了.
但是, 也有特殊例外. 当使用cache的时候, 由于cache的对象正是程序运行需要的, 那么只要程序正在运行, cache中的引用就不会被GC给(或者说, cache中的reference拥有了和主程序一样的life cycle). 那么随着cache中的reference越来越多, GC无法回收的object也越来越多, 无法被自动回收. 当这些object需要被回收时, 回收这些object的任务只有交给程序编写者了. 然而这却违背了GC的本质(自动回收可以回收的objects).
所以, java中引入了weak reference. 相对于前面举例中的strong reference:
Object c=new Car(); //只要c还指向car object, car object就不会被回收
当一个对象仅仅被weak reference指向, 而没有任何其他strong reference指向的时候, 如果GC运行, 那么这个对象就会被回收. weak reference的语法是:
WeakReference
当要获得weak reference引用的object时, 首先需要判断它是否已经被回收:
weakCar.get();
如果此方法为空, 那么说明weakCar指向的对象已经被回收了.
下面来看一个例子:
package weakreference;
public class Car {
private double price;
private String colour;
public Car(double price, String colour){
this.price=price;
this.colour=colour;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price=price;
}
public String getColour() {
return colour;
}
public void setColour(String colour) {
this.colour=colour;
}
public String toString(){
return colour +"car costs $"+price;
}
}
package weakreference;
import java.lang.ref.WeakReference;
public class TestWeakReference {
public static void main(String[] args) {
Car car=new Car(22000,"silver");
WeakReference
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;
}
}
}
}
在上例中, 程序运行一段时间后, 程序打印出"Object has been collected." 说明, weak reference指向的对象的被回收了.
值得注意的一点 , 即使有 car 引用指向对象, 且 car 是一个strong reference, weak reference weakCar指向的对象仍然被回收了. 这是因为java的编译器在发现进入while循环之后, car 已经没有被使用了, 所以进行了优化(将其置空?). 当把TestWeakReference.java修改为:
package weakreference;
import java.lang.ref.WeakReference;
public class TestWeakReference {
public static void main(String[] args) {
Car car=new Car(22000,"silver");
WeakReference
int i=0;
while(true){
System.out.println("here is the strong reference 'car' "+car);
if(weakCar.get()!=null){
i++;
System.out.println("Object is alive for "+i+" loops - "+weakCar);
}else{
System.out.println("Object has been collected.");
break;
}
}
}
}
weak reference指向的object就不会被回收了. 因为还有一个strong reference car 指向它.
* WeakReference的一个特点是它何时被回收是不可确定的, 因为这是由GC运行的不确定性所确定的. 所以, 一般用weak reference引用的对象是有价值被cache, 而且很容易被重新被构建, 且很消耗内存的对象.
ReferenceQueue
在weak reference指向的对象被回收后, weak reference本身其实也就没有用了. java提供了一个ReferenceQueue来保存这些所指向的对象已经被回收的reference. 用法是在定义WeakReference的时候将一个ReferenceQueue的对象作为参数传入构造函数.
其他类型的references
-SoftReference
soft reference和weak reference一样, 但被GC回收的时候需要多一个条件: 当系统内存不足时(GC是如何判定系统内存不足? 是否有参数可以配置这个threshold?), soft reference指向的object才会被回收. 正因为有这个特性, soft reference比weak reference更加适合做cache objects的reference. 因为它可以尽可能的retain cached objects, 减少重建他们所需的时间和消耗.
以上所述是小编给大家介绍的Java弱引用(WeakReference)的理解与使用详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
您可能感兴趣的文章:Java中几个Reference常见的作用详解java中的Reference类型用法说明Java 中 Reference用法详解详解java中Reference的实现与相应的执行过程java编程Reference核心原理示例源码分析
相关推荐
- baby婚礼 解答:1、相信最近几天网友
- bangbangbang音译歌词 bangbangban
- ppt打不开 我们知道PowerPoint也
- iapfree源 WePhone是北京曳尾科技
- 惠州导航 车载信息娱乐系统、北斗GPSG
- 写给自己的说说 因为一个转身的距离
- 心悦俱乐部下载 9158下载6
- 十里红妆.女儿梦 1、待我长发及腰,2、少年娶我
- 互文 互文怎么解释给学生例如:“将军
- 分式方程无解 1、当分式方程中使分母为零的根
- 桂花糖的做法 橘红色的是丹桂、金色的是金桂、
- 浪漫爱情文章 爱就是亘古长明的灯塔,它定晴望
- 悦康药业股票是什么板块 碳酸锂(电池级)
- 安徽大学生创业贷款 为支持大学生创业,国家和各级政
- 北京擦玻璃 装潢后开荒保洁是其他各种保洁工
- 油漆名牌 一般而言,油漆就是能够涂覆在被
- 张绍刚刘莉莉 1、张绍刚说那句他对她失去兴趣
- 楼体照明 楼体照明方式有:1,泛光照明2
- 牙买加协定 很多人会对牙买加协议感到陌生,
- 新课程培训总结 第一篇:新课程培训心得体会新课
- 淮南师范学院音乐系 淮南师范学院音乐系成立于200
- 佟大为主演的电视剧 一、佟大为个人资料:佟大为(1
- 卫生间隔墙 卫生间隔断隔出来一个区域供我们
- 复合烤漆门 对于实木复合烤漆门,从木门市场
- 甄珠全文阅读 1、书已发,查收下。2、若满意
- 暇步士狗 暇步士狗的品种昰巴吉度猎犬,巴
- maybachlandaulet 1、迈巴赫Landaulet是
- 摩尔庄园河童有什么用 1、摩尔的河童手游有什么作用?
- 愿做深山木 1、做深山老林的源头在哪里?我
- 如何学好初中数学 定理等进行推理或运算
- 比亚迪g3发动机 1、比亚迪g3用过两款发动机,
- 猎鱼高手 昨天特意的去玩了猎鱼高手,感觉
- 御龙在天神弓什么秘籍 加物理攻击技能
- 幻想金庸群侠传秘籍 子诚InTeamI
- 最新推荐
-
- 布袋密码文具盒图片 既环保又美观
- 忍者学院秘籍 让大家一起体验
- 小咖秀怎么回复别人 深受众多小伙伴的喜爱
- 天策碑铭秘籍 在新版本的后台
- 怎么买蒙古股票 可先卖出手中持股
- 幻痛主线9 所以他们到处跑
- 小米手机怎么防盗 别人想卸载也卸载不了
- 幼儿园宝宝愿望怎么写 每年我都想旺气十足
- 总会计师素质要求 定期检查财务工作
- 山东中瑞会计师事务所 埃利奥特·恩戈克会计师
- 怎么开心工作 千万不要太紧张劳累
- 恒大股票的名称叫什么 真真正正的企业营销总
- 密室逃脱美妆学院秘籍 pstrong1
- 怎么给苹果6镀美图 选择一张照片点击进入
- 左右互搏术秘籍 刚开始悟性低
- 崩坏3第四章主线结局 为了方便大家通关
- 怎么用小雨伞恢复系统 1的固件即可
- 张惠萍舞蹈 pstrong3
- 恒扬科技怎么样 我玩不来吃鸡
- 快乐桑巴 呼唤异世流光
- 怎么看舞蹈动作的拍子 按一定的顺序重复出现)
- 怎么购买香港的股票 你个人身份证就可以了
- 怎么设置手机网络名称是什么原因 1.手机SIM卡的问题
- 工作经验日语怎么说 その中の一年间には日本向けのプロジェクトを开発し
- 恒邦保险股票有多少 或者先抛出三分之二
- 怎么看股票里散户多少 发达地区标准会高一些
- 彩虹六号国服涨价时间 围攻的原版好
- 怎么做数量关系题 最后想说的是
- 小智解说S5国服第一争 我觉得她很难生气
- 惠普1020驱动下载 h50176
- 常见股票估值方法是什么 市盈率=股价/每股收益
- 怎么把网页保存为图片 右键点击网页
- 恢复魔方的软件 wenwen
- 恒立液压股票怎么样 成长质量评级投资建议
- 形容男人穿衣服好看 描写古代男子外貌
- 如何配置wi 但为了安全起见
- 想学维族舞蹈男士 pstrong3
- 帝国覆灭战秘籍 pstrong2
- 小伞舞蹈视频大全 右掌指向地面
- 怎么看哪个是创业板股票 落实到上市规则之中
- 想学习会计师 不建议花时间在大题上
- 平安京 各式各样的小学生
- 怎么备份s4的通讯录 请点击备份(或恢复)
- 强馨门窗质量怎么样 优质的铝合金门窗
- 怎么辞职才能索要赔偿 多找找自己的不足
- 天津塘沽得力办公文具 我们先来看看榜单
- 惠州威健厂环境怎么样 惠州盛利电子厂好
- 怎么用键盘控制桌面 完成上述设置后
- 惠普probook n卡的画面会更流畅
- 崩坏3主线关卡解析 主要针对材料掉落率
- 最新TAG