JVM的基本原理
创始人
2025-05-30 00:55:40
0

JVM的基本原理

文章目录

  • JVM的基本原理
    • 一.JVM主要流程--类加载机制
      • 1.1 类加载是干什么的?
      • 1.2类加载的大体过程
      • 1.3何时加载类?
      • 1.4重点理解:双亲委派模型
    • 二.GC垃圾回收机制
      • 2.1GC主要回收的内存区域是什么?
      • 2.2 GC回收什么样的区域
      • 2.3怎么寻找堆区中的垃圾:
      • 2.4具体怎么回收
    • 三 .总结

一.JVM主要流程–类加载机制

1.1 类加载是干什么的?

java程序在运行之前需要将class文件编译成.class文件(二进制字节码文件),运行的时候,jvm就会读取相应的class文件,并且解析出内容,在内存中构造出类对象并进行初始化.

类对象是干什么的了,简单来讲他是描述了一个类具体长什么样子的;具体来说他描述了这个类有哪些属性(名字,类型,权限修饰符),有哪些方法(名字,参数类型与个数,返回值);同时还描述了这个类继承了哪个类,实现了哪一些接口等,类对象也是创建实例的基本工具;

1.2类加载的大体过程

加载:找到.class文件,读取文件内容,并且按照.class文件的方式解析.

验证:检查.class文件的内容是否符合要求.

准备阶段:主要做的是静态变量的内存分配.

解析:初始化字符串常量,将符号引用替换为直接应用.

初始化:针对类进行初始化,初始化静态成员,执行静态代码块,加载父类…

1.3何时加载类?

对于什么时候类加载的这个问题,统一的回答是什么时候用什么时候加载,类似于懒汉模式.并且只加载一次.

  • 创建这个类的实例的时候.
  • 使用这个类的静态实例,静态方法
  • 使用了这个类的子类(加载子类会触发类的加载,参照1.2)

1.4重点理解:双亲委派模型

要了解双亲委派模型,我么首先去了解什么是类加载器,以及有什么类加载器.

类加载就是JVM加载类,是有ClassLoader这样的模块来组成.

Jvm带了多个类加载器,我们也可以自己去实现类加载器.

  • BootStrap :负责加载标准库中的类
  • Extension :负责加载JVM扩展的类,及时java语言规范里面没有写出来的,但是jvm已经实现了的.
  • Application:负责加载咋们项目里面的类加载器.

而什么是双亲委派模型了,就是描述上述类加载器的协作过程,就是双亲委派模型.

具体协作过程:

  1. 那么上述三个类加载器存在父子关系.
  2. 首先会从Application这一级进行加载,但是Application不会一上来就访问自己锁管理的目录,而是委派给父亲,同理,extension也会重复相同的行为,直至没有父亲位置,看到这里如果对一种思想明白的同学可能就会顿悟了,这不就是个类似递归的流程吗,可以这么说,但也不是完全类似的,递归是一层层递进,然后一层层返回的,也就是说他会回到最开始递归的函数中去,二双亲委派模型这里如果最顶层的Bootstrap找到了相对应的全限定类名,那么就不会再回来了,如果没有找到,才会继续交给儿子去处理,如果最终都没有找到,就会抛出异常了.

二.GC垃圾回收机制

简单来说哟,程序员只需要申请内存,释放内存的操作交给Jvm去执行,jvm会自动对当前内存进行判断,是否需要释放,并自动进行释放.但是这个方案的使用也会造成额外的空间加时间的消耗.空间上会消耗cpu和内存资源,在空间上,GC有个最大的问题.

STW问题:反应在用户这里就是明显的卡顿.但是一般认为程序的开发效率>运行效率.所以GC垃圾回收机制任然适用.

2.1GC主要回收的内存区域是什么?

要了解这个问题,我么首先的去知道JVM内存区域分为什么部分;

  • 程序计数器:这一块区域是固定的内存空间,不必回收.
  • 栈:释放实际确定,不必回收.
  • 方法区:类对象,加载之后也不需要回收.

所以可以看出来,GC主要释放的堆上的对象.

2.2 GC回收什么样的区域

GC回收的最小单元是对象.对于堆上的内存回收策略是:

image-20230317193017865

也就是说,只用完全不会使用的对象,GC才会回收相应的内存空间.

2.3怎么寻找堆区中的垃圾:

如果一个对象不再使用了,就说明是垃圾了,在Java中,需要凭借引用.假设一个对象没有任何的引用能够指向他了,这个对象自认也就不会被使用了.举个简单的例子,对象的引用就好像是钥匙.堆区的对象就好像是房子,没有了钥匙,自然房子也就不能是用来了,就需要物业给回收掉(当时也完全可以把锁个撬了).

最关键的要点就是:通过对象的引用来判断当前对象是否被使用了.没有引用了就视为无法被使用了

那么怎么判断一个对象是否有引用了:

引用计数(python,php):给每个对象都加上一个 计数器,表示当前这个对象有多少个引用;客观分析:优势:实现简单,执行效率高;缺点:空间利用率低;可能出现循环引用.

