经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
JVM知识(一):基础原理
来源:cnblogs  作者:MoreThinking  时间:2018/10/19 9:23:53  对本文有异议

学过java知识和技术人,都应该听说过jvm,jvm一直是java知识里面晋级阶段的重要部分,如果想要在java技术领域更深入一步,jvm是必须需要明白的知识点。

本篇来讲解jvm的基础原理,先来熟悉一下大致的流程:

JVM运行流程:

  我们都知道java一直宣传的口号:一次编译,到处运行。也是它的跨平台性。这点的具体实现如下:

  java程序在经过一次编译之后,会将java代码编译成java字节码,也就是class文件。然后在不同的机器中依靠不同的java虚拟机来解析。
最后再转换为不同平台的机器码,最终得到执行。
  这样,我们就可以大胆的推测说,如果我们要在mac系统中执行,是不是就只需要安装一个mac的java虚拟机就可以执行java程序了。

了解了这个基本原理后,那一个普通的java程序它的执行流程到底是怎样的?例如以下的代码。

  1. package helloWorld;
  2. public class HelloWorld {
  3. public static void main(String[] args) {
  4. System.out.print("hello world");
  5. }
  6. }

  这段程序从编译到运行,最终打印出“Hello world”中间经过了哪些步骤,如下图;

 

java代码通过编译之后生成字节码文件(class文件),通过 java hello world执行,此时java会根据系统的版本找到jvm.cfg,它会根据系统版本放在不同的位置,我的在E:\SVN_ROOT\UMP_PROJECT\UMP1.0.0.0\14tools\jdk1.6.0_02\jre\lib\i386
打开可以看到:

其中-server KNOWN就表示名称为server的jvm可用,此时在电脑中搜索下jvm.dll文件,会发现是在某个server目录下。
E:\SVN_ROOT\UMP_PROJECT\UMP1.0.0.0\14tools\jdk1.6.0_02\jre\bin\server
简而言之就是通过jvm.cfg文件来找到对应的jvm.dll。这个jvm.dll文件就是java虚拟机的主要实现。
接下来会初始化jvm,并且获取JNI接口。
什么是JNI接口,就是java的本地接口(java不太好实现的与硬件或者操作系统相关的方法,一般是其他语言编写的。)。
也就是说java被编译成了class文件,jvm要通过这个JNI接口从硬盘上找到这个文件并装载到jvm里面。然后找到main方法执行。

JVM 基础结构:

  在上面的例子上,我们已经知道了java程序大致的流程,但是jvm是怎么去执行class文件的,看看以下图:

 

从这个结构不难看出,class文件被jvm装载以后,经过jvm的内存空间调配,最后由执行引擎完成class文件的执行。这个过程还需要其他角色模块的配合才能完成。。

jvm的内存空间
  jvm的内存空间包括:方法区,java堆,java栈,本地方法栈。

方法区是各个线程共享的区域,存放类信息,常亮,静态变量。
java堆也是线程共享的区域,存放类的实例,如果一个系统创建了很多类实例,如果java堆空间不足,程序就会抛出OutOfMemoryError异常。因此java堆空间是最大的。
java栈是每个线程私有的区域,它的生命周期与线程相同,一个线程对应一个java栈,每执行一个方法就会往栈中压入一个元素,这个元素叫“栈帧”。
而这个栈帧中包括了方法中的局部变量,用于存放中间状态值的操作栈。如果java栈空间不足了,程序会抛出StackOverflowError异常。
本地方法栈和java栈类似,只是它用来表示执行本地方法的,本地方法栈存放的方法是调用本地方法接口,最终调用本地方法库,实现与操作系统,硬件交互的目的。
PC寄存器,其实就是控制这些类对象,方法,静态变量,他们的执行顺序。
执行引擎就是根据PC寄存器调配的指令顺序,一次执行程序指令。

结语:

本文主要介绍了java虚拟机运行的基本流程,以及java虚拟机内部结构。下一篇我们将学习java内存模型以及探索java变量的可见性、有序性、指令重排等问题。

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号