JVM堆/堆栈与虚拟地址空间堆/堆栈是否不同?

时间:2020-01-16 06:49:02

标签: jvm stack heap segment object-files

内存分为“段”,分别称为堆,堆栈,bss,数据和文本。但是,JVM也具有这些堆栈和堆的概念。那么这两个人如何调和?

它们是否具有不同的抽象级别,其中主内存位于JVM下面一两个级别,并且其“段”自然映射到JVM的“段”?由于JVM应该是一台虚拟计算机,所以在我看来,它们仿效了下面但在更高抽象级别上发生的事情。

1 个答案:

答案 0 :(得分:1)

听起来像是您在读教科书或类似书籍。所有这些术语通常在书本/讲座中都有非常精确的定义,但实际上却没有那么精确的定义。因此,人们说堆时的意思不一定与书等所说的完全相同。

内存分为“段”,分别称为堆,堆栈,bss,数据和文本。

这仅适用于典型的用户空间过程。换句话说,这对于用c或类似语言编写的日常程序都是正确的,但是并非对所有程序都正确,对于整个内存空间也绝对不正确。

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

堆栈是一个数据结构/段,用于跟踪局部变量和函数调用。它存储重要的信息,例如函数调用后返回的位置。使用c或其他“本机”语言,堆栈由OS创建,并且可以根据需要增加或缩小。

Java允许程序在执行过程中使用new请求内存。使用new分配给Java程序的内存在Java堆中称为内存。可以想象,如果您在哪里实现Jvm,您将在new幕后使用malloc。这将导致在常规本机堆中出现Java堆。实际上,“严重的” jvm不会这样做,而是直接与操作系统交互以获取内存。

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

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