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日

悬赏问题

  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题
  • ¥100 已有python代码,要求做成可执行程序,程序设计内容不多
  • ¥15 目标检测项目无法读取视频
  • ¥15 GEO datasets中基因芯片数据仅仅提供了normalized signal如何进行差异分析
  • ¥100 求采集电商背景音乐的方法
  • ¥15 数学建模竞赛求指导帮助
  • ¥15 STM32控制MAX7219问题求解答