一、执行引擎

应用程序经过编译,转换为字节码文件,字节码加载到内存空间并不能直接在操作系统上执行,执行引擎作为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

推荐阅读:编程体系整理

序号 项目名称 GitHub地址 GitEE地址 推荐指数
01 Java描述设计模式,算法,数据结构 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
02 Java基础、并发、面向对象、Web开发 GitHub·点这里 GitEE·点这里 ☆☆☆☆
03 SpringCloud微服务基础组件案例详解 GitHub·点这里 GitEE·点这里 ☆☆☆
04 SpringCloud微服务架构实战综合案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
05 SpringBoot框架基础应用入门到进阶 GitHub·点这里 GitEE·点这里 ☆☆☆☆
06 SpringBoot框架整合开发常用中间件 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
07 数据管理、分布式、架构设计基础案例 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆
08 大数据系列、存储、组件、计算等框架 GitHub·点这里 GitEE·点这里 ☆☆☆☆☆

虚拟机系列 | 执行引擎和垃圾回收相关推荐

  1. JVM(类加载、运行时数据区、堆内存、方法区、本地接口、执行引擎和垃圾回收)java虚拟机(JVM)的超详细知识点

    JVM虚拟机 一.JVM的概述 1.为什么要学习JVM 2.虚拟机 3.JVM的作用 作用 特点 4.JVM的位置 5.JVM的分类 6.各个组成部分的用途 7.Java 代码的执行流程 8.JVM ...

  2. JS引擎中垃圾回收机制

    思考: 1.JavaScript的内存是如何管理的? 2.Chrom浏览器是如何进行垃圾回收的? 我们带着以上两个思考来阅读文章. 一.JS内存管理 MDN介绍:"JavaScript 是在 ...

  3. 面试必会系列 - 1.6 Java 垃圾回收机制

    本文已收录至 Github(MD-Notes),若博客中有图片打不开,可以来我的 Github 仓库:https://github.com/HanquanHq/MD-Notes,涵盖了互联网大厂面试必 ...

  4. [译]GC专家系列2:Java 垃圾回收的监控

    原文链接:http://www.cubrid.org/blog/dev-platform/how-to-monitor-java-garbage-collection/ 这是GC专家系列文章的第二篇. ...

  5. java 虚拟机 Java内存结构 JVM垃圾回收机制算法

    什么是HotSpot VM 提起HotSpot VM,相信所有Java程序员都知道,它是Sun JDK和OpenJDK中所带的虚拟机,也是目前使用范围最广的Java虚拟机. 但不一定所有人都知道的是, ...

  6. 2021-08-20【JVM系列-2】 GC垃圾回收

    文章目录 前言 一.如何判断对象可以回收 1.1 引用计数法 1.2 可达性分析算法 1.3 四种引用 (强软弱虚) 二.垃圾回收算法 2.1 标记-清除 2.2 标记-整理 标记-复制 三.分代回收 ...

  7. Java虚拟机(十四)——垃圾回收算法

    文章目录 垃圾回收相关算法 标记阶段 引用计数算法 可达性分析算法(根搜索算法.追踪性垃圾收集) 基本思路: GC Roots 有哪几类? 注意 对象的finalization机制 清除阶段 标记-清 ...

  8. 【中级04】Java 虚拟机 Runtime Data Areas以及垃圾回收

    1.运行时数据区存放的内容: 区域         权限 作用 程序计数器 线程私有 记录的是当前线程字节码的行号;java代码,执行jvm字节码指令的地址 栈stack 私有 存放局部变量.操作数栈 ...

  9. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

最新文章

  1. Numpy掩码数组masked arrays,这一篇就够了
  2. 【网络安全】如何使用keimpx检测网络环境中的有效凭证
  3. windows 小技巧搜集(不定期更新)
  4. Python学习笔记(三)——条件语句、循环语句
  5. 第六次作业——团队作业
  6. Android开发技巧——大图裁剪
  7. java内存系列:测试JDK最大内存
  8. 前端学习(2533):mapgetter和actions
  9. 贪吃蛇小游戏源码再回顾
  10. oraclek导出表_oracle如何导出和导入数据库/表
  11. 线程间通信方式 java_深入理解JAVA多线程之线程间的通信方式
  12. 微带滤波器摘要_微带线带通滤波器设计
  13. 上海哪里打印比较便宜?
  14. python中ix用法_pandas中ix的使用详细讲解
  15. 基于Bootstrap的下拉框多选 Bootstrap Multiselect 插件使用
  16. 2018年HBase生态社群画像
  17. 事务的传播级别(行为)
  18. AutoGAN-Distiller: Searching to Compress Generative Adversarial Networks, ICML2020
  19. 医院分诊排队叫号系统源码
  20. Vector-常用CAN工具 - CANoe入门到精通_02

热门文章

  1. 中艺人脸识别考勤机使用方法_人脸识别考勤机的使用方法及注意事项 - 全文
  2. 形成20位存储单元的物理地址
  3. 数据结构之树与二叉树的应用:平衡二叉树(AVL)
  4. (软件工程复习核心重点)第九章面向对象分析-第三节:面向对象分析之建立动态模型和功能模型
  5. (计算机组成原理)第四章指令系统-第一节2:扩展操作码
  6. 15个最受欢迎的Python开源框架
  7. poj3616 基础的动态规划算法 《挑战程序设计竞赛》
  8. Python爬虫之pyppeteer去除Chrome正受到自动测试软件的控制(反爬策略)
  9. Redis Save 命令
  10. Redis 主从复制的几种方法