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问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问

相似问题

2
如何解决Android安装JAVA_HOME dose not de point to valid JVM installation
1
jvm内存结构:请问运行main方法时,flag属于方法区,还是java堆,还是虚拟机栈中?
5
Exception in thread "Thread-12" java.lang.RuntimeException: java.lang.NullPointerException
1
Android之所以开发Dalvik虚拟机而不使用JAVA自带的JVM,如果使用JVM就涉及到了版权问题,这是为什么?
1
Tomcat9用eclipse启动完全没问题,但是myeclipse启动不起来,自带Tomcat也启动不起来,求大佬解救
3
安装IDEA后第一次运行提示Failed to load JVM.
3
爲何JPA無法自動生成表?
3
新手提问,十万火急:eclipse中启动服务器报错
2
关于查看运行的java程序已加载类的问题
2
Android Studio崩溃异常Problematic frame: V [jvm.dll+0x44c6d5]
1
在 Heap Space 中 String poll 的 字符串常量,失去引用是如何回收的?
1
jvm需要做哪些准备才开始做内存回收操作?
1
JAVA 给JVM 注册CA证书之后 仍然出现证书不信任问题。
2
java线程拷贝的共享对象副本是放在jvm哪个空间中?
0
IDEA Struts2项目 启动tomcat失败
2
自学MVC做的JAVAEE网站,遇到404求救
2
eclipse启动动态项目run on server,tomcat起不来
1
mysql 5.6 版本的程序跑mysql 8.0 报错如下 ,数据库可以正常连接,连接数据库的驱动等相关jar 也换成了mysql8.0对应版本还是报如下错误
1
Druid连接SqlServer报错,为啥都连接了sqlserver还执行SHOW TABLES?
2
String类型在jvm中的存储