JVM内存结构

JVM 是什么?其内部由什么组成,每一个组成部分又有什么特性?

JDK,JRE,JVM的关系

JDK 为 Java开发工具包(Java Development kit),其包含了 JRE 和 Java开发工具(javac等),一般用于开发者使用.

JRE 为 Java运行时环境(Java Runtime Environment),其包含了 JVM 和 Java 核心类库(rt.jar等),普通用户安装了 JRE,就可以运行 Java 程序.

JVM 为 Java 虚拟机(Java Virtural Mechine),其功能为将字节码转换为特定机器上的机器码.「用于 Java 语言的跨平台特性」

JVM 内存组成

JVM 内存组成

JVM 的内部组成分为以下两大块,堆内内存(线程共享的)和栈内内存(线程私有的),其中堆内内存为堆和方法区,栈内内存分为程序计数器,虚拟机栈,本地方法栈.下面就来详细叙述 5个部分的详细内容.

堆是 JVM 内存中最大的一块,其主要作用是存储生成的对象实例和数组,同时为了高效地使用 JVM 的 GC 机制,堆内又详细分为了以下模块.

堆组成

新生代:存储新生成的对象和尚未进入老年代的对象,内部由 Eden Space 和两块相同大小的 Survior Space 组成(这种构成机制是为了 JVM的垃圾回收,待日后再详细叙说)

老年代:存储经过多次 GC 依然存活的对象,也会存储大对象,直接进入老年代.

方法区

方法区用于存储 JVM 加载的类信息,常量和静态变量.

其中还有一项是运行时常量池,其对应的是内存池加载到内存之后的内容,存储字面量和编译器生成的符号引用.

符号引用是一组无歧义定位到目标的符号,只包含语义信息,不包含具体实现
直接引用一般是指 1. 直接指向目标的指针 2. 相对偏移量 3. 间接定位目标的引用

程序计数器

指示当前字节码执行的行数,用于解释器读取需要执行的字节码位置,在分支,循环,异常处理,线程恢复等功能中都依赖程序计数器来完成.

虚拟机栈

对应方法执行的内存模型,每个方法执行中会创建一个「栈帧」,其中存储了局部变量表(方法参数,出口等信息),一个方法执行的过程就对应了栈帧从入栈到出栈的过程.

局部变量表中存储的是基本类型和对象的引用,在编译时就已经确定了大小,运行时不会改变.

本地方法栈

与虚拟机栈类似,区别为虚拟机栈为 Java 方法服务,本地方法栈为 Native 方法服务.

参考资料

JDK,JRE,JVM介绍

Java虚拟机内存组成以及堆内存介绍

符号引用和直接引用

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpdsgs.html