初识JVM

初识JVM

JVM,也就是Java Virtual Machine(Java虚拟机),JVM是虚构出来的计算机,它的作用是在物理计算机上模仿各种计算机功能实现的。

Java能“一次编译,到处运行”的原因就是JVM屏蔽了不同操作系统和不同硬件的差异,这样Java开发者就可以无需考虑平台差异,只需要面向JVM编程即可。


JVM的本质是一个程序,当它开始执行class文件的时候就执行class文件中的指令。
JVM上运行的是 .class 字节码文件,字节码文件是由 .java 文件经过编译器javac编译产生的,可以在JRE(JVM+Java类库)上运行。

正是由于JVM上面运行的是 .class ,所以不仅是Java,只要是能编译成 .class 的语言都可以在JVM上运行。
比如python,python可以通过编译器jython将 .py 编译为 .class ,然后在JVM上运行。
除此之外还有:kotlin, scala, clojure, groovy, jruby, ceylon, eta, haxe, fantom, rhino。

JVM的组成:堆,方法区,栈,本地方法栈,程序计数器等等。
其中方法回收堆和方法区是共享区,而栈、程序计数器和本地方法栈区是JVM的。

JVM、JRE和JDK三者的关系

JDK(Java开发工具包)包含了Java语言、JVM、Java API和Javac等工具。
JRE(Java运行时环境)包含了JVM和Java API。
也就是说:JDK包含了JRE,JRE又包含了JVM。

层级图示:

JVM的实现原理

类装载器(ClassLoader)

类装载器(ClassLoader),负责装载class文件,然后交由execution engine执行。
类装载器:启动类加载器(JVM实现的一部分)和用户自定义类加载器(Java程序的一部分)。

本地方法栈(native method stack)

本地方法栈的作用是登记native方法,然后在execution engine执行的时候加载本地方法库。

栈(stack)

又叫内存栈,栈负责java程序的运行,在线程创建的时候创建出来,在线程销毁的时候释放。

程序计数器(program counter)

是方法区中的方法字节码由引擎读取下一条指令。

方法区(method area)

是线程共享的。

堆(heap)

用于存储对象实例。
堆的内存空间需要JVM GC回收。

本地接口(native interface)

用于融合不同的编程语言。

参考

  1. wikipedia: JVM

评论