jvm的组成和jvm垃圾回收算法

jvm由哪些部分组成?
四部分组成:
类加载器:在jvm启动的时候或类运行时需要的字节码文件加载到jvm中
执行引擎:执行引擎的任务是负责执行class文件中包含的字节码指令,相当于实际机器的cpu
内存区:将内存划分为若干个区模拟实际机器的存储,记录和调度模块。
本地方法调用c或c++实现的本地调用方法的代码返回结果。

类加载器是什么?
顾名思义,就是加载java类到虚拟机中,一般来说java源程序在经过java编译之后就会转成字节码文件,类加载就负责读取java字节码文件,并转换成一个实例。通过newInstance方法就可以创建该类的对象。
java虚拟机是如何判定两个java类是相同的?
java不仅要看类的全名是否相同,还要看类加载是否相同,只有全部相同以后才认为这个两个类是相同的。即便是同样的字节码文件,被不同的类加载加载以后,java都会认为是两个不同的类。试图对这两个类的对象就行赋值,就会抛出类型转换异常。

什么是双亲委派模型?他的工作过程?为啥这么设计?
该模型要求除了顶端的启动类加载器以外,其余的类加载器都需要有自己的父类加载器,他们不是通过继承实现的,而是通过组合关系来复用父加载器的代码。每个类加载器都有自己的命名空间,在同一个命名空间中,不会出现类的完整名字相同的两个类。在不同的命名空间中可以出现类的完整名字相同的两个类。
当前类加载器先从自己的缓存中查找是否已经加载过这个类,如果有,就直接返回,如果没有就告诉父类加载器看他是否加载过,父类也采用相同的方式,如果没有就告诉父类的父类看看他有没有,直到直到顶级父类,如果顶级父类也没有,那么在放入当前类加载器中加载,并放入自己的缓存中,以便下次好直接返回。
好处就是安全性,以免用户自己编写的类替换了核心类库,第二为了重复加载,如果同一个类被不同的加载器加载过就会加载不同的两个类,相互转型的话就会出现异常。

jvm垃圾回收算法

垃圾回收主要是针对的堆内存,在程序运行的过程中会产生一系列的对象,当这些对象生命周期结束以后并不会立即释放掉,而是继续占用一定的内存。这些占用内存却不在使用的对象我们就成为垃圾。
垃圾回收算法分为四种:
**标记清除:**分为两步一步标记,一步清除,先遍历所有的对象,然后对活动的对象打上标记,然后再次遍历对象,清除没有打上标记的对象。

*优点:*算法简单,实现简单。
缺点:这样清理的话,就会剩下好多不连续的内存空间,在极端情况下会造成新加载的类没有足够的内存空间来承载。

**引用计数:**对任意一个对象都采用计数的方式,引用一次就+1,结束引用就-1,。一旦计数器归0,那么这个对象就会被清理掉。
缺点:占用一定的计算机资源,得为每一个对象都创建一个计数器,计算器的上限要大于对象引用的次数,也是不小的开销,实现复杂,一旦A引用B,B引用A就会导入内存泄漏。

**复制算法:**将内存分为两个区域,一个是from区一个是To区,对象分配时都会放到from区,复制算法分为两步,第一步就是找到活动的对象进行标记,第二步就把活动的对象全部复制到to区,,在将原有的from区全部清空,交换两个区域的职责,一次GC后,to变成from,from变成to区。

优点:不会产生断续的内存空间,分配速度快,效率快。
缺点:内存使用率低,如果一个对象递归产生自对象,还得去递归寻找他的子对象。

**分代回收:**分为伊甸园区,幸存区和老生代,是8:1:1的比例。对象刚创建的时候是放入伊甸园区,在伊甸园区经过一次扫描,如果依然存在就放在幸存区,如果经过多次扫描依然存在,就放入老生代。
扩展:
如果对象创建之后伊甸园区放不开,就会触发一次初代回收,如果在放不开,在触发一次。如果还放不开就会放入老生代,如果老生代也放不开就会触发完全回收,在放入新生代,如果还放不下就在触发初代回收,如果在失败就放入老生代,如果老生代放不下就触发完全回收,在放入新生代,失败放入老生代,在失败就抛出内存溢出异常。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值