初入java虚拟机JVM
jvm简介
学习java的小伙伴们都知道,java程序是运行在java虚拟机上的(也就是JVM),那到底什么是JVM呢?Java虚拟机本质上就是一个程序,当它在命令行上启动的时候,就开始执行保存在某字节码文件中的指令。Java语言的可移植性正是建立在Java虚拟机的基础上。任何平台只要装有针对于该平台的Java虚拟机,字节码文件(.class)就可以在该平台上运行。这就是“一次编译,多次运行”。让我们现在一起来了解一下java程序运行到jvm的步骤吧
图示:java文件运行在JVM简单过程
 由上图可以得知java文件经过编译器编译后生成字节码文件后,通过jvm运行字节码文件,并不是通常以为的java代码直接运行在java虚拟机上面。
初步了解了java文件是如何运行在java虚拟机上面后,接下来该了解JVM的组成部分了,就好比我们知道电脑是由CUP、显卡、内存条等等组成的,那么神秘的JVM究竟是由哪些组成的呢?
JVM的整体架构
图示:java文件运行在JVM简单过程
JVM主要由类加载子系统与运行时数据区和执行引擎三大块为主。
运行时数据区又包括java栈(Java Stack)、本地方法栈(Native Method Stack)、方法区(Method Area)、堆(Heap)、程序计数器(program Counter Register)
-
类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)。
-
java堆在虚拟机启动的时候建立,它是java程序最主要的内存工作区域。几乎所有的java对象实例都存放在java堆中。堆空间是所有线程共享的,这是一块与java应用密切相关的内存空间。
-
每一个java虚拟机线程都有一个私有的java栈,一个线程的java栈在线程创建的时候被创建,java栈中保存着帧信息,java栈中保存着局部变量、方法参数,同时和java方法的调用、返回密切相关。
-
本地方法栈和java栈非常类似,最大的不同在于java栈用于方法的调用,而本地方法栈则用于本地方法的调用,作为对java虚拟机的重要扩展,java虚拟机允许java直接调用本地方法(通常使用C语言编写)
-
程序计数器也是每一个线程私有的空间,java虚拟机会为每一个java线程创建PC寄存器。在任意时刻,一个java线程总是在执行一个方法,这个正在被执行的方法称为当前方法。如果当前方法不是本地方法,PC寄存器就会指向当前正在被执行的指令。如果当前方法是本地方法,那么PC寄存器的值就是undefined
-
方法区是可供各线程共享的运行时内存区域,方法区里面存储了类的元数据信息、静态变量、即时编译器编译后的代码
-
执行引擎是java虚拟机的最核心组件之一,它负责执行虚拟机的字节码,现代虚拟机为了提高执行效率,会使用即时编译技术将方法编译成机器码后再执行。
Say Bye!!!!