JVM及垃圾回收机制

文章目录

  • 1、JVM组成?各部分作用?
    • 1.1 类加载器(Class Loaders)
    • 1.2 运行时数据区(Runtime Data Area)
    • 1.3 执行引擎(Execution Engine)
    • 1.4 本地方法接口(Native Interface)
  • 2、类加载机制?
    • 2.1、类加载过程
    • 2.2、为什么使用双亲委派?
    • 2.3、如何打破双亲委派?
  • 3、JVM解释执行指令过程
  • 4、JVM堆内空间各部分作用?
  • 5、垃圾回收
    • 5.1YoungGC、FullGC、MinorGc
      • Young Generation(新生代)
      • YoungGC(Minor GC)
      • Full GC(Major GC)
    • 5.2、垃圾回收算法-可达性分析法
      • 5.2.1标记
      • 5.2.2清除
      • 5.2.3压缩(可选)
    • 5.3、垃圾回收算法-复制(Copy)算法
      • 5.3.1、优点
      • 5.3.2、缺点
    • 5.4、垃圾回收算法-标记-整理法
  • 6、垃圾回收器

1、JVM组成?各部分作用?

1.1 类加载器(Class Loaders)

类加载器负责将.class文件加载到JVM中。主要分为三种层次:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。它们按层次关系加载类,保证类的隔离性和重用性。

1.2 运行时数据区(Runtime Data Area)

运行时数据区包括方法区、堆、栈、本地方法栈和程序计数器。堆用于存放对象实例,方法区保存类信息和静态变量,栈存储方法调用信息,本地方法栈用于支持本地方法调用,程序计数器记录当前执行的字节码指令位置。

1.3 执行引擎(Execution Engine)

执行引擎负责将字节码转化为机器码并执行。包括解释器和即时编译器(JIT Compiler)。解释器逐条解释执行字节码,JIT编译器将热点代码编译成本地机器码以提高执行效率。

1.4 本地方法接口(Native Interface)

本地方法接口允许Java代码调用本地方法库中的函数。通过JNI(Java Native Interface)实现。

2、类加载机制?

类加载机制确保类的唯一性和隔离性,采用双亲委派模型。

2.1、类加载过程

当加载一个类时,先由最顶层的Bootstrap ClassLoader尝试加载,若找不到则由下一级的Extension ClassLoader加载,最后由Application ClassLoader加载。这样确保了类加载的一致性和隔离性。
在这里插入图片描述
在这里插入图片描述

2.2、为什么使用双亲委派?

一是避免重复加载一些class,二是避免JDK的一些class被我们自定义一个类加载器给覆盖掉,设计到安全问题,假如JVM类加载是只要给一个class就能直接加载的话,那么我们自定义一个类加载器,然后给它一个名为java.lang.String的class,里面自定义一些方法,让用户在输入账号密码进行登录的时候给我发一封邮件,这样用户的信息就泄漏了。

2.3、如何打破双亲委派?

在某些情况下,为了实现特定需求,可以通过自定义ClassLoader打破双亲委派模型。例如,Web容器中的类加载机制就需要自定义ClassLoader来隔离不同的Web应用。

3、JVM解释执行指令过程

JVM执行引擎将字节码指令解释为对应的机器码指令,然后交由处理器执行。这个过程包括指令的解码、操作数的获取、指令的执行等步骤。
在这里插入图片描述
可以看上图,bipush指令表示将10加载到操作数栈,istore_1表示将10从操作数栈存储到局部变量表下标为1的位置,存入局部变量表索引为1处,iload_1将局部变量表索引为1的位置的数据加载到操作数栈,iadd表示把栈中数据8 和15 出栈进行求和操作后,再放回操作数栈,return 方法结束;

4、JVM堆内空间各部分作用?

JVM堆内存主要分为新生代和老年代:
在这里插入图片描述

新生代:分为Eden空间和两个Survivor空间。大部分新创建的对象都存放在Eden空间,经过一次垃圾回收后,存活的对象会被移动到Survivor空间。
老年代:存放长寿命对象,经过多次垃圾回收仍存活的对象会被移到老年代。
JVM规范中规定所有的对象和数组都应该存放在堆中,在执行字节码指令时,会把创建的对象存入堆中,对象对应的引用地址存入虚拟机栈中的栈帧中,不过当方法执行完之后,刚刚所创建的对象并不会立马回收,而是要等JVM后台执行GC后,对象才会被回收。

5、垃圾回收

5.1YoungGC、FullGC、MinorGc

Young Generation(新生代)

