【问题标题】:JVM Memory Segments and JIT CompilerJVM 内存段和 JIT 编译器
【发布时间】:2016-05-24 14:14:21
【问题描述】:

我知道这是依赖于 JVM 的,每个虚拟机都会选择实现它有点不同,但我想了解整体概念。

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

  1. Java 堆栈
  2. 方法区
  3. PC 寄存器
  4. 本机方法堆栈

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

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

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

【问题讨论】:

    标签: jvm jit


    【解决方案1】:

    完全使用 JIT 机制并将字节码方法编译为本机机器码方法的 JVM 将这些方法存储在某个地方,那会在哪里?

    它存储在 Java

    执行引擎(通常用 C/C++ 编写)必须调用这些 JIT 编译函数,但内核不应该允许程序执行保存在堆栈/堆/静态内存段上的代码,怎么可能JVM 克服了这个问题?

    内存区域既可写又可执行,虽然我不知道具体需要哪个系统调用来实现它。

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

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

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

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

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

    在线程堆栈上。

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

    它不这样做。

    【讨论】:

    • 每个线程的堆栈是我指的java堆栈,这意味着它存储在本机内存中是什么意思,如何?它应该存储在堆栈/堆中,它最终如何执行它。很多时候,jvm 会使用堆内存为每个线程内存实现它自己的堆栈,这再次将我引向我原来的问题,它如何将堆栈结构视为本机堆栈.....这并不能完全回答我的问题.. . 您能否详细介绍一下本机内存段?无论如何谢谢你
    猜你喜欢
    • 1970-01-01
    • 2017-06-09
    • 2017-05-20
    • 2010-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多