思维导图

JVM

前排友情提示 : 周志明的那本深入理解JVM去年已经出第3版了,主要更新了GC工作的详细过程,包括"三色标记法"等.

什么是JVM

JVM是Java Virtual Machine(Java虚拟机)的缩写,包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域。 JVM屏蔽了与具体操作系统平台相关的信息,使Java程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,实际上最终还是把字节码解释成具体平台上的机器指令执行。

JRE/JDK/JVM是什么关系

JRE(JavaRuntimeEnvironment,Java运行环境),也就是Java平台。所有的Java 程序都要在JRE下才能运行。普通用户只需要运行已开发好的java程序,安装JRE即可。

**JDK(Java Development Kit)**是程序开发者用来来编译、调试java程序用的开发工具包。JDK的工具也是Java程序,也需要JRE才能运行。为了保持JDK的独立性和完整性,在JDK的安装过程中,JRE也是 安装的一部分。所以,在JDK的安装目录下有一个名为jre的目录,用于存放JRE文件.Oracle并不是唯一提供JDK的公司,此外流行的还有开源的OpenJDK.

关系图

在上面这张图中,java文件经过JDK里的编译器编译成class文件,然后JIT将字节码翻译成不同平台的机器码来运行.

为什么要了解JVM

学习JVM主要关注点在于解决两个问题:

  • StackOverflowError
  • OutOfMemoryError

也就是我们常讲的栈溢出和内存溢出.

初学者往往会忽略程序使用的内存空间是有限的,因为入门时写的demo程序并不会引发这种问题.

不过在真正的线上环境下,如果你的项目访问量大,需要处理的数据多,假如程序编写得不够好,或者JVM参数不够合理,很可能会频繁出现OOM引起的full gc,这时候排查问题就得依靠我们对JVM的理解了.

内存模型