JVM及垃圾回收机制

这篇具有很好参考价值的文章主要介绍了JVM及垃圾回收机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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加载。这样确保了类加载的一致性和隔离性。
JVM及垃圾回收机制,总结,Java基础,jvm
JVM及垃圾回收机制,总结,Java基础,jvm

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

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

2.3、如何打破双亲委派?

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

3、JVM解释执行指令过程

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

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

JVM堆内存主要分为新生代和老年代:
JVM及垃圾回收机制,总结,Java基础,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)算法

将内存空间分为两块,每次只使用一块,在进行垃圾回收时,将可达对象复制到另外没有被使用的内存块中,然后再清除当前内存块中的对象,后续再按照同样的流程进行垃圾回收。
JVM及垃圾回收机制,总结,Java基础,jvm

5.3.1、优点

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

5.3.2、缺点

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

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

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

6、垃圾回收器

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

到了这里,关于JVM及垃圾回收机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 3.Java面试题—JVM基础、内存管理、垃圾回收、JVM 调优

    一篇文章掌握整个JVM,JVM超详细解析!!! JVM (Java虚拟机) 是运行 Java 字节码 的 虚拟机 。 JVM 针对 不同系统 有 特定实现 ( Windows 、 Linux 等),目的是 同样的代码 在 不同平台 能运行出 相同的结果 。 Java 语言 要经过 编译 和 解释 两个步骤: 编译 :通过 编译器 将 代码 一

    2024年02月15日
    浏览(37)
  • 【JVM】垃圾回收机制

     哈喽,哈喽,大家好~ 我是你们的老朋友: 保护小周ღ    今天给大家带来的是  JVM (Java 虚拟机) 的垃圾回收机制,回收是指回收什么?  如何确定要回收的内存: 引用计数,可达性分析,如何释放空间 : 标记清除,复制算法,标记整理,分代回收 ,一起来看看叭~ 本期

    2024年02月09日
    浏览(33)
  • 浅谈JVM垃圾回收机制

    新生代收集(Minor GC/Young GC):只对新生代进行垃圾收集 老年代收集(Major GC/Old GC):只队老年代进行垃圾收集 混合收集(Mixed GC):对整个新生代和老年代进行垃圾收集 收集整个Java堆和方法区 空间分配担保是为了确保在Minor GC之前老年代还有容纳新生代所有对象的剩余空间 垃圾回收算

    2024年02月10日
    浏览(32)
  • JVM及垃圾回收机制

    类加载器负责将.class文件加载到JVM中。主要分为三种层次:Bootstrap ClassLoader、Extension ClassLoader和Application ClassLoader。它们按层次关系加载类,保证类的隔离性和重用性。 运行时数据区包括方法区、堆、栈、本地方法栈和程序计数器。堆用于存放对象实例,方法区保存类信息和

    2024年02月12日
    浏览(33)
  • 【JVM】JVM执行流程 && JVM类加载 && 垃圾回收机制等

    目录 🌷1、JVM是什么? 🌷2、JVM的执行流程(能够描述数据区5部分) 🌷3、JVM类加载过程 🌷4、双亲委派机制:描述类加载的过程 问题1:类加载器 问题2:什么是双亲委派模型?  问题3:双亲委派模型的优点 🌷5、垃圾回收机制(重要,针对的是堆)    问题1:判定对象

    2024年02月15日
    浏览(47)
  • JVM:垃圾回收机制(GC)

    引用计数算法:         在对象中添加一个引用计数器,当每有一个地方引用它时,计数器值加一。当引用失效时,计数器值就减一。当一个对象的计数器为零时,表示该对象没有被任何其他对象引用,因此可以被释放。 优点 :是可以及时回收垃圾对象,避免内存泄漏,且

    2024年01月19日
    浏览(36)
  • JVM中的垃圾回收机制

    java相较于c、c++语言的优势之一是自带垃圾回收器,垃圾回收是指 不定时 去堆内存中清理 不可达 对象。不可达的对象并不会 马上 就会直接回收, 垃圾收集器在一个Java程序中的执行是自动的,不能强制执行,程序员唯一能做的就是通过调用System.gc 方法来建议执行垃圾收集

    2024年02月16日
    浏览(38)
  • JVM G1垃圾回收机制介绍

    G1(Garbage First)收集器 (标记-整理算法): Java堆并行收集器,G1收集器是JDK1.7提供的一个新收集器,G1收集器基于“标记-整理”算法实现,也就是说不会产生内存碎片。此外,G1收集器不同于之前的收集器的一个重要特点是:G1回收的范围是整个Java堆(包括新生代,老年代),而其

    2024年02月13日
    浏览(22)
  • 【JVM】垃圾回收机制详解(GC)

    可以看jvm详解之后,再来理解这篇文章更好 堆和方法区,主要发生在堆中,然后主要发生在堆的伊甸园区(Eden)。 Java中的垃圾回收是根据 可达性分析算法(Reachability Analysis) 和 引用计数算法 来判断对象是否存活的。 JDK.1.2 之后,Java 对引用的概念进行了扩充,将引用分为了:

    2024年02月13日
    浏览(44)
  • 【JVM】| 垃圾回收机制 | 文末送书

    Java的垃圾回收机制是自动的,不需要程序员手动进行内存管理。当Java应用程序创建对象时,它们存储在堆内存中。当对象不再被引用时,垃圾回收器会自动标记这些对象为垃圾,并将它们从堆内存中清除,释放空间。 如果要操作对象,必须通过引用来进行。如果一个对象没

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包