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

JVM堆中的帧是已分配的还是堆栈已分配的?

范翰海
2023-03-14

JVM规范(JSE 8版)提到:

第12页:2.5.2 JVM堆栈:“因为JVM堆栈除了用于推送和弹出帧之外,从来没有被直接操作过,所以帧可以被堆分配。”

第15页:2.6:帧:“帧是从创建帧的线程的JVM堆栈中分配的。”在第16页:“请注意,由线程创建的框架是该线程的本地框架,不能被任何其他线程引用。”

这听起来让我很困惑。既然一个帧是创建该帧的线程本地的,为什么要在堆中分配该帧,因为堆在所有JVM线程之间是共享的?除非这里漏掉了什么,否则就没有意义。第12页的句子很有趣。

有什么线索吗?谢谢。

共有1个答案

孔俊捷
2023-03-14

JVM堆栈是一种抽象。它可以分配到任何地方,也可以不分配。例如,如果一个方法由JIT内联,那么它没有单独的堆栈框架。

HotSpot JVM使用本地线程栈作为JVM栈。然而,有JVM实现(例如CLDC HI)在Java堆中分配JVM栈。这种方法的好处是对包括线程栈在内的所有东西都有一个单一的内存管理。这样的JVM可以在没有标准内存管理器(如libc)甚至没有操作系统的平台上运行。

JVM堆也是一种抽象。JVM线程之间的“共享”并不比本机线程堆栈多。堆也可能有线程局部区域。同时,本机线程堆栈驻留在虚拟内存中,虚拟内存也在进程的所有线程之间共享。

 类似资料:
  • 我保证这个问题以前被问过,但是我没有能够通过搜索找到它;对于任何冗余,请提前道歉。 我的理解(可能是错误的)是,只有在编译时知道对象的大小时,才能分配给堆栈。因此,在初始化数组的情况下,可以执行以下操作之一(这应该放在堆栈上): 由于这个数组的大小在编译时是已知的,所以这应该没有问题。 另一方面,这(我相信)也是有效的代码: 这也会被放在堆栈上吗?我很确定如果你释放()这个,代码会出错,所以我认为

  • 让我们考虑一下这个代码: 现在,让我们想象一下,在堆中为分配内存时,没有可用空间AND,同时,堆栈中有足够的可用空间。 我的问题很简单:如果堆栈中的分配是错误的,那么堆栈中的分配是否总是错误的? 据我所知,堆栈是为每个线程分配的,堆是为进程分配的。那么,是否可以保证堆栈中内存分配的结果不会与堆中内存分配的结果相关联?当然,我不认为堆栈溢出本身。换句话说,为堆栈保留的内存实际上是完全为其保留的吗?或

  • 我来自C/C++背景,在这里一个进程内存分为: null 我想把我的注意力集中在这一点上,当我阅读JVM中的堆和堆栈时,我们是在谈论堆栈和堆的概念吗?并且整个JVM的实际内存驻留在堆上(这里指的是堆的C++概念)?

  • 我试图了解分配给堆栈和堆的内存量。假设sizeof(char)=1字节,sizeof(void*)=4字节。给定以下代码: 我们被告知分配给堆的内存量是5个字节,我明白这确实是malloc(strlen(str2)=5)中的量。但是,我不明白的是分配给堆栈的内存量是如何达到18个字节的?我想如果他们给我们一个指针大小是4个字节的信息,那么我们有4个字节的指针str1和另外6个字节的数组str2(包

  • 问题内容: 是局部变量,将其存储在堆或堆栈中的何处? 问题答案: 在堆上。每当您用来创建对象时,它都会在堆上分配。

  • 我正在我的程序中编写一个自定义内存分配器,并试图更好地理解什么是被分配的内存与未分配的内存。我被告知,对于一个基本的、“朴素的”内存分配器,对的调用必须提供与16字节对齐的大小(倍数)。这意味着,如果我需要分配5字节的内存,则应用操作(5+(16-1))&~(16-1)),在本例中,该操作最多舍入为16。如果请求的大小是17而不是5,那么它将舍入为32。 这意味着为了对齐,我们从操作系统返回的字节