详解JVM内存管理与垃圾回收机制2

  • 时间:
  • 浏览:0
  • 来源:5分11选5_5分3D

但总要有些场景,GC的最大暂停时间没那末 重要,比如,离线分析、视频网站等等。有些,知道你有些GC算法有原来的形态学 ,统统它适合你有些场景,对线程员来说非常有价值,这统统 我们我们都学习GC最重要的意义。接下来,我们我们都将一步步走进GC的世界。

有些,首次被标记的对象并总要被回收,它还有自救的愿因。一个多对象真正的死亡要花费能够 经历两次标记过程:

从图中还可以 看出,经过可达性分析后,有不少对象那末 在GC Roots的引用链条上,其中还暗暗含些相互引用的对象,哪几种对象在不久以后总要被垃圾分派器回收,有些,可达性分析算法还可以 有效处置引用计数法位于的致命间题报告 。

从诞生之初,我们我们都就在思考GC能够 完成的3件事情:何为垃圾?多会儿回收?如何回收?垃圾分派器在对内存进行回收前,第一件事统统 要选着哪几种对象之中哪几种还”活着“,哪几种愿因”死去“,而哪几种”死去“的对象,也统统 我们我们都所说的垃圾。

图1 引用计数示意图

判断对象是与非 存活,其中并能够 办法是给对象加在一个多引用计数器,每当一个多多地方引用它,计数器的值就加1,当引用失效时,计数器的值减1,任一时刻,愿因对象的计数器值为0,那末 你有些对象就不不再被使用,你有些办法被称为引用计数法。在整个回收过程中,引用计数器的值会以极快的下行数率 更新,因而计数值的更新任务变得繁重,有些能够 给计数器预留足够大的内存空间,以确保它不不溢出。有些,引用计数法的算法很简单,但在实际运用中要考虑非常多的因素,统统它的实现往往比较比较复杂,更为重要的是它那末 处置对象之间的循环引用间题报告 。

要正确的实现可达性分析算法,就能够 删剪地枚举出所有的GC Roots,有些总要愿因会漏掉本应存活的对象,愿因垃圾分派器错误的回收了哪几种被漏掉的活对象,愿因造成严重的bug。GC Roots作为垃圾回收的起点,能够 是有些列活的引用 (Reference) 集合,那你有些集合中究竟暗含哪几种引用?为哪几种哪几种引用还可以 作为GC Roots?要回答好你有些个多间题报告 ,能够 对Java对象在内存中布局有有些初步的了解,统统,在下节会对相关知识进行补充。

仔细阅读代码中的注释,并结合下面的内存形态学 示意图,应该还可以 很好的理解其中的愿因:愿因JVM垃圾分派器采用引用计数法,当obj1和obj2不再指向堆中的实例A、B时,我嘴笨 A、B愿因不愿因再被访问,但彼此间相互引用愿因计数器的值不为0,最终愿因无法回收A和B。

不管性能提高到何种程度,GC都需要花费一定的时间,对于实时性要求较高的场景,就能够 尽量压低GC愿因的最大暂停时间 (GC会愿因应用线程位于暂停情况表),举一个多例子:

随着编程语言的发展,GC的功能不断增强,性能统统 断提高,作为语言头上的无名英雄,GC离我们我们都的工作似乎那末 远。作为Java线程员,对你有些点我们我们都说会有更深的体会,我们我们能够 能够 了解太满与GC相关的知识,就能很好的完成工作。那还有必要深入了解GC吗?学习GC的意义在哪儿?

引用计数法一个多多致命的间题报告 ,即无法释放有循环引用的垃圾,有些,主流的Java虚拟机都那末 选着引用计数法来管理内存,统统 通过可达性分析 (Reachability Analysis)来判定对象是与非 存活。

可达性分析的基本思路是找到一系列被称为”GC Roots“的对象引用 (Reference) 作为起始节点,通过引用关系向下搜索,能被遍历到的 (可到达的) 对象就被判定为存活,其余对象 (也统统 那末 被遍历到的) 自然被判定为死亡。这还可以够 着重理解的是:可达性分析本质是找出活的对象来把其余空间判定为“无用”,而总要找出所有死掉的对象并回收它们占用的空间,简略的示意图如下所示。

图2 可达性算法示意图

举个栗子,下面的代码片段展示了为哪几种引用计数法无法处置循环引用的间题报告 。