深入理解JVM之二:垃圾收集器概述

  • 时间:
  • 浏览:1
  • 来源:大发彩神8官网—大发彩神8快3

朋友知道Java的内存区域分为应用多多线程 计数器、虚拟机栈、本地方法栈、Java堆和方法区,怎样才能让其中的应用多多线程 计数器、虚拟机栈和本地方法栈都要应用多多线程 独立的,也只要说这三块内存区域的生命周期与应用多多线程 是同生共死的。栈中帧栈在类特征选泽的只要就可能知道该分配有几个内存了,很多有当应用多多线程 结速英语 的只要,内存也跟着同去回收了,从这俩 高度看,这三块的内存区域的内存分配和垃圾埋点就比较固定了。反观Java堆和方法区,比如朋友定义有一五个 接口,接口有着不同的实现类,而每个实现类的内存可能会不一样,每个实现类的方法的多个语句分支也可能都要的内存不一样,诸没办法 类。很多有这两块区域的内存分配具有不选泽性,没办法 在垃圾回收的只要自然也位于不选泽性。在Java的垃圾埋点机制中,关注的是这两块内存区域的垃圾回收。

回收永久代对象

废弃常量的回收比较好理解,可能只要没办法 任何对象引用常量池中的某个对象,没办法 这俩 对象就会被回收(等等,只要都要说有一五个 对象可能要宣判“死刑”,都要都要两次标记吗,为什么在么在么现在一次就够了呢?主要在于前面说的是非常量池中的对象,废弃常量回收的是运行时常量池中的对象,很多有只都要一次标记就好)。

永久代的垃圾回收包括两帕累托图:废弃常量和无用的类

下面的这段代码可以 说明这俩 问题图片:

代码清单:

难能可贵介绍这俩 算法,是可能这俩 算法是Java虚拟机中所借鉴的,自然有必要了解一二。

都要满足以下有一五个 条件才可以 宣判有一五个 类的“死刑”:

从里面的测试代码中可以 知道,即使在GC Roots中的没办法 引用链,怎样才能让被第一次标记,没办法 只要在finalize方法中是这俩 对象去掉 有一五个 引用就可以 。只要对象就可以 逃脱“被判死刑”的命运了。然而,这俩 方法并都要官方推荐的,可能finalize方法运行运行代价高昂,不选泽大,无法保证各个对象的调用顺序,在Java中try-finally块都比finalize方法好。

好了,接下来朋友释放了内存空间,一块内存含有这俩 对象,那些对象是有生命周期的,当生命周期终结的只要,垃圾回收器就起作用了。然而问题图片又来了,怎样才能判断有一五个 对象的生命周期可能终结呢?火换句话说只要计算机是怎样才能判断有一五个 对象可能死亡了呢?在JVM领域,都要了垃圾回收算法,不过在Java虚拟机的垃圾回收算法出现只要,曾出现过引用计数算法可达性分析算法,前者朋友可以 自行Google,这里主要介绍可达性分析算法。

算法的基本思想只要通过一系列的称为“GC Roots”的对象作为起始点(那些对象可以 作为GC Roots,里面总要介绍),从那些起始点结速英语 向下搜索,所走过的路径称为引用链,可能有一五个 对象到GC Roots没办法 任何引用链,没办法 这俩 对象是不可用的,只要说,应用多多线程 中没办法 谁引用了这俩 对象,很多有可以 说从根节点到叶子结点是不可达的(学过图的应该知道)。

注意里面的可以 ,仅仅是可以 哦。很多有与对象的回收不同,算是都要对类进行回收,都要设置相关的参数才行。

没办法 无用的类又应该怎样才能回收呢?

前言

为那些要垃圾回收

最后的输出结果是只要的:

下面的问题图片是那些对象可以 作为“GC Roots”对象呢?Java中,以下对象可作为GC Roots对象:

可达性分析算法

前面说了,Java的内存回收主要确实方法区和Java堆中,Java堆中的新生代(对象的分代将在下一篇博客中说明),可能新生代的存活时间比较短,很多有对新生代进行垃圾回退还收的空间比较大,怎样才能让方法区中的永久代则可能可能存活时间较长,很多有下一次的垃圾回退还收该对象的可能没办法 新生代没办法 大。很多有对永久代的回收波特率会大打折扣。怎样才能让这帕累托图对象仍然是都要回收。

OK,现在朋友可能知道了通过可达性分析判断对象算是还可用,怎样才能让是都要不可达的对象都要不可用呢?答案是不用说。由于 在于要回应有一五个 对象的死亡,都要两次标记(为那些都要两次标记呢?由于 是可能有一五个 对象没办法 与GC Roots结点相连,就会被第一次标记,而可能对象覆盖了finalize方法,怎样才能让在finalize方法中与某个对象建立了引用关系,没办法 第二次标记会失败,没办法 这俩 对象就会被移出“即将回收”的对象列表,移出只要这俩 对象就“活”了下来,可能在finalize方法中这俩 对相关仍然没办法 与有一五个 对象建立引用关系,没办法 这俩 对象就真正死亡了)。

在接触Java虚拟机只要,只听过那些老年代和年轻代。在接触Java虚拟机只要,才知道所谓的年轻代和老年代只要垃圾回收中的某种分代回收算法(里面总要介绍)。现在朋友比较关心的是为那些要进行垃圾回收?没办法 垃圾回收不行吗?想必了解C语言的伙伴知道,C含有malloc、free等于内存分配以及内存释放的函数,这又是为那些呢?朋友知道电脑的内存是有限的,可能一段应用多多线程 申请了一块内存空间并执行完计算只要,没办法 释放内存,会由于 这块内存被占用,没办法 可用内存就变少了,没办法 问题图片来了,可能有一五个 系统很庞大,应用多多线程 中迟早会把电脑内存耗尽的。为了提高内存的使用波特率,内位于使用完都要释放,只要这俩 应用多多线程 才可能重新申请这块内存。