首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >JVM内存段和JIT编译器

JVM内存段和JIT编译器
EN

Stack Overflow用户
提问于 2016-02-13 11:40:47
回答 1查看 734关注 0票数 1

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

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

  1. Java栈
  2. 方法面积
  3. 个人电脑登记册
  4. 本机方法栈

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

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

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

EN

回答 1

Stack Overflow用户

发布于 2016-02-13 18:27:52

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

它存储在Java <= 7中的"Perm“和Java 8中的"meta”中。这是另一个本机内存区域。

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

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

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

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

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

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

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

在线程堆栈上。

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

它不会这么做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35379383

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档