什么情况下JVM内存中的一个对象会被垃圾回收?
2024-09-04 20:45:35
新生代满了会触发 Young GC,老年代满了会触发 Old GC。GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢?
- 可达性分析算法,判断是否被 GC Roots 引用
- 判断引用类型:强引用、软引用、弱引用、虚引用
- 是否调用
finialize()
方法自救
首先,JVM 会通过可达性分析算法来判断哪些对象会被回收,哪些不会被回收。可达性分析算法会从一个对象触发,一层层向上,分析有谁在引用它,看是否有一个 GC Roots。
被 GC Roots 引用的对象就不会被垃圾回收。GC Roots 指的是局部变量,或者类的静态变量。具体可以看这篇文章:什么是被 GC Roots 直接引用的对象?。
其次,看引用类型。Java中有强引用、软引用、弱引用和虚引用:
- 强引用,被强引用的对象不会被回收
- 软引用,被软引用的对象一般并不会被回收,GC之后内存任然不够会被回收
- 弱引用,弱引用就像没有被引用,GC时直接回收
- 虚引用,很少用到需引用,可以忽略
所以总的来说:
- 有 GC Roots 的对象不能回收,没有 GC Roots 的对象可以回收
- 有 GC Roots 的对象,如果是软引用或者弱引用,也有可能被回收
最后,一个对象没有被 GC Roots 引用,是否立即就会被回收呢?
也不一定立即被回收,该类可以重写finialize()
方法,在finialize()
中让一个 GC Roots 重新引用这个对象,就能自救。
最新文章
- C#
- Nodejs 的 Express框架 学习体会 补充中。。。
- 给SHP文件定义投影
- 使用DateUtils和DateFormatUtils处理时间日期转换与SimpleDateFormat的区别
- string.Format之你不知道的事
- iOS - OC NSTimer		定时器
- winrar 压缩文件方法
- 还原没有日志文件的SQL数据库
- python学习之subprocess模块
- [转]How to: Execute Oracle Stored Procedures Returning RefCursors
- Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案
- gvim窗口根据gnome-terminal位置定位
- 算法导轮之B树的学习
- key diff 在input上的踩坑
- OSS网页上传和断点续传(终结篇)
- Java离线人脸识别SDK 支持arcface 2.0 最新版
- js 日期,时间函数 及相关运算大全
- std::nothrow
- 2、编写/修改权限及执行Shell程序的步骤
- 10.31NOIP模拟赛解题报告