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

问题描述 投票:0回答:1

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

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

jvm stack heap segment object-files
1个回答
0
投票

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

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

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

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

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.