JVM原理(一)------基本原理

JVM原理(一)------基本原理

前言

     JVM一直是java知识里面进阶阶段的重要部分,如果希望在java领域有更深入的的研究,那么JVM则是无论如何也规避不开的话题。

运行流程

     我们知道java一直宣称异常编译,到处运行,那么它是如何实现的呢?我们看下图:
在这里插入图片描述
     Java经过一次编译之后,将java代码编译成字节码,也就是.class文件,然后在不同的操作系统上依靠不同的java虚拟机进行解释。最后再转换为不同平台的机器码,最终得到执行结果。
那么了解基本原理后,我们尝试去做更深入的研究,一个普通的java程序它的执行流程到底是怎么样的呢?例如我们写了一段这样的代码:
     public class HellWorld {
    public static void main(String[] args){
      System.out.print(“Hello world”);
    }
  }
     这段程序从编译到运行,最终打印出“Hello world”中间经过哪些步骤呢?我们来看下图:
在这里插入图片描述

     Java代码经过编译之后生成字节码文件(.class),通过java HelloWorld执行,此时java根据系统的版本找到jvm.cfg,然后找到对应的jvm.dll,jvm.dll则是java虚拟机的主要实现,接下来初始化jvm,并且获得JNI接口,什么是JNI接口,就是java本地接口;通过JNI接口找到class文件后并装载进jvm中,找到main方法,最后执行。

JVM基本结构

     可能通过上面的描述,大家对jvm运行流程有了一个粗略的认识,那么jvm内部到底是怎么执行一个class文件的呢,也就是上图中最后一步第6步的内部细节是怎样的呢?要了解这个问题,我们首先的看一下jvm内部结构:
在这里插入图片描述
     从这个结构不难看出,class文件被jvm装载后,经过jvm的内存空间调配,最终是由执行引擎完成class执行,当然这个过程还有其他角色模块的协助,这些模块协同配合才能让一个java程序成功运行,下面来详细介绍这些模块,他们也是最后面学习jvm最重要的部分。

内存空间

     1.jvm内存空间包含:方法区、java堆、java栈、本地方法栈。
     2.方法区是各个线程共享的区域,存放类信息、常量、静态变量。
     3.Java堆也是各个线程共享区域,存放类的实例,是jvm垃圾回收器的主要工作区域;因此java堆也是java应用程序中最大的一块内存空间。如果java堆空间不足,程序就会抛出outOfMemoryError异常。
     4.Java栈是每个线程私有的区域,它的生命周期与线程相同,一个线程对应一个java栈,每执行一个方法就会往栈中压入一个元素,这个元素叫“栈帧”,而栈帧中包括方法中的局部变量,用于存放中间状态值的操作栈。如果java栈空间不足,程序会抛出Stack OverflowError异常,想一下什么情况下回容易产生这个错误,对,递归,递归如果深度很深,就会执行大量的方法,方法越多java栈的占用空间越大。
     5.本地方法栈角色跟java栈类似,只不过它是用来表示执行本地方法的,本地方法栈存放的方法调用本地方法库,实现与操作系统、硬件交互的目的。
     6.PC寄存器,说到这里我们的类已经加载了,实例对象、方法、静态变量都去了自己该去的地方,那么问题来了,程序该怎么之心,哪个方法先执行,哪个方法后执行,这些指令执行的顺序就是PC寄存器在管,它的作用就是控制程序指令的执行顺序。
     7.执行引擎就是根据PC寄存器调配指令顺序,一次执行程序指令。

结语

     Java源文件----》class文件----》类加载子系统----》内存空间

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值