|
|
51CTO旗下网站
|
|
移动端

来自JVM的灵魂拷问:“你是什么垃圾?”

GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。

作者:Isabella来源:码个蛋|2019-08-12 11:14

作者:iMononoke

博客:https://juejin.im/user/5c629a3051882562191755d8

GC是啥?

GC是一种自动的存储管理机制。当一些被占用的内存不再需要时,就应该予以释放。这种存储资源管理,称为垃圾回收。

就和平时你清理桌面,整理东西一样,很多人都见过听过一个理念“断舍离”吧,不会使用到的物品可以捐赠给其他人或者作为可回收物品被回收掉,很多时候我们存着一些物品,但是好几年都没有用到它们,只是想着可能什么时候会用到,这样一直占据着现实的“内存”。

“脏乱差”

“干净~”


还“活着”吗?

在0-1的世界里,所谓“垃圾回收”,就是指收回那些不可能再被任何途径使用的对象所占的内存空间,释放了这些内存可以给需要的对象使用。

那么JVM里是怎么来分的?或者说哪些对象是需要被回收的?

主要是问一句:还“活着”吗?

要回收,先要判断是不是可以回收,就是这个对象还“活着”吗?

主要有两种算法来判断:

  • 引用计数法
  • 可达性分析法。

列个表看看~

引用计数法

最大的问题,是很难解决对象之间互相引用的情况。

一图胜千言。

1 互相引用

这是两个对象互相引用的情况,除此之外,这两个对象再无引用,但因为它们的引用计数不为0,所以引用计数器无法通知GC收集器回收它们。

2 循环引用

这是循环引用的情况,没有外部引用指向它们,但它们的引用计数不为0,就无法进行回收了。

比如一把椅子的靠背坏了,椅子的轮子还是好的,但这轮子不能拆下来挪为他用,所以椅子的靠背和它的轮子是互相引用的,但是除了它们自己,没有外界引用它们了。

这样的情况用“引用计数法”来判断的话,它们还是不用被回收的,但实际它们都没有使用作用了。

所以主流的jvm都不使用引用计数法来管理内存,而是采用下面的可达性分析法,下图是它的基本思路示意图。

  • 可达性分析法

由图可知,object5、object6和object7都没有到GCRoots对象的引用链,它们都会被回收。

按照上面的例子,坏了的椅背和没坏的轮子都属于椅子对象(object5),但是椅子本身不被使用,就没有引用到它们的引用链了。

可以做GC Roots的对象

这个大图是不是挺熟悉?

再归个类~

  • 第一次:对象可达性分析之后,发现没有与GCRoots相连接,此时会被第一次标记并筛选。
  • 第二次:对象没有覆盖finalize()方法,或者finalize()方法已经被虚拟机调用过,此时会被认定为没必要执行。

【编辑推荐】

  1. 详解JVM运行原理及Stack和Heap的实现过程
  2. JVM发生CMS GC的 5 种情况,你知道的肯定不全!
  3. JVM很难?或者你看完这篇文章就够了
  4. 你真的了解JVM?JVM中有哪些内存区域,都有哪些作用?
  5. 想要彻底搞懂JVM虚拟机,看了这篇就够了
【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

这就是5G

这就是5G

5G那些事儿
共15章 | armmay

76人订阅学习

16招轻松掌握PPT技巧

16招轻松掌握PPT技巧

GET职场加薪技能
共16章 | 晒书包

351人订阅学习

20个局域网建设改造案例

20个局域网建设改造案例

网络搭建技巧
共20章 | 捷哥CCIE

730人订阅学习

读 书 +更多

框架设计(第2版)CLR Via C#

作为深受编程人员爱戴和尊敬的编程专家,微软.NET开发团队的顾问,本书作者Jeffrey Richter针对开发各种应用程序(如Web Form、Windows For...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微