JVM模型通俗易懂概述及双亲委派机制原理

代码在JVM运行的过程大概是经过下图的这么一个过程:
在这里插入图片描述
类装载器:加载class文件,一般我们,执行了new Student() 相当于是new出了一个实例(或者说是引用)是在栈里,但具体的人的信息比如Student里面的类的每个属性(如name=“小明”,age=18等等这类信息)的值都是在堆中,我们在是调用栈里的引用,然后引用再去堆中调用到的具体信息啦~

一般我们通常说到的JVM优化都是在方法区和堆区进行的~,且GC的垃圾回收只会在这两个里面存在(类的信息存储都在堆中),栈里不存在垃圾回收。

下面图是讲到类加载器加载类的过程是怎么样的,还有双亲委派机制是怎么样的一个过程~~
在这里插入图片描述
类加载器的一个正反向的过程
这里可以看到,我们平时写的代码 Car car1= new Car()就是一个创建对象实例的过程,然后我们可以创建多个实例,这里的实例每个对应的hashCode都是不一样的,都不是一个东西,但是反过来每一个实例去调用它的getClass()方法,打印出来的Class car这个模板他们的hashcode都是相同的,这就证明的我们的实例都是根据Class模板去创建的,就比如,我们都是人(这里的人意指的是Class模板),但是我们每个人的名字都不一样是不同名字不同基因的人(这里意指的是每个实例)可以这样去理解它。

双亲委派机制
就是指的是我们程序类进行加载的时候我们都会先去进行一个反射的过程,从getClass()->getClassLoader()->getClassLoader().getParent()…等等往上去获取类加载器,到达最顶的根加载器(根加载器也是启动类加载器 一个意思),然后在从顶上开始获取类的加载,如果顶上的类的加载器找不到类加载就会开始往下找子类的类加载器,直到找到对应的加载器去加载这个类这样的一个过程。(加载器的顶层关系由高到低:Boot(根加载器)->Exc(扩展类加载器)->App(应用类加载器))
简单的说:
1.类加载器收到加载类的请求
2.将这个请求向上委托给父类加载器去完成,一直向上直到启动类(根)加载器
3.启动(根)类加载器检查是否能够加载这个类,可以加载就直接使用当前的加载器加载,如果没法加载,就会抛出异常通知子加载器进行加载
4.重复3这个步骤直至可以加载,如果最后还是没加载到会报我们常见的错:class not found 找不到类。

总结:这就是双亲委派的一个类加载的过程,加载器的关系是这样的一个关系(由低到高):App(应用程序类加载器)->Exc(扩展类加载器)->Boot(启动(根)加载器)我们自己写的代码一般就是在应用程序类加载器里加载就能找到,JDK里的一些类的话一般就在启动(根)加载器里找到

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值