当前位置: 首页 > 知识库问答 >
问题:

JVM内存段和JIT编译器

公孙宏畅
2023-03-14

我知道这依赖于JVM,每个虚拟机都会选择实现它,但我想了解总体概念。

据说对于JVM用来执行Java程序的内存段

  1. Java堆栈

不一定用连续内存实现,并且可能都实际分配在操作系统提供的一些堆内存上,这就引出了我的问题。

  • 完全使用JIT机制并将字节码方法编译为本机机器码方法的JVM将这些方法存储在某个地方,那会在哪里?执行引擎(通常用C/C编写)将不得不调用这些JIT编译函数,然而内核不应该允许程序执行保存在堆栈/堆/静态内存段上的代码,JVM如何克服这个问题?
  • 我的另一个问题是关于Java堆栈,当一个方法(在JIT编译之后)在处理器中执行时,它的局部变量应该保存在Java堆栈中,然而Java堆栈可以用非连续内存实现,甚至可能只是分配在堆上的一些堆栈数据结构作为堆栈,正在执行的方法的局部变量如何以及在哪里被保存?内核不应该允许程序将堆分配的内存视为进程堆栈,JVM如何克服这个困难?

再次,我想强调我要求的是一个整体概念,我知道每个JVM都会选择实现这个有点不同...

共有1个答案

左丘阳晖
2023-03-14

JVM充分利用JIT机制,将字节码方法编译成本机机器码方法,并将这些方法存储在某个地方,会在哪里?

它存储在Java中的“Perm Gen”中

执行引擎(通常用C/C编写)必须调用这些JIT编译的函数,然而内核不应该允许程序执行保存在堆栈/堆/静态内存段上的代码,JVM如何克服这一问题?

内存区域既是可写的,也是可执行的,尽管我不知道具体需要哪个系统调用来实现这一点。

我的另一个问题是关于Java栈,当一个方法(JIT编译后)

最初代码没有编译,但它以相同的方式使用堆栈。

是在处理器内执行的。它的局部变量应该保存在Java堆栈中,而且Java堆栈可以使用非连续内存来实现

每个线程都有一个连续的堆栈。

甚至可能只是在堆上作为堆栈分配的一些堆栈数据结构,如何以及在何处保存正在执行的方法的局部变量?

线程堆栈上。

内核不应该允许程序将堆分配的内存视为进程堆栈,JVM如何克服这个困难?

它不能这样做。

 类似资料:
  • 问题内容: Sun的规范JVM实现对字节码进行了一些相当复杂的优化,以在代码运行几次后获得接近本机的执行速度。 问题是,为什么没有将此编译后的代码缓存到磁盘以供以后使用同一功能/类时使用? 就目前而言,每次执行程序时,JIT编译器都会重新启动,而不是使用代码的预编译版本。当本质上解释字节码时,是否添加此功能不会大大提高程序的初始运行时间? 问题答案: 我不求助于@MYYN发布的链接的’n’past

  • 我试图理解Java源代码是如何执行的,我对JVM中的JIT编译器究竟是什么感到困惑。首先,让我告诉您我是如何理解从Java源代码到在计算机上执行机器代码的过程的。也许,我在这一过程中误解了一些导致混淆的东西。 步骤如下: 源代码被编译成字节码(.class文件) 现在,根据维基百科关于JVM的文章,更具体地说是“字节码解释器和实时编译器”部分,为了执行Java字节码,您需要一个解释器(但我们有一个

  • 主要内容:JIT编译器语法,JIT编译器的风险和假设JIT 编译器是用 C++ 编写的,用于将 Java 转换为字节码。现在 Java 10 可以选择启用基于 Java 的实验性 JIT 编译器 Graal 来代替标准的 JIT 编译器。Graal 正在使用 Java 9 中引入的 JVMCI,即 JVM 编译器接口。 Graal 在 Java 9 中也可用。使用 Java 10,我们可以启用 Graal 来测试和调试实验性 JVM 编译器。 JI

  • 这个问题与android系统有关。Dalvik VM使用JIT概念,这意味着当您第一次运行应用程序时,Dalvik VM编译它并加载到RAM中,只要它能留在那里。我理解这个概念。而新的称为ART的虚拟机则使用AOT方法。ART编译应用程序后,你安装它(或当你正在安装它?)。这意味着什么?ART编译的应用程序与已编译的应用程序(如C应用程序)相同,但运行在与其他操作系统分离的独立进程中?谁能更透彻地

  • 我正在尝试离线构建一个站点,并且已经登录,打算创建一个子主题,但是出现了一些错误。 我尝试在php.ini中添加以下行:"pcre.jit=0" 这是显示的错误: JIT编译失败:没有更多的内存til.php#1425preg_replace 回溯 ./库/类/Util.php#1425:preg_replace(string'/\.?0$/', string", string'48.0', )

  • 我的问题是,谁分配和管理这些内存段?操作系统不知道java程序正在运行,并认为它是JVM的一部分,作为计算机上的常规程序运行,JIT编译、java堆栈的使用,这些操作需要运行时内存分配,我不明白的是JVM如何将其内存划分为这些内存段。这肯定不是由操作系统来完成的,这些内存段(例如java堆栈)必须是连续的才能工作,所以如果JVM程序只是使用malloc命令来接收堆内存的最大大小并将这些内存划分为多