新生代满了会触发 Young GC,老年代满了会触发 Old GC。GC时会回收对象,那么具体是什么样的对象会被垃圾回收器回收呢?

  1. 可达性分析算法,判断是否被 GC Roots 引用
  2. 判断引用类型:强引用、软引用、弱引用、虚引用
  3. 是否调用finialize()方法自救

首先,JVM 会通过可达性分析算法来判断哪些对象会被回收,哪些不会被回收。可达性分析算法会从一个对象触发,一层层向上,分析有谁在引用它,看是否有一个 GC Roots

被 GC Roots 引用的对象就不会被垃圾回收。GC Roots 指的是局部变量,或者类的静态变量。具体可以看这篇文章:什么是被 GC Roots 直接引用的对象?

其次,看引用类型。Java中有强引用、软引用、弱引用和虚引用:

  • 强引用,被强引用的对象不会被回收
  • 软引用,被软引用的对象一般并不会被回收,GC之后内存任然不够会被回收
  • 弱引用,弱引用就像没有被引用,GC时直接回收
  • 虚引用,很少用到需引用,可以忽略

所以总的来说:

  1. 有 GC Roots 的对象不能回收,没有 GC Roots 的对象可以回收
  2. 有 GC Roots 的对象,如果是软引用或者弱引用,也有可能被回收

最后,一个对象没有被 GC Roots 引用,是否立即就会被回收呢?

也不一定立即被回收,该类可以重写finialize()方法,在finialize()中让一个 GC Roots 重新引用这个对象,就能自救。

最新文章

  1. C#
  2. Nodejs 的 Express框架 学习体会 补充中。。。
  3. 给SHP文件定义投影
  4. 使用DateUtils和DateFormatUtils处理时间日期转换与SimpleDateFormat的区别
  5. string.Format之你不知道的事
  6. iOS - OC NSTimer 定时器
  7. winrar 压缩文件方法
  8. 还原没有日志文件的SQL数据库
  9. python学习之subprocess模块
  10. [转]How to: Execute Oracle Stored Procedures Returning RefCursors
  11. Visual Studio Installer打包后生成的安装文件每次执行都需要重新安装C++ 2010运行库(x86)的解决方案
  12. gvim窗口根据gnome-terminal位置定位
  13. 算法导轮之B树的学习
  14. key diff 在input上的踩坑
  15. OSS网页上传和断点续传(终结篇)
  16. Java离线人脸识别SDK 支持arcface 2.0 最新版
  17. js 日期,时间函数 及相关运算大全
  18. std::nothrow
  19. 2、编写/修改权限及执行Shell程序的步骤
  20. 10.31NOIP模拟赛解题报告

热门文章

  1. 为XHR对象所有方法和属性提供钩子 全局拦截AJAX
  2. 手机浏览器自动播放视频video(设置autoplay无效)的解决方案
  3. 用mpvue写个玩意儿玩玩
  4. DOM3中的自定义事件
  5. 关于Js的那些面试题
  6. Azure CLI 简单入门
  7. Spring教程检视阅读
  8. 10. webdriver调用javascript
  9. SQL的分类使用(增删改查)
  10. 简单BBS项目开始(一)