image-20230317200430260

可达性分析(java):约定一些变量,称为GC ROOTS;每隔一段时间,从GC ROOTS 开始遍历,看看当前变量是否能够访问到;能被访问到就是可达的,反之不可达的.

  1. 栈上的变量;
  2. 常量池应用的对象;
  3. 方法区:应用类型的变量;

2.4具体怎么回收

1.标记清除

​ 标记处垃圾之后,直接把对象对应的内存空间回收了;优点:简单粗暴;缺点:会导致内存碎片,从而导致空间利用率低;

2.复制算法

依靠另一块与原空间相同大小的空间,在回收的时候,将原空间中的"非垃圾"对象复制到另一侧空间,然后将原空间整体释放,这样就解决了内存碎片问题;缺点:这样的空间利用率更低,因为用一半内存,另一半只起到了一个复制的作用.

3.标记整理

熟悉熟悉表删除操作理解起来非常简单;是一个搬运的过程;优点;相对于标记清除来说,它解决了内存空间问题,相对于复制算法来说,它解决了空间利用率低的问题,但是他的操作比较耗时;

4.分代回收

在前三种的回收算法上,感觉都差点意思,那么JVM采用的分代回收,就很好的整合了后两种算法;上图:

image-20230318105009408

其中,在新生代执行的算法是复制算法,在老年代的回收算法是标记整理算法.

三 .总结

以上的都是理论,JVM具体有很多的垃圾回收器,比如CMS,G1,ZGC,学友余力之时在做进一步的了解吧.

相关内容

热门资讯

springboot简介和项目... Java知识点总结:想看的可以从这里进入 目录SpringBoot1、简介和原理1....
最新或2023(历届)嘉祥教育... 信息时报讯 面临中考,初三学生陈黎的父母十分发愁。一是孩子成绩并不拔尖,另外,父母虽然有心让儿子出...
“牛孩儿”“每天一题”助你提升... “小升初”的战鼓越擂越响,你准备好了吗?不要着急,自4月29日起,中原网教育频道官方微信“中原教育”...
这是一封发给西安小升初家长的邀... 秦学·伊顿交大校区4月9日晚上举办的小升初讲座圆满结束了,回顾讲座现场的瞬间,小编有一些小小的感动。...
四大法宝护航“528冲刺班”巨... 又是一个四月,春风扑面,鲜花盛开。又是一届小考,竞争激烈,埋头伏案。又是一轮冲刺,全力以赴,舍我其谁...
小升初数学面谈题型归纳 小升初... 数学在小升初择校中的重要性可以说是毋庸置疑的。很多一线名校例如二中应元、六中珠江、广大附等都对数学情...
vue2+3 pinia v... 1. 为什么要学习vue1.官网https://v3.cn.vuejs.org/guide/migr...
防雷设计、防雷检测为什么选同为... 随着现代科技的不断发展,电子设备得到广泛应用,而雷电等自然灾害也越来越频...
最新或2023(历届)快乐的下...  今天下午,我去了隋唐遗址。那里好美丽;有小河;有草地,小河里有鱼,有虾。  我先说河,有的河水清澈...
最新或2023(历届)6年级数...  篇一  今天,妈妈给我出了一道题,题目是这样的:“一头牛可换6头猪,2头猪可换10只羊,三只羊可换...
本次小升初直升考试试卷分析这就... 还记得前几天预告的小升初直升考试吗?这次的考试对于小学六年级的孩子们来说,是非常重要的。家长朋友们也...
西安小升初528预录来了! 西... 相信大家这几天除了被各种各样的学校参观弄得有点晕,到底这参观是几个意思呢!是有暗示还是没暗示,其实这...
最新或2023(历届)认真积极...   今天妈妈带我去学英语,上课我认真听盘,积极的举手回答问题,下课后妈妈表扬了我,我很高兴。回到家我...
【js】多分支语句练习(2) 个人名片: 😊作者简介:一名大一在校生,w...
Git 的 Cherry-Pi... 1、什么是 Cherry-Pickcherry-pick 是 Git 版本控制工具中的一个命令&#x...
最新或2023(历届)观察日记...  1.  7月23日星期一  今天我从东北回来了,我迫不急待的去看我出发前种下的含羞草种子,都十天了...
多线程进阶学习01------... 开篇:为什么学习多线程 实事求是地讲,对于绝大多数研发人员,...
最新或2023(历届)观察日记...  1.  有一天,我和好朋友们到小河边捉鱼摸虾。忽然发现,阴天的时候小鱼都跳到半空中。这是为什么呢?...
最新或2023(历届)小学数学...   1.  果园里的苹果树是梨树的3倍,老王师傅每天给50棵苹果树20棵梨树施肥,几天后,梨树全部施...
最新或2023(历届)4年级数...  1.  今天上午,我按照爸爸让我写的“假期计划”,开始了复习数学、练习数学、加强数学的“启动仪式”...