Java虚拟机中的内存模型?
方法区:存储已被虚拟机加载的类元数据信息(元空间)堆:存放对象实例,几乎所有的对象实例都在这里分配内存虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧(Stack Frame)用于存储局部变量表、操作栈、动态链接、方法出口等信息程序计数器:当前线程所执行的字节码的行号指示器本地方法栈:本地方法栈则是为虚拟机使用到的Native方法服务。...
·
**方法区**:存储已被虚拟机加载的类元数据信息(元空间)
**堆**:存放对象实例,几乎所有的对象实例都在这里分配内存
**虚拟机栈**:虚拟机栈描述的是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
其实这就是所谓的双亲委派模型。简单来说:如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载这个类,而是把请求委托给父加载器去完成,依次向上。
好处:防止内存中出现多份同样的字节码(安全性角度)
更多推荐
已为社区贡献2条内容
所有评论(0)