JVM、JDK、JRE三者的区别?
-
JVM(Java Virtual Machine):虚拟机 ,源文件.java在虚拟机中通过编译器编译成字节码文件.class,是整个java实现跨平台的最核心的部分
-
JRE(java Runtime Environment):即java运行环境,作用是运行别人写好的程序(JRE并不是一个开发环境,所以没有包含任何开发工具(如编译器和调试器),只是针对于使用Java程序的用户。)
-
JDK(Java Development Kit):开发工具即很多开发时使用到的工具如javac.exe编译工具和java.exe执行工具。我们可以到JDK目录下的bin目录下找到它,它的名称为:javac.exe
-
三者的关系是JDK包含 JRE包含 JVM,Java运行步骤:源码—>javac编译器—>字节码文件—Java解释器—>机器码文件
-
JVM的作用是将字节码文件解释为机器码文件
-
源码通过javac编译器转化为字节码文件,字节码文件是一样的。不一样的是 JVM,针对不同的系统有不同的 JVM实现
JVM作用?
- 运行并管理Java源码文件,所生成的class文件
- 在不同的操作系统上,安装不同的JVM,从而去实现跨平台的保障
JVM特性
-
移植性
实际上,由于Java和OpenJDK项目的开源,我们正在看到越来越多的平台的衍生,因此JVM的移植性也将越来越棒。
-
成熟
JVM已有超过15年的历史,在过去的这些年里,许多开发者为它做出了许多贡献,使得它的性能一次又一次地提升,让JVM变得更加稳定、快速和广泛。
-
覆盖性
JVM已不再是Java一个人定制规则。JVM正在构建成为类如JRuby等项目的优良平台。
JVM结构体系
程序计数器
程序计数器是一块较小的内存区域,作用可以看作是当前线程执行的字节码的位置指示器。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的。分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖于这个计算器来完成。
方法区
与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
Java栈
栈也叫栈内存,主管 Java 程序的运行,是在线程创建时创建,它的生命周期是跟随线程的声明周期,线程结束栈内存也就释放了,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就 Over,生命周期和线程一致,是线程私有的。8 种基本类型的变量 + 对象的应用变量 + 实例方法都是在函数的栈内存中分配
- 栈存储什么?
栈帧中主要保存 3 类数据:- 本地变量(Local Variables):输入参数和输出参数以及方法内的变量
- 栈操作(Operand Stack):记录出栈、入栈的操作
- 栈帧数据(Frame Data):包括类文件、方法等
Heap堆
Java中的堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆。
- 堆内存分为三个部分
- Young Generation Space 新生区 Young / New
- Tenure Generation Space 老年区 Old / Tenure
- Permanent Space 永久区 Perm