【JVM】Java虚拟机运行流程

本文介绍了JavaVirtualMachine(JVM)的概念、运行流程,重点讲解了JVM的四个主要部分:类加载器、运行时数据区(包括堆、Java虚拟机栈、本地方法栈、程序计数器和方法区)、执行引擎以及本地库接口。同时阐述了JVM运行时数据区的内存结构和作用。
摘要由CSDN通过智能技术生成

1.JVM 简介

JVM 是 Java Virtual Machine 的简称,意为 Java虚拟机。

虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。

常见的虚拟机:JVM、VMwave。

JVM是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进 行了裁剪。

2.Java虚拟机 (JVM)

Java™ 虚拟机 (JVM) 是一种独立于平台的编程语言,它可将 Java 字节码转换为机器语言并执行该语言。

当您编译 Java 源代码时,会得到一个中间 Java 文件,称为 Java 类。 该类文件由表示抽象指令代码的字节码组成。 这些代码不可由任何计算机处理器直接执行。

要运行 Java 程序,需启动 JVM 并将类文件传递给 JVM。 JVM 提供许多服务,包括装入类文件和解释(执行)字节码。JVM 是提供运行 Java 应用程序的运行时环境的核心技术。

因为 JVM 是底层的处理引擎,所以最优配置 JVM 并高效地运行很关键。不正确的 JVM 设置可能会导致较差的应用程序性能或 JVM 停运。

JVM 详细垃圾回收 (GC) 统计信息至关重要,并且在生产环境中必须始终启用。这些统计信息可用于了解 JVM 堆管理的行为和 JVM 的效率。

通常,总体性能和特定最佳性能与以下条件有关:等待时间、吞吐量、可伸缩性和负载。

  • 等待时间 – 为生成对请求的响应所需的时间(速度)。
  • 吞吐量 – 指定时间段内传输的数据量(量)。
  • 可扩展性 – 系统是否能够适应增加的工作负载(额外硬件)。
  • 负载 – 系统是否能够在系统负载增加的情况下继续以最佳水平运行。

3. JVM 运行流程

JVM 是 Java 运行的基础,也是实现一次编译到处执行的关键,那么 JVM 是如何执行的呢?

程序在执行之前先要把java代码转换成字节码(class文件),JVM 首先需要把字节码通过一定的方式 类加载器(ClassLoader) 把文件加载到内存中 运行时数据区(Runtime Data Area) ,而字节码 文件是 JVM 的一套指令集规范,并不能直接交个底层操作系统去执行,因此需要特定的命令解析器 执行引擎(Execution Engine)将字节码翻译成底层系统指令再交由CPU去执行,而这个过程中需要调 用其他语言的接口 本地库接口(Native Interface) 来实现整个程序的功能,这就是这4个主要组成部分的职责与功能。

总结来看, JVM 主要通过分为以下 4 个部分,来执行 Java 程序的,它们分别是:

  1.  类加载器(ClassLoader)
  2. 运行时数据区(Runtime Data Area)
  3. 执行引擎(Execution Engine)
  4. 本地库接口(Native Interface)

4.JVM 运行时数据区

JVM 运行时数据区域也叫内存布局,但需要注意的是它和 Java 内存模型((Java Memory Model,简称 JMM)完全不同,属于完全不同的两个概念,它由以下5 大部分组成:

4.1 堆(线程共享)

堆的作用:程序中创建的所有对象都保存在堆中。存放的是new出来的对象。

我们常见的 JVM 参数设置 -Xms10m 最小启动内存是针对堆的,-Xmx10m 最大运行内存也是针对堆 的。

ms 是 memory start 简称,mx 是 memory max 的简称。

堆里面分为两个区域:新生代和老生代,新生代放新建的对象,当经过一定 GC 次数之后还存活的对象会放入老生代。

4.2 Java虚拟机栈(线程私有)

Java 虚拟机栈的生命周期和线程相同,Java 虚拟机栈描述的是 Java 方法执行的内存模型:每个方法在执行的同时都会创建一个栈帧(Stack Frame)用于存储局部变量表、操作数 栈、动态链接、方法出口等信息。常说的堆内存、栈内存中,栈内存指的就是虚拟机栈。

栈主要记录的是方法的调用关系,还有可能会出现的栈溢出的错误。

4.3 本地方法栈(线程私有)

本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用的。

工作原理和Java虚拟机栈一样,记录的是本地方法调用的关系。

4.4 程序计数器(线程私有)

程序计数器的作用:用来记录当前线程执行的行号的。

记录当前线程的方法执行到哪一行(指令)。和线程强相关的都是线程私有的。

程序计数器是一块比较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。

程序计数器内存区域是唯一一个在JVM规范中没有规定任何OOM情况的区域!

4.5 方法区(线程共享)

方法区的作用:用来存储被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据的。

方法区中存放的是类对象,可以理解为对象的模板。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值