关于java:虚拟机系列-执行引擎和垃圾回收

3次阅读

共计 2168 个字符,预计需要花费 6 分钟才能阅读完成。

本文源码:GitHub·点这里 || GitEE·点这里

一、执行引擎

应用程序通过编译,转换为字节码文件,字节码加载到内存空间并不能间接在操作系统上执行,执行引擎作为 Java 虚拟机外围的组成部分,作用就是将字节码指令解释 / 编译为对应零碎平台上的本地机器指令。

解释器 :虚拟机启动时会依据预约义对字节码采纳逐行解释的形式执行,将每条字节码文件中的内容解释为对应零碎平台的本地机器指令执行;

JIT 编译器 :虚拟机将源代码编译成本地机器平台相干的机器语言,并且寻找热点高频执行的代码将其放入元空间中,即元空间中寄存的 JIT 缓存代码;

垃圾回收 :对于没有任何援用的对象标记为垃圾,会被回收开释内存空间。

二、垃圾对象标记

1、援用计数法

每个对象保留一个整型援用计数器,用来记录对象被援用的次数,当该对象被一个对象援用时,计数器加 1,当失去一个援用时,计数器减 1;援用计数算法就是通过判断对象的援用数量来决定对象是否能够被当做垃圾对象回收掉。

尽管援用计数法效率高,然而当两个对象相互援用时会导致这两个对象始终不会被回收,这是一个致命的缺点。所以 JVM 并没有采纳该标记算法。

2、可达性剖析算法

可达性剖析算法是基于对象到根对象的援用链是否可达来判断对象是否能够被回收;

运行程序把所有的援用关系链看作一张图,通过 GC-Roots 根对象对象汇合作为起始点,从每个根节点向下一直搜寻被根对象汇合所连贯的对象是否可达,搜寻门路称为援用链(Reference-Chain),如果对象到 GC-Roots 没有任何援用链存在,则阐明此对象是不可用的,

  • 虚拟机栈中援用的对象;
  • 元空间中类动态属性援用的对象;
  • 元空间中常量援用的对象;
  • 本地办法栈中 Native 办法援用的对象;

绝对于援用计数法算法,可达性剖析算法则防止了循环援用导致的问题,同样具备执行高效的特点,也是 JVM 采纳的标记算法。

三、垃圾回收机制

1、标记革除算法

标记 - 革除算法分为标记和革除两个阶段:

标记阶段:从根对象汇合进行扫描,对存活的对象对象标记;革除阶段:再次扫描发现未被标记的对象并进行回收;

该算法效率不高,进行垃圾回收须要暂停应用程序,同时会产生大量内存碎片,后续程序运行过程中分配内存占用较大的对象时,会有间断内存不够状况,容易触发再一次垃圾收集动作。

2、标记整顿算法

标记整顿算法的标记过程相似标记革除算法,第一阶段:标记出垃圾对象;第二阶段:让所有存活的对象都向内存区一端挪动;第三阶段:间接清理掉边界端以外的内存,相似于磁盘整顿的过程;

该垃圾回收算法效率不高,对象挪动过程须要暂停应用程序,实用于对象存活率高的场景(老年代)。

3、复制算法

复制算法将内存按容量划分为大小相等的两块,每次只应用其中的一块,当应用的这块的内存用完,就将还存活着的对象复制到另外一块闲暇内存上,而后应用过的内存空间一次清理。

该算法实现简略,运行效率高,然而内存空间重大节约,实用于对象存活率低的场景,比方新生代。

4、分代收集算法

以后市场上简直所有的虚拟机都采纳该回收算法,分代收集算法依据年老代和老年代的各自特点采纳不同的算法机制,不同内存区域中对象生命周期也不同,因而对堆内存不同区域采纳不同的回收策略能够进步垃圾回收执行效率。通常状况新生代对象存活率低,回收频繁,就采纳复制算法;老年代存对象生命周期长,活率高,就用标记革除算法或者标记整顿算法。

Java 堆内存个别能够分为新生代、老年代和永恒代三个模块,如下图所示:

新生代

通常状况下,新创建的对象实例首先都是放在新生代空间中,所以谋求疾速的回收掉垃圾对象,个别状况下,新生代内存依照 8:1:1 的比例分为一个 eden 区和两个 survivor(survivor0,survivor1) 区,对象实例大部分在 Eden 区中生成;

垃圾回收时先把 eden 区存活对象复制到 S0 区,而后清空 eden 区,当 S0 区也满时,再将 eden 区和 S0 区存活对象复制到 S1 区,而后清空 eden 和 S0 区,之后替换 S0 区和 S1 区的角色,当 S1 区无奈寄存 eden 区和 S0 区的存活对象时,就将存活对象间接存移到老年代区,当老年代区也满了,触发一次 FullGC,即新生代、老年代都进行回收。

老年代

老年代区寄存一些生命周期较长的对象,对象实例在新生代中经验了屡次垃圾回收依然存活的对象,会被挪动到老年代区中。

四、源代码地址

GitHub·地址
https://github.com/cicadasmile/java-base-parent
GitEE·地址
https://gitee.com/cicadasmile/java-base-parent

举荐浏览:编程体系整顿

项目名称
【Java 形容设计模式, 算法, 数据结构】GitHub==GitEE
【Java 根底、并发、面向对象、Web 开发】GitHub==GitEE
【SpringCloud 微服务根底组件案例详解】GitHub==GitEE
【SpringCloud 微服务架构实战综合案例】GitHub==GitEE
【SpringBoot 框架根底利用入门到进阶】GitHub==GitEE
【SpringBoot 框架整合开发罕用中间件】GitHub==GitEE
【数据管理、分布式、架构设计根底案例】GitHub==GitEE
【大数据系列、存储、组件、计算等框架】GitHub==GitEE
正文完
 0