新生代(Young Generation)是Java堆内存中的一个区域,通常用于存放刚刚创建的对象。由于大部分对象的生命周期较短,新生代采用了不同的垃圾回收策略以提高效率。Young Generation被进一步划分为三个部分:

Eden Space:刚刚创建的对象被分配到Eden空间。
Survivor Spaces(S0和S1):当进行垃圾回收时,Eden空间中的存活对象会被移动到其中一个Survivor空间,而另一个Survivor空间则用于存放前一次回收时的存活对象。

YoungGC(Minor GC)

YoungGC,也称为Minor GC,是针对新生代进行的垃圾回收。当Eden空间满时,会触发YoungGC。其工作流程包括:

首先,Eden空间中的存活对象会被复制到一个Survivor空间中。
如果Survivor空间满了,或者对象年龄达到一定阈值,存活对象会被移到另一个Survivor空间中。
经过多次YoungGC后,仍然存活的对象会被晋升到老年代。
由于新生代的大小相对较小,YoungGC通常很快完成,但它可能会频繁发生,特别是对于生命周期短的对象。

Full GC(Major GC)

Full GC,也称为Major GC,是针对整个堆内存(包括新生代和老年代)进行的垃圾回收。Full GC会停止应用程序的执行,因此会导致较长的停顿时间。

Full GC的主要目标是清理堆内存中的无用对象,释放出更多的空间。Full GC通常在以下情况下发生:

当老年代空间不足时,会触发Full GC,以清理整个堆内存。
当调用System.gc()方法时,可能会触发Full GC,尽管这并不保证立即触发。
Full GC的性能较差,因此在实际应用中应该尽量避免频繁的Full GC。

5.2、垃圾回收算法-可达性分析法

Java中,垃圾回收器通过判断对象的可达性来确定哪些对象可以被回收。可达性是指从一组称为“GC Roots”(垃圾回收根节点)的对象出发,通过一系列的引用关系,能够到达的其他对象。如果一个对象无法通过任何引用链与GC Roots相连,那么该对象就是不可达的,可以被标记为垃圾并进行回收。

GC Roots通常包括以下几种类型的对象:

  • 栈帧中的本地变量与参数:位于方法中的局部变量、输入参数和输出参数。
  • 静态类属性:类的静态字段和常量引用。
  • 活动线程:正在执行的线程,其中的局部变量与参数也是GC Roots。 基于可达性分析法的垃圾回收过程包括以下几个步骤:

5.2.1标记

从GC Roots开始,通过引用链标记所有可达的对象。这些对象被标记为“存活”。

5.2.2清除

清除所有未标记的对象,即不可达的对象。这些对象被认为是垃圾,可以被回收。

5.2.3压缩(可选)

对堆内存进行整理,将存活对象移到一端,以便提供连续的可用内存。
这种垃圾回收算法具有以下优点:

  • 精确性:只回收不可达的对象,避免了误删可能还有用的对象。

  • 适用性广泛:适用于大多数情况,不论对象的分布和生命周期如何。
    然而,可达性分析法也存在一些潜在的问题:

  • 效率:在堆内存较大且存活对象较多时,标记阶段可能会占用较多时间。

  • 停顿时间:在执行垃圾回收时,程序执行可能会被暂停,影响用户体验。

5.3、垃圾回收算法-复制(Copy)算法

将内存空间分为两块,每次只使用一块,在进行垃圾回收时,将可达对象复制到另外没有被使用的内存块中,然后再清除当前内存块中的对象,后续再按照同样的流程进行垃圾回收。
在这里插入图片描述

5.3.1、优点

1、没有标记和清除阶段,通过GC Roots找到可达对象,直接复制,不需要修改对象头,效率高;
2、不会出现内存碎片

5.3.2、缺点

1、需要更多的内存,始终有一半的内存空闲
2、对象复制后,对象的内存地址发生了变化,需要额外的时间修改栈帧中记录的引用地址
3、如果可达对象比较多,垃圾对象比较少,那么复制算法的效率就会比较低,所以垃圾对象多的情况下,复制算法比较适合;

5.4、垃圾回收算法-标记-整理法

当成功标记出内存中的垃圾对象之后,标记压缩法会将所有的存活对象都移动到一个规整且连续的内存空间中,然后执行Full GC(老年代的垃圾回收,或者被称为Major GC)回收无用对象所占用的内存空间。当成功压缩后,已用和未用的内存都各自一遍,彼此之间维系着一个记录下一次分配起始点的标记指针,当为新对象分配内存时,则可以用指针碰撞(Bump the Pointer)技术修改指针的偏移量将新对象分配在第一个空闲内存位置上。
在这里插入图片描述

