在这里插入图片描述

**方法区**:存储已被虚拟机加载的类元数据信息(元空间)
**堆**:存放对象实例,几乎所有的对象实例都在这里分配内存
**虚拟机栈**:虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息
**程序计数器**:当前线程所执行的字节码的行号指示器
**本地方法栈**:本地方法栈则是为虚拟机使用到的Native方法服务。

类加载器分为四种:前三种为虚拟机自带的加载器。

- 启动类加载器(Bootstrap)C++

  负责加载$JAVA_HOME中jre/lib/**rt.jar**里所有的class,由C++实现,不是ClassLoader子类

- 扩展类加载器(Extension)Java

  负责加载java平台中**扩展功能**的一些jar包,包括$JAVA_HOME中jre/lib/*.jar或-Djava.ext.dirs指定目录下的jar包

- 应用程序类加载器(AppClassLoader)Java

  也叫系统类加载器,负责加载**classpath**中指定的jar包及目录中class

- 用户自定义加载器  Java.lang.ClassLoader的子类,用户可以定制类的加载方式

工作过程:

- 1、当AppClassLoader加载一个class时,它首先不会自己去尝试加载这个类,而是把类加载请求委派给父类加载器ExtClassLoader去完成。
- 2、当ExtClassLoader加载一个class时,它首先也不会自己去尝试加载这个类,而是把类加载请求委派给BootStrapClassLoader去完成。
- 3、如果BootStrapClassLoader加载失败(例如在$JAVA_HOME/jre/lib里未查找到该class),会使用ExtClassLoader来尝试加载;
- 4、若ExtClassLoader也加载失败,则会使用AppClassLoader来加载
- 5、如果AppClassLoader也加载失败,则会报出异常ClassNotFoundException

其实这就是所谓的双亲委派模型。简单来说:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上

好处:防止内存中出现多份同样的字节码(安全性角度)

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