ykcombaty 2022-06-08 15:04 采纳率: 50%
浏览 51
已结题

关于jvm的GC,和循环创建对象

有如下代码:
public class TestOOM{
public static void main(String args[]){
while(true){
Object object = new Object();
}
}
}

这种情况下,jvm的垃圾回收机制会对其中的object进行垃圾回收吗?

如果不会,那我们平时写的代码for循环、while循环不在少数,而且也没有对其中的引用写类似于 object = null的断开实例的代码,那岂不是一个系统运行的越久,堆内存占用的就越大?

如果会,那是什么原理,按照可达性算法(GCRoots)的概念,只有当对象在GCRoots的引用链中不可达时,才会判定为垃圾对象,像是上述代码中的object引用,仍然可达,照理说不会被回收啊?

  • 写回答

3条回答 默认 最新

  • 皮蛋不吃粥 2022-06-08 15:28
    关注

    首先第一点这个不会回收;因为局部变量也属于GC roots。死循环这个栈帧会一直存在了,所以不会回收。
    第二点,一般的方法,for或者while 只要你当前的局部变量没要逃逸,当栈帧结束都会自动回收,也就是局部变量和对象的连接会断开,所以不需要设置null
    第三,如果当前的局部变量逃逸出去,也要看是否一直长时间被使用,长时间使用就会出现内存溢出的问题,这时候就需要设置为null,等待GC的回收。
    有啥不懂可以问我

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 6月17日
  • 已采纳回答 6月9日
  • 创建了问题 6月8日

悬赏问题

  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改