6、垃圾回收器

JVM提供了不同的垃圾回收器,每个回收器有不同的适用场景和性能特点。
Serial收集器:单线程,适用于Client模式。
Parallel收集器:多线程,适用于Server模式。
CMS(Concurrent Mark-Sweep)收集器:并发标记清除,适用于响应时间要求较高的场景。
G1(Garbage First)收集器:将堆划分为多个区域,具有更好的内存管理和垃圾回收控制能力。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/83889.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++二叉树进阶

本期内容我们讲解二叉树的进阶知识,没有看过之前内容的小伙伴建议先看往期内容 二叉树-----补充_KLZUQ的博客-CSDN博客 目录 二叉搜索树 代码实现 基础框架 Insert Find Erase 析构函数 拷贝构造 赋值 二叉搜索树的应用 全部代码 二叉搜索树 二叉搜索树…

【算法系列篇】前缀和

文章目录 前言什么是前缀和算法1.【模板】前缀和1.1 题目要求1.2 做题思路1.3 Java代码实现 2. 【模板】二维前缀和2.1 题目要求2.2 做题思路2.3 Java代码实现 3. 寻找数组的中心下标3.1 题目要求3.2 做题思路3.3 Java代码实现 4. 除自身以外的数组的乘积4.1 题目要求4.2 做题思…

实验九 根文件系统移植

【实验目的】 熟悉根文件系统的目录结构,构建自己的根文件系统 【实验环境】 ubuntu 14.04 发行版FS4412 实验平台交叉编译工具:arm-none-linux-gnueabi- 【注意事项】实验步骤中以“$”开头的命令表示在 ubuntu 环境下执行 【实验步骤】 一、构建自…

XXL-JOB

XXL-JOB是一个分布式的任务调度平台。 目的:为了自动完成特定的任务,在约定的特定时间去执行任务的过程。 原因:在spring中有scheduled,放到业务层代码上面也可以。但是其无法做到高可用、防止重复执行,单机处理极限…

Java项目-苍穹外卖-Day06-微信小程序开发

文章目录 前言1.HttpClienthttpclient是什么入门案例发送GET请求发送POST请求Httpclient工具类 2.微信小程序介绍准备工作注册小程序和完善对应信息下载开发者工具 入门案例 前言 本篇主要是主要是wx小程序开发入门和HttpClient的使用介绍 完成了苍穹外卖用户端的 微信登陆 和…

记录一个用C#实现的windows计时执行任务的服务

记录一个用C#实现的windows计时执行任务的服务 这个服务实现的功能是每天下午六点统计一次指定路径的文件夹大小 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.IO; using Syst…

登录校验-JWT令牌-登陆后下发令牌

目录 思路 接口文档 令牌生成和下发 步骤 具体代码如下 工具类 控制类 测试 前后端联调 思路 令牌生成:登陆成功后,生成JWT令牌,并返回给前端令牌校验:在请求到达服务端后,对令牌进行统一拦截、校验 接口文档…

考研C语言进阶题库——更新41-50题

目录 41.编写程序要求输出整数a和b若a和b的平方和大于100,则输出a和b的平方和,否则输出a和b的和 42.现代数学的著名证明之一是Georg Cantor证明了有理数是可枚举的。他是用下面这一张表来证明这一命题的:第一项是1/1,第二项是是…

微信开放注册微信小号功能,工作人群福音!

微信,这个坐拥数亿用户的社交巨头,最近终于开放了注册微信小号的功能。这个功能对于需要多个微信账号进行工作的人来说,无疑是一场及时雨,极大地提高了工作便利性。 在之前的版本中,每个微信账号都绑定了一个手机号&am…

改进YOLO系列:5.添加CBAM注意力机制

添加CBAM注意力机制 1. CBAM注意力机制论文2. CBAM注意力机制原理3. CBAM注意力机制的配置3.1common.py配置3.2yolo.py配置3.3yaml文件配置1. CBAM注意力机制论文 论文题目:CBAM: Convolutional Block Attention Module 论文链接:CBAM: Convolutional Block Attenti…

哪个蓝牙耳机打电话比较好,打电话降噪蓝牙耳机推荐

近年来,骨传导耳机的市场表现出了显著的增长,其市场竞争也变得异常激烈,与传统无线耳机相比,“骨传导耳机”的知名度还达不到举世皆知的地步,但对于运动群体以及部分有听力损伤的群体来说,骨传导耳机还是有…