什么情况下JVM内存中的一个对象会被垃圾回收?


prtyaa
prtyaa 2023-12-28 15:38:10 53735 赞同 0 反对 0
分类: 资源
1、什么时候会触发垃圾回收? 创建的对象都是优先分配在新生代里的。 如果新生代里的对象越来越多,都快满了,此时就会触发垃圾回收,把新生代没有人引用的对象给回收掉,释放内存空间

2、被哪些变量引用的对象是不能回收的?

首先第一个问题,一旦新生代快满了,那么垃圾回收的时候,到底哪些对象是能回收的,哪些对象是不能回收的呢?

这个问题非常好解释,JVM中使用了一种可达性分析算法来判定哪些对象是可以被回收的,哪些对象是不可以被回收的。

这个算法的意思,就是说对每个对象,都分析一下有谁在引用他,然后一层一层往上去判断,看是否有一个GC Roots。

假设现在上图中“ReplicaManager”对象被局部变量给引用了,那么此时一旦新生代快满了,发生垃圾回收,会去分析这个 “ReplicaManager”对象的可达性。

这时,发现他是不能被回收的,因为他被人引用了,而且是被局部变量“replicaManager”引用的。

按照上图思考一下,此时垃圾回收的时候一分析,发现这个“ReplicaManager”对象被Kafka类的一个静态变量 “replicaManager”给引用了。


3、Java中对象不同的引用类型

1、强引用

这个就是最普通的代码,一个变量引用一个对象,只要是强引用的类型,那么垃圾回收的时候绝对不会去回收这个对象的。

2、软引用

就是把“ReplicaManager”实例对象用一个“SoftReference”软引用类型的对象给包裹起来了,此时这个“replicaManager”变量对“ReplicaManager”对象的引用就是软引用了。

正常情况下垃圾回收是不会回收软引用对象的,但是如果你进行垃圾回收之后,发现内存空间还是不够存放新的对象,内存都快溢出了,此时就会把这些软引用对象给回收掉,哪怕他被变量引用了,但是因为他是软引用,所以还是要回收。

3、弱引用

这个其实非常好解释,你这个弱引用就跟没引用是类似的,如果发生垃圾回收,就会把这个对象回收掉。

其实这里比较常用的,就是强引用和软引用,
强引用就是代表绝对不能回收的对象,软引用就是说有的对象可有可无,如果内存实在不 够了,可以回收他。 

4、finalize()方法的作用

有GC Roots引用的对象不能回收,没有GC Roots引用的对象可以回收,如果有GC Roots引用,但是如果是软引用或者弱引用的,也 有可能被回收掉。

此时会先尝试调用一下他的finalize()方法,看是否把自己这个实例对象给了某个GC Roots变量,比如说代码中就给了ReplicaManager 类的静态变量。

如果重新让某个GC Roots变量引用了自己,那么就不用被垃圾回收了。

不过说实话,这个东西没必要过多解读,因为其实平时很少用,就是给大家梳理出来这些细节,让大家清楚而已。

如果您发现该资源为电子书等存在侵权的资源或对该资源描述不正确等,可点击“私信”按钮向作者进行反馈;如作者无回复可进行平台仲裁,我们会在第一时间进行处理!

评价 0 条
prtyaaL2
粉丝 1 资源 1949 + 关注 私信
最近热门资源
银河麒麟桌面操作系统备份用户数据  121
统信桌面专业版【全盘安装UOS系统】介绍  113
银河麒麟桌面操作系统安装佳能打印机驱动方法  107
银河麒麟桌面操作系统 V10-SP1用户密码修改  100
最近下载排行榜
银河麒麟桌面操作系统备份用户数据 0
统信桌面专业版【全盘安装UOS系统】介绍 0
银河麒麟桌面操作系统安装佳能打印机驱动方法 0
银河麒麟桌面操作系统 V10-SP1用户密码修改 0
作者收入月榜
1

prtyaa 收益393.62元

2

zlj141319 收益217.55元

3

1843880570 收益214.2元

4

IT-feng 收益208.98元

5

风晓 收益208.24元

6

777 收益172.71元

7

Fhawking 收益106.6元

8

信创来了 收益105.84元

9

克里斯蒂亚诺诺 收益91.08元

10

技术-小陈 收益79.5元

请使用微信扫码

加入交流群

请使用微信扫一扫!