Appearance
JDK、JRE、JVM的区别与联系
JDK:
INFO
java development kit, java开发工具包,针对开发者,里面主要包含了jre, jvm, jdk源码包,以及bin文件夹下用于开发,编译运行的一些指令器。
JRE:
INFO
java runtime environment, java运行时环境,针对java用户,也就是拥有可运行的.class文件包(jar或者war)的用户。里面主要包含了jvm和java运行时基本类库(rt.jar)。rt.jar可以简单粗暴地理解为:它就是java源码编译成的jar包(解压出来看一下),用eclipse开发时,当你ctrl点击发现不能跳转到源文件时,需要把rt.jar对应的源码包加进来,而这里的源码包正是jdk文件夹下的src.zip。
JVM:
INFO
就是我们常说的java虚拟机,它是整个java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件,这种类文件可以在虚拟机上执行。
也就是说class并不直接与机器的操作系统相对应,而是经过虚拟机间接与操作系统交互,由虚拟机将程序解释给本地系统执行。
只有JVM还不能成class的执行,因为在解释class的时候JVM需要调用解释所需要的类库lib,而jre包含lib类库。
JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。
JDK和JRE区别:
去bin文件夹下你会发现,JDK有javac.exe而JRE里面没有,众所周知javac指令是用来将java文件编译成class文件的,这是你开发去做的事,用户是不会去做的。JDK还有jar.exe, javadoc.exe等等用于开发的可执行指令文件。这也证实了一个是开发环境,一个是运行环境。
JRE和JVM区别:
有些人觉得,JVM就可以执行class了,其实不然,JVM执行.class还需要JRE下的lib类库的支持,尤其是rt.jar。

说说JVM运行时数据区
JVM(Java虚拟机)运行时数据区是指Java虚拟机在执行Java程序时用于存储和管理数据的内存区域。JVM运行时数据区包括以下几个主要部分:

- 堆(Heap):堆是Java虚拟机中最大的内存区域,用于存储Java对象。堆内存由所有线程共享。堆中的对象可以被垃圾回收器自动回收,以释放内存空间。
- 方法区(Method Area):方法区用于存储已被加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区的内存回收目标主要针对常量池的回收和对类型的卸载。
- Java栈(Java Stack):Java栈是每个线程私有的内存区域,用于存储线程执行过程中的局部变量、操作数栈、动态链接和方法出口等信息。每个方法调用都会在Java栈中创建一个栈帧,方法调用结束时,栈帧会被销毁。
- 本地方法栈(Native Method Stack):本地方法栈与Java栈类似,也是每个线程私有的内存区域。它用于支持native方法的执行。
- 程序计数器(Program Counter Register):程序计数器是一块较小的内存空间,用于存储当前线程所执行的字节码指令的行号。它是线程私有的,用于控制线程的执行顺序。