我知道这是JVM依赖的,每个虚拟机都会选择实现它,但我想了解总体概念。
据说对于JVM用来执行Java程序的内存段
不一定是用连续内存实现的,而且可能实际上都是在操作系统提供的堆内存上分配的,这就引出了我的问题。
我想再次强调,我要求的是一个总体概念,我知道每个JVM都会选择实现这一点,有点不同.
发布于 2016-02-13 18:27:52
那些充分使用JIT机制并将字节码方法编译成本机代码方法的JVM将这些方法存储在某个地方,那会在哪里呢?
它存储在Java <= 7中的"Perm“和Java 8中的"meta”中。这是另一个本机内存区域。
执行引擎(通常用C/ C++编写)必须调用这些JIT编译函数,但是内核不应该允许程序执行保存在堆栈/堆/静态内存段上的代码,JVM如何克服这一点?
内存区域既是可写的,也是可执行的,尽管我不知道实现这一点需要哪个系统调用。
另一个问题是关于Java堆栈,当一个方法(在JIT编译之后)
最初,代码没有编译,但它使用堆栈的方式相同。
在处理器内部执行它的局部变量应该保存在Java堆栈中,但是Java堆栈可以用非连续内存来实现。
每个线程都有一个连续的堆栈。
甚至可能只是在堆上分配了一些作为堆栈的堆栈数据结构,如何以及在何处保存正在执行的方法的局部变量?
在线程堆栈上。
内核不应该允许程序将堆分配的内存视为进程堆栈,JVM如何克服这一困难?
它不会这么做。
https://stackoverflow.com/questions/35379383
复制相似问题