面试题-谈谈你对JVM的理解

首先问一个问题,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虚拟机,看下面一张图

面试题-谈谈你对JVM的理解_第1张图片

从这张图中看出,JVM所处的位置以及他有两个作用。

第一个作用:运行并管理Java源码文件,所生成的class文件;

第二个作用:在不同的操作系统上,安装不同的JVM,从而去实现跨平台的保障

JVM是运行在操作系统上的

面试题-谈谈你对JVM的理解_第2张图片

解释名词

程序计数器

        程序计数器是一块较小的内存区域,作用可以看作是当前线程执行的字节码的位置指示器。每条线程都有一个独立的的程序计数器,各线程间的计数器互不影响,因此该区域是线程私有的.分支、循环、跳转、异常处理和线程恢复等基础功能都需要依赖于这个计算器来完成。

方法区

        与堆一样,是被线程共享的区域。在方法区中,存储了每个类的信息(包括类的名称、方法信息、字段信息)、静态变量、常量以及编译器编译后的代码等。

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

你可能感兴趣的:(java)