java什么对象会被回收_哪些情况下的对象会被垃圾回收机制处理掉?

1fd33f6ad9a22f91f6da9d780ad4e4ff.png

前言

看见即降服,这句话说的是一件事物,只要你看得到,你就能得到。

对我来说记录就是看见。

面试题不只是为了面试,更是为了帮助我们更深入地理解我们已知的知识。

分析

对于本文这个问题,我觉得我们得先了解一下JVM的内存模型(这个专业术语的大白话就是JVM在程序运行时所创建的内存区域有哪些),这样我们才清楚我们创建的对象都在哪里;再者我们还需要知道垃圾回收机制会回收哪些内存区域的对象。

jvm的内存区域

先来看下面两张图。

图一:

8fbecd95b61127886f07fac3e3b724fb.png

图二:

aa4359ce505bb658ee4970a4b3369f45.png

从上面两张图大家应该看到了JVM的内存模型,一共五个内存区域。上面的图有点模糊哈,这里有彩色图(文末参考链接中的):

add68718ec493f3f5eb1e039b6f70601.png

所以希望大家支持正版,这样学习的时候不会对知识有模糊认识。

下面简单解释一下五个区域都是放什么东西的(具体解释查看文末参考链接哈):

方法区

存储已被虚拟机加载的类的信息、常量、静态变量、即时编译器编译后的代码等数据。

存放对象实例。

虚拟机栈(或称java虚拟机栈)

线程私有的,用来存放栈帧,而栈帧里面是用来存储局部变量表,操作数栈,动态链接,方法返回地址等信息。

本地方法栈

线程私有,本地方法栈和java虚拟机栈非常类似,他们之间唯一的差别就是java虚拟机栈是为了java程序中的方法也就是字节码的方法服务的,而本地方法栈是给Native方法服务的。

程序计数器

线程私有的,如果线程正在执行一个java方法,那么这个计数器记录的是正在执行的虚拟机字节码指令的地址。如果正在执行的是Native方法(本地方法)那么这个计数器值为空。

小结

好了,我们现在已经知道了我们创建的对象实例都在堆里面。

垃圾回收机制

这个话题可以阅读JVM系列(五) - JVM垃圾回收算法(这篇文章有一处手误,文章下面的讨论已经指出来了,但是作者还没有改正,大家注意一下就行。)

小结

我们现在已经知道了垃圾回收机制的原理和算法,以及回收区域是堆。

哪些情况下的对象会被垃圾回收机制处理掉?

通过上面的分析,有两种情况:

1.根据java的四种对象引用方式,如果符合回收条件就会被垃圾回收机制处理掉。

2.如果对象实例没有被其他任何对象引用的情况下会被垃圾回收机制处理掉。

网上说的还有一个情况是:所有实例都没有活动线程访问。 这个我不是很理解,可能说的是,程序处于不活跃状态的时候,系统又需要内存资源时,垃圾回收机制回把这些实例对象处理掉?(有清楚的大佬可以在评论区指点一下,蟹蟹)。

参考

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值