两种语言是不是在 ram 上使用相同的堆栈和堆?

Posted

技术标签:

【中文标题】两种语言是不是在 ram 上使用相同的堆栈和堆?【英文标题】:Does two languages use the same stack and heap on the ram?两种语言是否在 ram 上使用相同的堆栈和堆? 【发布时间】:2020-07-30 22:47:42 【问题描述】:

我正在阅读有关 python 中的内存分配的内容,想知道我是否在同一计算机系统中安装了 java 和 python,那么 java 和 python 是否使用相同的堆栈和堆,或者它们在内存?

谁能帮我解开疑惑。

提前致谢。

【问题讨论】:

每个正在运行的程序都有它在堆栈和堆上。甚至两个 java 进程(或两个 python 进程)都有自己的栈和堆 @ThomasKläger:你确定吗? CPython 进程的堆是什么? @SergeBallesta 我敢肯定:the python documentation 说“Python 中的内存管理涉及一个包含所有 Python 对象和数据结构的私有堆” 【参考方案1】:

即使是实现细节,系统上的每个线程都有自己的堆栈。堆是来自 70 年代分段模型的图像,除了现代操作系统上的 Java 进程外,对任何进程都没有任何意义:当进程需要更多内存时,它只是向内核请求它并且没有预先分配的堆。从某种意义上说,系统中的所有进程(Java 进程除外)共享相同的可用内存池,但它不是所谓的堆。

Java 不同,因为 Java 程序在 JVM 中执行,而 JVM 有分配的内存,进程不能向系统请求内存。所以在一个JVM中,整个进程都有一个堆,每个线程都有一个栈。如果你启动 2 个独立的 Java 程序,你将拥有 2 个独立的 JVM,每个都有自己的堆。

【讨论】:

非常感谢!这真的很有帮助 这不是实现细节,拥有自己的堆栈是线程的特性。此外,堆并不是一个过时的概念,基本上每种编程语言都有它,以及它如何映射到 OS 系统调用,通常是一个实现细节;如果每个微小的分配都导致对内核进行这样的系统调用,那么性能将是灾难性的。这不是编程语言的工作方式。 Java 也不需要预先分配的连续堆。这是广泛使用的 HotSpot JVM 的一个属性,但即使是这个特定的实现也支持缩小和增长堆。一句话中提到 Java 的堆和 70 年代的概念是有误导性的。其他语言也使用术语堆内存,但它与 Java 不同。 Java 的规范只是将堆内存定义为 a) 共享的(与堆栈内存相反,堆栈内存与 C 的堆栈内存不同,它永远不能在线程之间共享),b) 分配所有对象的内存,以及 c) 垃圾收集。这就是它的全部要求。 @Holger 不仅如此,而且连续属性用于 virtual 地址空间,所以,在 64 位世界中 - 谁在乎? JVM uncomitts 已经提交了页面(这取决于 GC 和初始标志)。到目前为止,通常不会提交通过XmsXmx 保留的所有内容。【参考方案2】:

两个不同的程序从不使用同一个堆。他们每个人都获得了一部分虚拟地址空间,这些地址空间可以以某种方式在数字上重叠,但它们是独立的。当程序实际上需要将页面放在 RAM 中时 - 它会以惰性方式分配它们,通常是 4KB(可能更大)。这是通过Page Table 完成的,它能够将虚拟地址空间映射到phisycal 之一(也可能是交换)。

您可能需要了解,您并不需要所有的东西,所有时间都在 RAM 中。您的代码可以做一小部分,然后将 RAM 中的空间提供给其他人,甚至换出。

【讨论】:

以上是关于两种语言是不是在 ram 上使用相同的堆栈和堆?的主要内容,如果未能解决你的问题,请参考以下文章

堆栈和堆内存的大小[重复]

将堆栈和堆内存转储到文件,然后将其加载回 RAM?

堆栈与堆栈和堆与堆

堆栈和堆的内容和位置是什么?

STM32 板的 RAM、堆和堆栈存储器

java 堆栈 理解