了解 JVM - 认识垃圾回收机制与类加载过程

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


前言

本篇通过介绍JVM是什么,认识JVM的内存区域的划分,了解类加载过程,JVM中垃圾回收机制,从中了解到垃圾回收机制中如何找到存活对象的方式,引用计数与可达性分析的方式,再释放垃圾对象时使用的方式,标准清除,复制算法,标准整理,分代回收等等,如有错误,请在评论区指正,让我们一起交流,共同进步!



本文开始

1. 什么是JVM?

JVM: Java虚拟机,通过软件模拟具有硬件功能,运行在一个完全隔离的环境中的完整计算机系统;

2. 认识JVM内存区域的划分

JVM内存区域图示:

了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea

问题:查看变量的形态,也就是根据代码判断属于堆,栈还是方法区?
① 堆: 成员变量;(new 出来的对象存放其中)
② 栈:局部变量;(维护方法直接的调用关系)
③ 方法区:静态变量;(放类加载后的类对象, 被static修饰的)
【注】变量处在什么区域与变量类型无关;

线程私有的内存:每个线程都有一个独立的程序计数器,各条线程之间计数器互不影响,独立存储;

  • 栈包括本地方法栈和虚拟机栈;
    本地方法栈:给JVM内部本地方法使用;
    虚拟机栈:给java代码使用;
  • 程序计数器:记录当前程序执行到那个指令了;
  • 堆:存储程序中创建的对象
  • 方法区:存放类加载后的类对象;- 静态变量;

【注】线程共享:堆与元数据区; 线程私有:栈(包括虚拟机栈,本地方法栈)与程序计数器;

例如:

	void function() {
		Student s = new Student();
	}
	//s是引用类型,是局部变量,处在栈上,而new Student()是对象,处在堆上;

3. 认识类加载过程

类加载:把 .class 文件加载到内存 得到类对象的过程;

类加载过程:
加载:找到.class文件,读取文件内容;
验证:验证.class文件是否符号规范要求;.class文件有明确的数据格式;
准备:给类对象分配内存空间(给类变量(static修饰的静态变量)分配的内存空间是未初始化,默认全是0,此时静态变量也是0);
例如:public static int value = 66; //此时准备是给value分配空间,初始化为0,不是66;
解析:针对字符串常量进行初始化;
初始化常量的过程: Java 虚拟机将常量池内的 符号引用 替换为 直接引用 的过程;
符号引用:处于相对位置,字符串常量在.class文件中存在,这时只知道他们之间的相对位置也就是符号引用;
直接引用:处于实际位置,加载到内存中知道位置就是实际内存位置也就是直接引用;
初始化:针对类对象进行初始化;(初始化静态成员,执行静态代码,类有父类也需要加载父类)

4. 类加载中的双亲委派模型

4.1 触发类加载时机 - 类加载是非必要,不加载
1)创建了类的实例
2)使用类的静态方法/静态属性
3)使用子类,触发父类的加载

4.2 双亲委派模型
双亲委派模型作用:在类加载阶段,找.class文件;

JVM加载类会使用类加载器这里简单介绍一下;
JVM中内置的三个类加载器:
① BootStrap ClassLoader: 负责加载Java标准库中的类
② Extension ClassLoader: 负责加载一些非标准的 Sun/Oracke扩展的库中的类;
③ Application ClassLoader: 负责加载项目中自己写的类,和第三方库中的类;

类加载过程图:

了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea

5. JVM中的垃圾回收机制

5.1 GC是什么?

GC是垃圾收集的意思;帮助程序员自动释放内存的;

JVM主要释放哪个区域? =》释放 堆区域

5.2 垃圾回收的两个阶段

5.2.1 第一阶段:找GC对象,看对象是否存活; - 找垃圾

如何找垃圾:Java中使用对象,只能通过引用,所以通过判断一个对象是否有引用指向就可以了;所以引入下面两种方法;

  • 引用计数法:给对象里安排一个额外空间,保存一个整数,表示该对象有几个引用指向;Java中不使用, Python,PHP使用

