JVM heap/stack 与虚拟地址 space heap/stack 不同吗?

Are JVM heap/stack different than virtual address space heap/stack?

内存分为"segments"称为堆、栈、bss、数据、文本。但是JVM也有栈和堆这些概念。那么这两者是如何调和的呢?

它们是否是不同的抽象级别,其中主内存比 JVM 低一到两个级别,并且其 "segments" 自然映射到 JVM 的 "segments"?由于 JVM 应该是一台虚拟计算机,在我看来,它们模拟了底层发生的事情,但在更高的抽象层次上。

在我看来,您好像一直在阅读教科书或类似书籍。所有这些术语通常在 books/lectures 中都有非常精确的定义,但在现实中却没有那么精确。因此,当人们说堆时,他们的意思不一定与书上所说的完全相同。

Memory is divided into "segments" called heap, stack, bss, data, and text.

这仅适用于典型的用户 space 进程。换句话说,这对于用 c 或类似语言编写的日常程序来说是正确的,但并非所有程序都是如此,而且对于整个内存来说绝对不是这样 space.

执行程序时,OS 会为列出的各个段分配内存,堆除外。程序可以在执行时从 OS 请求内存。这允许程序根据其需要使用不同数量的内存。堆是指程序通常通过诸如malloc之类的函数请求的内存。澄清一下,堆通常是指内存的托管区域,通常使用 malloc/free 进行管理。也可以以非托管方式直接从 OS 请求内存。大多数人 (Imo) 会说这不算作堆的一部分。

堆栈是一种数据structure/segment,用于跟踪局部变量和函数调用。它存储重要信息,例如函数调用后 return 的位置。在 c 或其他 "native" 语言中,堆栈由 OS 创建,并且可以根据需要扩大或缩小。

Java 允许程序在执行期间使用 new 请求内存。使用 new 分配给 java 程序的内存称为 java 堆中的内存。可以想象,如果您在实现 Jvm 的地方,您将在 new 的幕后使用 malloc。这将导致在常规本机堆中出现 java 堆。实际上 "serious" jvms 不会这样做,而是直接与 OS 交互以获得内存。

在 Java 中,堆栈由 Jvm 创建。可以想象这是由 malloc 分配的,但与堆一样,这可能不是现实世界中 jvms 的做法。

编辑: 像热点一样的 JVM。可能会直接从 OS 分配内存。然后,该内存将被放入某种池中,并根据需要从中删除。需要内存的原因包括新的或需要增长的堆栈。