JVM内存段和JIT编译器

时间:2016-02-13 11:40:47

标签: jvm jit

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

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

  1. Java Stacks
  2. 方法区
  3. PC注册
  4. 原生方法堆栈
  5. 不一定是用连续的内存实现的,并且可能都是在操作系统提供的某些堆内存上实际分配的,这引出了我的问题。

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

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

1 个答案:

答案 0 :(得分:0)

  

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

它存储在" Perm Gen"在Java< = 7和"元空间"在Java 8中。这是另一个本机内存区域。

  

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

内存区域既可写又可执行,但我不确切知道实现此目的所需的系统调用。

  

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

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

  

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

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

  

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

在线程堆栈上。

  

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

它没有这样做。