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 的内部组成分为以下两大块,堆内内存(线程共享的)和栈内内存(线程私有的),其中堆内内存为堆和方法区,栈内内存分为程序计数器,虚拟机栈,本地方法栈.下面就来详细叙述 5个部分的详细内容.
堆堆是 JVM 内存中最大的一块,其主要作用是存储生成的对象实例和数组,同时为了高效地使用 JVM 的 GC 机制,堆内又详细分为了以下模块.
新生代:存储新生成的对象和尚未进入老年代的对象,内部由 Eden Space 和两块相同大小的 Survior Space 组成(这种构成机制是为了 JVM的垃圾回收,待日后再详细叙说)
老年代:存储经过多次 GC 依然存活的对象,也会存储大对象,直接进入老年代.
方法区方法区用于存储 JVM 加载的类信息,常量和静态变量.
其中还有一项是运行时常量池,其对应的是内存池加载到内存之后的内容,存储字面量和编译器生成的符号引用.
符号引用是一组无歧义定位到目标的符号,只包含语义信息,不包含具体实现
直接引用一般是指 1. 直接指向目标的指针 2. 相对偏移量 3. 间接定位目标的引用
指示当前字节码执行的行数,用于解释器读取需要执行的字节码位置,在分支,循环,异常处理,线程恢复等功能中都依赖程序计数器来完成.
虚拟机栈对应方法执行的内存模型,每个方法执行中会创建一个「栈帧」,其中存储了局部变量表(方法参数,出口等信息),一个方法执行的过程就对应了栈帧从入栈到出栈的过程.
局部变量表中存储的是基本类型和对象的引用,在编译时就已经确定了大小,运行时不会改变.
本地方法栈与虚拟机栈类似,区别为虚拟机栈为 Java 方法服务,本地方法栈为 Native 方法服务.
参考资料JDK,JRE,JVM介绍
Java虚拟机内存组成以及堆内存介绍
符号引用和直接引用