首先问一个问题,jvm、jdk、jre三者的区别?再去谈其他的
三者的关系是JDK包含JRE包含JVM,Java运行步骤:源码—>javac编译器—>字节码文件—Java解释器—>机器码文件。
jvm的作用是将字节码文件解释为机器码文件。
源码通过javac编译器转化为字节码文件,字节码文件是一样的。不一样的是jvm,针对不同的系统有不同的 jvm 实现。
JVM的全称是叫Java虚拟机,看下面一张图

从这张图中看出,JVM所处的位置以及他有两个作用。
第一个作用:运行并管理Java源码文件,所生成的class文件;
第二个作用:在不同的操作系统上,安装不同的JVM,从而去实现跨平台的保障
JVM是运行在操作系统上的

解释名词
程序计数器
程序计数器是一块较小的内存区域,作用可以看作是当前线程执行的字节码的位置指示器。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的.分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖于这个计算器来完成。
方法区
与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。
Java 栈
栈也叫栈内存,主管 Java 程序的运行,是在线程创建时创建,它的生命周期是跟随线程的声明周期,线程结束栈内存也就释放了,对于栈来说不存在垃圾回收问题,只要线程一结束该栈就 Over,生命周期和线程一致,是线程私有的。8 种基本类型的变量 + 对象的应用变量 + 实例方法都是在函数的栈内存中分配
栈存储什么?
栈帧中主要保存 3 类数据:
Heap 堆
Java中的堆是用来存储对象本身的以及数组(数组引用是存放在Java栈中的)。堆是被所有线程共享的,在JVM中只有一个堆
堆内存分为三个部分