JVM虚拟机概述

2023-05-16

JVM虚拟机是一个抽象机器,提供一个可以执行Java字节码的运行环境规范,JVM可以用于许多硬件和软件平台。

JVM

  • 一、JVM是什么?
  • 二、JVM虚拟机可以做什么?
  • JVM虚拟机内部体系结构
    • 类加载器
    • 类(方法)区域
    • 堆栈
    • 程序计数器寄存器
    • 本地方法堆栈
    • 执行引擎


一、JVM是什么?

  1. 指定Java虚拟机的工作规范,实现提供程序是独立的选择算法,由Sun公司等提供。
  2. 实现被称之为JRE,Java运行环境。
  3. 运行实只要在命令提示符上编写Java命令来运行Java类,就会创建一个JVM实例。

二、JVM虚拟机可以做什么?

JVM执行以下操作:

  • 加载代码
  • 验证代码
  • 执行代码
  • 提供运行时环境

JVM提供了以下定义:

  • 内存区
  • 类文件格式
  • 寄存器集合
  • 垃圾收集GC
  • 致命错误报告等等。

JVM虚拟机内部体系结构

Java虚拟机包含了类加载器、内存区域、执行引擎等等:
在这里插入图片描述
运行JVM字节码的工作都是由解释器完成,解释执行分为三个过程:代码转入、代码校验、代码执行

  • 装入过程由类装载器Class Loader完成,类装载器负责装入运行一个程序需要的所有代码,包括程序代码的类的所有继承类和被调用类,当类装载器装入一个类时候,该类就存入自己的命名空间中。除了通过符号引用自己命名空间以外的类,类之间没有办法可以影响其他类。
  • 本台计算机的所有类都在同一个地址空间内,而所有从外部引进的类,都会有一个自己独立的名字空间,这会使得本地类通过共享相同类名字空间获得较高效率,同时保证外部引进类不会互相影响。
  • 全部装入所需类之后,解释器便可以确定整个可执行程序的内存布局,解释器为符号引用同特定的地址空间建立对应关系和查询表。通过这一阶段确定代码的内存布局,Java很好的解决了由超类改变而引起子类崩溃的问题,防止代码对地址的非法访问。
  • 最后,被装入的代码由字节码校验器验证,校验器可以发现操作数栈溢出,非法数据类型转换等等多种错误,通过校验之后,就可以开始执行。

类加载器

ClassLoader是JVM的一个子系统,用于加载类文件。

类(方法)区域

类方法区域存储每一个类结构,例如运行时的常量池,、字段和方法数据、方法代码等等。

这个是分配对象的运行时数据区。

堆栈

Java堆栈存储帧,它负责保存局部变量和部分结果,并且在方法调用和返回起作用。
每一个线程都有一个私有的JVM堆栈,同时创建线程,每次调用方法都会创建一个细腻的框架,框架只会在其方法调用完成时被销毁destroy。

程序计数器寄存器

PC-程序计数器寄存器,它包含当前正在执行Java虚拟机指令的地址。

本地方法堆栈

它包含应用程序所使用的所有本地方法。

执行引擎

