JVM内存模型
JVM内存模型
框架图:
JVM包含两个子系统和两个组件,两个子系统为Class loader(类装载)、 Execution engine(执行引擎);两个组件为Runtime data area(运行时数据 区)、Native Interface(本地接口)。
- Class loader(类装载):根据给定的全限定名类名(如: java.lang.Object)来装载class文件到Runtime data area中的method area。
- Execution engine(执行引擎):执行classes中的指令。
- Native Interface(本地接口):与native libraries交互,是其它编程语 言交互的接口。
- Runtime data area(运行时数据区域):这就是我们常说的JVM的内 存。
类加载过程
过程:
面试拓展:
知道哪些类加载器?
JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他类加载器均由 Java 实现且
全部继承⾃ java.lang.classLoader :
- ClassLoader(启动类加载器) :最顶层的加载类,由C++实现,负责加载
%JAVA_HOME%/lib ⽬录下的jar包和类或者或被 -Xbootclasspath 参数指定的路径中的所
有类。 - ExtensionClassLoader(扩展类加载器) :主要负责加载⽬录 %JRE_HOME%/lib/ext ⽬录下
的jar包和类,或被 java.ext.dirs 系统变量所指定的路径下的jar包。 - AppClassLoader(应⽤程序类加载器) :⾯向我们⽤户的加载器,负责加载当前应⽤classpath下
的所有jar包和类。
双亲委派
双亲委派
运行时数据区
Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个 不同的数据区域。**这些区域都有各自的用途,以及创建和销毁的时间,有些区域 随着虚拟机进程的启动而存在,有些区域则是依赖线程的启动和结束而建立和销 毁。Java 虚拟机所管理的内存被划分为如下几个区域:
- 程序计数器(Program Counter Register):当前线程所执行的字节码的行号 指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的 字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个 计数器来完成;
- Java 虚拟机栈(Java Virtual Machine Stacks):Java虚拟机栈不存在垃圾回收,线程结束栈over保存栈针,保存8大变量+对象引用+实例方法; 下图为虚拟机栈中内容。
- 本地方法栈(Native Method Stack):与虚拟机栈的作用是一样的,只不过虚 拟机栈是服务Java 方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;
- Java 堆(Java Heap):Java 虚拟机中内存大的一块,是被所有线程共享的,存放类、方法与常量。分为三个部分新生区、老年区以及永久区(1.8后改为元空间),GC主要发生在新生区以及老年区;
- 方法区(Methed Area):用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译后的代码等数据。
面试拓展:
Java虚拟机栈、本地方法栈、程序计数器是线程私有。
OMM问题:内存满了。解决措施扩大JVM内存,如还出现OOM则说明代码有问题,分析内存。
本地方法栈中native关键字(联系volatile关键字的调用),凡是带了Java关键字的,说明java范围达不到,进入本地方法栈,调用本地方法库,拓展C++使用,融合不同的语言,JIN(本地方法接口)。
例如:
对象
对象的创建、分配内存、定位
执行引擎
垃圾回收器(GC)
垃圾回收
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。