java垃圾回收机制的问题

小小白成长记 2020-01-09 02:53:01
最近在看JVM,想到一个问题,就是 如果我实例化一个对象,该对象引用肯定在栈上,而对象实例化的数据等在堆上,如果我一直不引用该对象,也不让其他对象引用它,调用它,会不会java垃圾回收机制将堆内存数据清理,但我再使用栈上的该对象引用时,在堆上找不到,会不会在该内存空间重新建造数据,还是垃圾回收机制压根没有清理。。。。。。本人尚未触及垃圾回收机制,对垃圾回收机制一知半解,求大神为我解答!!!
...全文
370 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
maradona1984 2020-01-20
  • 打赏
  • 举报
回复
引用 楼主 小小白成长记 的回复:
最近在看JVM,想到一个问题,就是 如果我实例化一个对象,该对象引用肯定在栈上,而对象实例化的数据等在堆上,如果我一直不引用该对象,也不让其他对象引用它,调用它,会不会java垃圾回收机制将堆内存数据清理,但我再使用栈上的该对象引用时,在堆上找不到,会不会在该内存空间重新建造数据,还是垃圾回收机制压根没有清理。。。。。。本人尚未触及垃圾回收机制,对垃圾回收机制一知半解,求大神为我解答!!!
你对引用理解是错误的,如果是局部变量,栈上有那就相当于代码运行还没出作用域,出了作用域栈上的变量会出栈,你也没办法访问出了作用域的变量,所以你说的问题不可能发生
小杨同学~ 2020-01-20
  • 打赏
  • 举报
回复
你说的这个涉及到JVM算法和垃圾回收器的选择,详细的可以看看这里的文章https://blog.csdn.net/weixin_38937840/article/details/103811841
哈希塞特 2020-01-19
  • 打赏
  • 举报
回复
你这个引用所在的帧没有被弹出,就是当前这个方法没有执行完,堆里面这个对象是不可能被回收的
  • 打赏
  • 举报
回复
都说的那么复杂。
一个对象被实例化就存在引用关系,不存在不引用的情况,如果不引用则该对象会变成可回收状态,存在引用必然不会被回收。题主描述的情况是不可能存在的
CS_草祭先生 2020-01-15
  • 打赏
  • 举报
回复
楼主应该了解过GC的新生代、老年代和永久代吧? 其实堆的大小就是新生代+老年代的大小,他们的比列是1:2。 而大部分回收操作,都是在新生代中,新生代的对象通常不需长久存活,具有朝生夕灭的性质。 其实垃圾收回机制很复杂,涉及了很多关键词,但归根结底就是:对象只有一直在被用到的情况下才不会被回收。 所以像你说的那种情况几乎是不成立的。 如果一个对象长时间没有被用到,一定时间后就会被清理掉。 你说的不让它被用到其实并不是你理解的未被用到,比如挂起、堵塞等,这些其实都是被用到了,所以不会被回收。
有心usin 2020-01-13
  • 打赏
  • 举报
回复
触发GC的是有条件的,eden区满了会触发minor gc. 老年区满了或者存活区的超过1/4就会触发full gc 如果gc root链上没有该对象的引用就会被回收
小小白成长记 2020-01-09
  • 打赏
  • 举报
回复
引用 1 楼 qq_41622282 的回复:
GC判断一个对象是否存活常用的有两种办法:引用计数和可达分析。 (1)引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。 (2)可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。 通过第二种方式可以获取到这个对象有没有被引用,有引用就不会被清理。用过了,且后续不会再使用,通过第一种方式,在调用结束后会清理。
确实是这样的,刚刚我看了下垃圾回收机制,但是你答的并不准确,可以说很模糊,因为当我实例化一个新的对象时,GC会查看我的对象,一般只会处理这样象 1、显示地将某个引用赋值为null或者将已经指向某个对象的引用指向新的对象。   2、局部引用所指向的对象。   3、弱引用(weakReference)。 然后我所创建的对象如果是一个自定义的类,那保存在堆上的基本类型等数据,GC将不再清理。除非出现上述的三种情况,才会被GC自动清楚,不知道我说的对不对,有没有大神前来解答呀
胖到没有朋友 2020-01-09
  • 打赏
  • 举报
回复
GC判断一个对象是否存活常用的有两种办法:引用计数和可达分析。 (1)引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。 (2)可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的。不可达对象。 通过第二种方式可以获取到这个对象有没有被引用,有引用就不会被清理。用过了,且后续不会再使用,通过第一种方式,在调用结束后会清理。

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