「已注销」 2019-12-22 23:42 采纳率: 81.3%
浏览 265
已采纳

java jvm 引用类型:强引用,软引用,弱引用区别?

有很多博客介绍Object obj=new Object();就是一个强引用;
垃圾回收器不会回收它?那么这个Object具体指的时什么啊?

举例:
//时间工具类
public clss DateUtils(){

//这里我不加static,在下面通过new的方式获取
public String getDate(){
DateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS");
return sdf.format(new Date());
}
}

//ID获取工具类
public class IdWorker(){

//获取ID
public String getId(){
DateUtils date=new DateUtils();
return date.getDate();
}
}

以上:getId方法中:DateUtils date=new DateUtils() 这个是强引用吗?
如果是:因为这个在方法的内部,引用保存在栈中,引用内容保存在堆中,这个方法
执行完毕之后,引用计数会为0,那么这个对象就会被回收啊?
如果不是:强引用是什么样子的啊?

软引用跟弱引用在这两个类中怎么体现啊?

有知道的大神指点一下,谢谢

  • 写回答

3条回答 默认 最新

  • threenewbee 2019-12-22 23:43
    关注

    不同的引用类型,主要体现在对象的不同可达性(reachable)状态和对垃圾收集的影响。
    1.强引用是我们最常见的普通对象引用,只要还有强引用指向一个对象,就表明对象还"活着",垃圾收集器不会碰这个对象。对于一个普通的对象,如果没有其他的引用关系,只要超过了引用的作用域或者显示的将其强引用赋值为null,就是可以被垃圾收集的,其具体回收的时机还要看垃圾收集策略。
    2.软引用是一种相对强引用弱化一些的引用,可以让对象豁免一些垃圾收集,只有当jvm认为内存不足时,才会去试图回收软引用指向的对象。jvm会确保在抛出OutOfMemoryError之前,清理软引用指向的对象。软引用通常用来实现内存敏感的缓存,如果还有空闲内存,就可以暂时保留缓存,当内存不足时清理掉,这样就保证了使用缓存的同时,不会耗尽内存
    3.弱引用并不能使对象豁免垃圾收集,仅仅是提供一种对象在弱引用状态下的访问途径。可以用来构建一种没有特定约束的关系,比如,维护一种非强制性的映射关系,如果试图获取对象时,对象还在,就使用它,否则从新实例化。它同样是很多缓存实现的选择。
    4.幻象引用,有时候也翻译成虚引用,不能通过它访问对象。幻象引用仅仅是提供了一种确保对象在被finalize以后,做某些事情的机制。比如,通常用来做所谓的Post-Mortem清理机制,java平台自身Cleaner机制等,也有人利用幻象引用监控对象的创建和销毁。

    https://segmentfault.com/a/1190000015282652
    https://www.cnblogs.com/blueskyli/p/9155106.html

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?
  • ¥15 错误 LNK2001 无法解析的外部符号