图示:了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea
【注】
计数器作用:引用增加,计数器就增加;引用减少,计数器就减少,当计数器为0时,就认为该对象没有引用了,认为时垃圾;
引用计数的缺点:
① 浪费空间 ② 存在循环引用的情况,会导致引用计数判定逻辑错误;

  • 可达性分析法:(Java中使用)把对象之间的引用关系,理解为一个树形结构,从一些特殊起点出发,进行遍历,只要能遍历到的对象,就是可达的,把不能访问到的对象,也就是不可达的当作垃圾;

通过一个树形结构图来看一下:

了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea
通过root引用作为起点,就可以访问整个树的节点;
可达性条件:进行图示遍历需要有起点;
① 栈上的局部变量,都是起点;
② 常量池中的引用对象;
③ 方法区中,静态成员引用的对象;
可达性分析的缺点:
1)消耗更多时间,遍历过程消耗时间,不能第一时间发现某个垃圾对象;
2)在遍历的时候,如果过程中当前代码的对象引用关系变了,就会产生麻烦;

5.2.2 第二阶段:释放垃圾对象

三种策略:
1)标记清除:先标记出回收对象,再直接释放垃圾对象内存;
产生问题:会产生大量内存碎片;清理完垃圾对象产生大量内存碎片,剩余的内存空间即使很多,但都是碎片化的,如果要申请一段连续的空间可能都申请不到;
图示:

了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea

2)复制算法: 解决了内存碎片问题;
复制算法过程:把整个内存空间分成两段(为了好描述过程,这里把内存空间分为a,b,a与b一样),一次只使用一半;如果使用a内存,将a内存中不是垃圾对象的拷贝到没有使用的另一边b内存中,然后再统一释放内存;
图示复制算法:

了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea
缺点:1)内存利用率比较低;
2)如果当前只要少部分垃圾,大部分对象需要保留,就需要花费高的复制成本;

3)标记整理
标记整理思想:结合上述标记清除,标记整理在其上在加上一个从后向前搬运元素的过程;
标记整理图示:

了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea
特点:1)解决了内存碎片的问题
2)但从后向前搬运的开销比较大;

5.3 JVM的分代回收机制

分代回收机制:综合上述思想,针对不同的情况,使用不同的策略对垃圾进行回收;
分代回收图示:

了解 JVM - 认识垃圾回收机制与类加载过程,javaee,jvm,java,后端,idea

分代回收过程:
1)·新创建的对象存放到伊甸区;
2)伊甸区的对象,经过第一轮GC,会通过复制算法,拷贝到生存区;生存区分为两半,大小相等,每次只使用一半;
在生存区中是垃圾对象就淘汰,不是垃圾对象就复制到另一半,一直重复上述过程;
3)对象在生存区,经过若干轮GC,年龄增长到 一定程度,就会通过复制算法拷贝到老年代区;
4)进入老年代的对象,年龄比较大,针对老年代的GC扫描频次会降低,消亡率就降低了;
老年代某个对象是垃圾对象了,进行标记整理法清除;
5)特殊情况:对象非常大,直接进入老年代区;原因是大对象进行复制算法成本高,其次大对象也不多;


总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!
文章来源地址https://www.toymoban.com/news/detail-588259.html

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

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

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

相关文章

  • 【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基础(3)——JVM垃圾回收机制

    作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO 联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬 学习必须往深处挖,挖的越深,基础越扎实! 阶段1、深入多线程 阶段2、深入多线程设计模式 阶段3、深入juc源码解析

    2024年01月25日
    浏览(34)
  • JVM——类加载和垃圾回收

    目录 前言 JVM简介 JVM内存区域划分 JVM的类加载机制 1.加载 双亲委派模型 2.验证 验证选项 3.准备 4.解析 5.初始化 触发类加载 JVM的垃圾回收策略 GC 一:找     谁是垃圾  1.引用计数 2.可达性分析  (这个方案是Java采取的方案)。 二:释放垃圾对象 三种典型的策略 JVM实现思

    2024年02月16日
    浏览(26)
  • 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

领红包