模拟面试回答第十七问:垃圾判定算法

垃圾判定算法简介

关于垃圾判定算法,主要有两种:引用计数法和可达性分析法。

引用计数法

引用计数法就是每个内存对象维护一个引用计数器。当有引用指向这块内存时,计数器+1,引用失效时-1,但这个算法有个致命缺陷------循环引用。

比如:创建A和B对象,A的next和B的next互相指向,当方法结束后,A和B对象引用消失后,A和B的内存的计数器都是1,也就是说判定为垃圾,因为A和B的next互相引用,这是堆中的对象,不出现在栈中,栈中只有A和B的对象引用,没有next,所以销毁的是A和B的对象引用,而堆中的next依然存在,指向互相的内存,所以这两块内存随着对象引用的消失而无法访问,又由于next指针而一直存活不被GC。

可达性分析法

可达性分析法就是维护从GCRoots出发的引用链。有一组叫做GCRoots的根对象,从它们出发能到达的对象就是存活对象,现代的JVM都采用这种方法。

GCRoots

接着我介绍一下GCRoots,什么样的对象可以被叫做GCRoots,首先局部变量,静态变量这些都是GCRoots,其次本地方法栈的JNI引用,就是C++语言写的,以及同步锁持有的对象和JVM内部的对象。

相关推荐
有时间要学习3 小时前
面试150——第七周
算法·面试·深度优先
Nontee3 小时前
面试准备(Reids存粹问题版)
java·面试
智算菩萨3 小时前
【Pygame】第16章 游戏存档系统设计与数据持久化实现
jvm·游戏·pygame
川石课堂软件测试4 小时前
涨薪技术|Prometheus使用Recoding Rules优化性能
功能测试·测试工具·jmeter·mysql·面试·单元测试·prometheus
Arthas2174 小时前
互联网大厂Java面试实战:从基础到架构的渐进式考察
java·spring boot·微服务·面试·技术栈
流觞 无依4 小时前
SQLite数据库损坏修复指南——解决“database disk image is malformed”报错
jvm·数据库·sqlite
ShineWinsu4 小时前
对于Linux:进程地址空间(虚拟地址空间)的解析
linux·服务器·面试·笔试·内存·进程·虚拟空间
java1234_小锋4 小时前
Java高频面试题:ElasticSearch如何做性能优化?
java·开发语言·elasticsearch·面试