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

有很多博客介绍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个回答

不同的引用类型,主要体现在对象的不同可达性(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

首先吐槽一下,你这个工具类不仅繁琐还浪费内存(是浪费),直接改成静态的就行了。

不知道你在哪里看到的新手教程,这种说法是没错,但哪个新手能理解的到?这篇博客关于引用的介绍看看你能理解吗:https://blog.csdn.net/weimingjue/article/details/87921494

然后你说的没毛病,方法执行完毕如果计数0(就当是计数法吧,java早就不是计数法了)0会将被回收。

问答版主就是牛,从现在起只回论坛,不在踏入问答半步

计数为0的引用是GC可能会回收,不是一定会回收。GC回收主要看可达性分析以及引用所在的分代,不同代的回收策略是不同的。JVM这块我也不是很懂,说的不一定对。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问