1.什么是JVM
JVM是一个想象中的机器,在实际的计算机上通过软件模拟来实现。JVM有自己想象中的硬件,如:处理器、堆栈、寄存器等,还具有相应的指令系统。
2. 为什么要使用JVM
Java语言的一个非常重要的特点就是平台无关性。而使用JVM是实现这一特点的关键。一般的高级语言如果要在不同的平台上运行,至少需要编译成不同的目标代码。而引入JVM后,Java语言在不同平台上运行时不需要重新编译。Java语言使用JVM屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在JVM虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM在执行字节码时,把字节码解释成具体平台上的机器指令执行。
3. JVM工作原理
JVM 主要由 ClassLoader 和 执行引擎 两子系统 组成,运行数据区分为五个部分: 方法区、堆、栈、程序计数器、本地方法栈。其中的方法区和堆是所有线程共享的,JVM将临时变量放在栈中,每个线程都有自己独立的栈空间和程序计数器。
任何一个Java类的main函数运行都会创建一个JVM实例,当main函数结束时,JVM实例也就结束了。JVM实例启动时默认启动几个守护线程,比如:垃圾回收的线程,而 main 方法的执行是在一个单独的非守护线程中执行的。只要母线程结束,子线程就自动销毁,只要非守护main 线程结束JVM实例就销毁了。
那么在Java类main函数运行过程中,JVM的工作原理如下:
(1) 根据系统环境变量,创建装载JVM的环境与配置;
(2) 寻找JRE目录,寻找jvm.dll,并装载jvm.dll;
(3) 根据JVM的参数配置,如:内存参数,初始化jvm实例;
(4) JVM实例产生一个引导类加载器实例(Bootstrap Loader),加载Java核心库,然后引导类加载器自动加载扩展类加载器(Extended Loader),加载Java扩展库,最后扩展类加载器自动加载系统类加载器(AppClass Loader),加载当前的Java类;
(5) 当前Java类加载至内存后,会经过验证、准备、解析三步,将Java类中的类型信息、属性信息、常量池存放在方法区内存中,方法指令直接保存到栈内存中,如:main函数;
(6) 执行引擎开始执行栈内存中指令,由于main函数是静态方法,所以不需要传入实例,在类加载完毕之后,直接执行main方法指令;
(7) main函数执行主线程结束,随之守护线程销毁,最后JVM实例被销毁;