初识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)
用于融合不同的编程语言。