执行引擎包含:

  1. 虚拟机处理器
  2. 解释器:读取字节码流,然后执行指令。
  3. 即时JIT编译器:用于提高性能,JIT编译同时类似字节码代码部分的功能,从而减少编译所需要的时间。编译器是指从Java虚拟机指令集到特定CPU指令集的转换器。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JVM虚拟机概述 的相关文章

  • 如何找出一个对象有多少个引用? [复制]

    这个问题在这里已经有答案了 是否可以和 或容易地找出任意对象有多少个传入引用 也就是说 有多少对象引用它 提前致谢 简短的回答是 你自己数一下 StackOverflow 的另一个问题有一些有用的答案和资源 是否可以获得对象引用计数 htt
  • JVM 退出代码 1073807364 的原因是什么?

    我构建了一个基于 RCP 的应用程序 我的一位用户在 Windows XP Sun JVM 1 6 0 12 上运行时 应用程序完全崩溃了 应用程序运行两天后 这不是新版本或其他任何东西 他得到了漂亮的灰色 JVM 强制退出框 退出代码 1
  • 强制小程序加载到同一个 JVM 实例中?

    我接管了一个旧 Web 应用程序的维护工作 该应用程序使用嵌入在同一网页中的多个小程序 这曾经工作得很好 但自从引入了下一代 Java 插件 1 6 0 10 后 不保证各个小程序能够加载到同一个 JVM 实例中 如果它们加载在不同的 JV
  • Docker 容器中运行的 JVM 的驻留集大小 (RSS) 和 Java 总提交内存 (NMT) 之间的差异

    设想 我有一个 JVM 在 Docker 容器中运行 我使用两种工具进行了一些内存分析 1 top 2 Java 本机内存跟踪 这些数字看起来令人困惑 我正在尝试找出造成差异的原因 问题 Java 进程的 RSS 报告为 1272MB 总
  • 有什么方法可以显示正在运行的 JVM 中使用的标志吗?

    尽管我们已经为应用程序显式设置了许多 JVM 标志 但很难知道是否 1 布尔标志默认已打开 默认值在 JDK JRE 次要更新之间发生了变化 2 一个标志否定另一个标志 3 特定系统上给定任意标志的默认值是什么 由 Java 人体工程学设置
  • 无法识别的选项: - 无法创建 Java 虚拟机

    我正在尝试运行我的 jarLinux 服务器上的文件 这些是我正在运行的命令 JAVA HOME app local opt jdk packages jdk1 6 0 30 export PATH JAVA HOME bin PATH c
  • 在最近的 JVM 中,不可见引用仍然是一个问题吗?

    我正在读书Java 平台性能 http java sun com docs books performance 1st edition html JPAppGC fm html 遗憾的是 自从我最初提出这个问题以来 该链接似乎已经从互联网上
  • IntelliJ 调试:暂停整个虚拟机,然后进入单线程

    我正在调试一个具有大量线程的应用程序 我的断点设置为暂停整个虚拟机 当线程遇到其中一个断点时 我想使用 Step Over 但这似乎会恢复整个虚拟机 直到该步骤完成 如果我可以只单步执行到达断点的单个线程 那确实会有帮助 在 Intelli
  • 病毒或机器故障导致“无法创建Java虚拟机”?

    我用的是双核XP机安装了 4GB 内存 但仅2 5GB由于 32 位事实 由操作系统报告 我正在积极修改旧的 JAVA 应用程序至少一个月 使用最新的Eclipse 编辑 构建和运行 和Ant 另一种构建和运行的方式 在里面Eclipse运
  • 从 Intellij 在远程主机上部署/运行 jvm 应用程序

    是否可以在 intellij 的远程服务器上部署 运行 出于测试目的 独立的 Java 应用程序 我并不是要连接到已经运行的 JVM 而是要从 intellij 在远程主机上启动一个新的 JVM 就像它在我的本地计算机上运行一样 目前没有内
  • 将 JVM 字节码往返于文本表示的故障安全方法

    我正在寻找一种在 JVM 类文件和文本表示之间往返的故障安全方法 一项严格的要求是 只要文本表示形式保持不变 生成的往返 JVM 类文件在功能上与原始 JVM 类文件完全相同 此外 文本表示必须是人类可读和可编辑的 应该可以对文本表示进行小
  • Scala 泛型 - 为什么我无法在泛型类中创建参数化对象?

    我目前正在学习scala 为什么此代码不起作用 class GenClass T var d T var elems List T Nil def dosom x T var y new T y 我得到 错误 需要类类型 但找到了 T 代替
  • Jprofile可以连接到docker中运行的JVM

    我是 JProfiler 的新手 我最近遇到了一个问题 我的Java应用程序在docker中运行 这意味着JVM在docker中运行 但我的jprofile安装在主机上 我知道 jprofiler 必须连接到 JVM 那么 jprofile
  • Java 堆被无法访问的对象淹没

    我们的 Java EE 应用程序开始出现一些严重问题 具体来说 应用程序在启动后几分钟内就运行了高达 99 的老年代堆 不会抛出 OOM 但实际上 JVM 没有响应 jstat 显示老年代的大小根本没有减少 没有垃圾收集正在进行 并且kil
  • JVM HotSpot 上的 Java 异常计数器

    我想知道是否可以在不更改应用程序代码的情况下记录 JVM 级别上发生的每个异常 我所说的每个异常是指捕获和未捕获的异常 我想稍后分析这些日志并按异常类型 类 对它们进行分组 并简单地按类型对异常进行计数 我正在使用热点 也许有更明智的理由这
  • 如何在JVM不退出的情况下多次运行Java程序?

    假设我有一个Java程序Test class 如果我使用下面的脚本 for i in 1 10 do java Test done JVM每次都会退出java Test被调用 我想要的是跑步java Test在不退出JVM的情况下多次执行
  • HotSpot使用的Mark-Compact算法是什么?

    当阅读 Mark Compact 章节时垃圾收集手册 https rads stackoverflow com amzn click com 1420082795 提出了一系列替代方案 但其中大多数看起来很旧 理论上 例如 2 指压缩和 L
  • 在intellij中为java启用ssl调试

    从我的问题开始 上一期尝试通过 tls ssl 发送 java 邮件 https stackoverflow com questions 39259578 javamail gmail issue ready to start tls th
  • 为什么不在下一个 JVM 中删除类型擦除呢?

    Java 在 Java 5 中引入了泛型类型擦除 因此它们可以在旧版本的 Java 上运行 这是兼容性的权衡 我们已经失去了这种兼容性 1 https stackoverflow com questions 22610400 a progr
  • 在正在运行的 JVM 中查找正在运行的实例

    我想知道是否可以获取给定类的正在运行的实例的句柄 触发此问题的特定问题是应用程序由于存在大量正在运行的线程而无法正常退出 是的 我知道您可以对 thead 进行守护进程 然后它们就不会阻止应用程序退出 但这确实让我想知道这是否可能 我能做的

随机推荐