【问题标题】:Do the Stack and Heap both exist within your systems RAM?堆栈和堆是否都存在于您的系统 RAM 中?
【发布时间】:2014-10-04 17:25:29
【问题描述】:

问题和题目差不多,堆栈和堆是否一直存在于 RAM 中?假设 Windows 是相关机器的操作系统。

另外,如果上述问题的答案是肯定的,是否可以告诉 JVM 在不同的位置创建特定的应用程序 Stack 和 Heap,例如外部 micro SD 卡?或者只是将默认的堆栈/堆创建位置设置为 RAM 以外的某个位置?

【问题讨论】:

  • 栈和堆是数据结构。它们是否存在于内存中取决于您的操作系统或编程语言是否创建和维护这些结构。
  • 对,我将编辑问题以假设 Windows。我具体指的编程语言是Java,问题是用Java标签标记的。
  • 除了好奇之外,你的问题背后还有什么原因吗?鉴于可以使程序的堆驻留在外部 micro SD 卡上,您将使用该卡做什么,何时?停止程序,拔卡调查一下??
  • 好吧,我想知道如果我仍然想在不使用本机代码的情况下在 Java 中运行 prgram,那么对于 RAM 非常有限的系统来说,这是否是一个可行的选择。我现在意识到这不是大声笑。
  • 好吧,这就是我的怀疑。但是 GBytes 很便宜……

标签: java windows jvm heap-memory stack-memory


【解决方案1】:

嗯,它们可能不会一直都在 RAM 中。堆栈和堆只是分配在 RAM 中的数据结构。当您的程序实际使用 CPU 时,它们都将(至少部分)存在于 RAM 中。但是,当程序未运行时,操作系统可能会换出堆栈和堆所在的页面。然后可以将部分(或全部)堆栈和堆写入磁盘。

我猜你无法告诉 JVM 将这些数据结构分配到其他任何地方。我无法想象您想要的场景;这将非常缓慢。我确信它们是通过 malloc() 或系统调用分配的,JVM 不太可能有任何条件代码用于这种类型的分配。

【讨论】:

  • 可能能够做的一件事是更改JVM 堆和堆栈的位置。但这将是本机代码,并且需要对底层操作系统有所了解。它不会是便携式的。它也可能不会映射到在 JVM 中运行的应用程序的堆 + 堆栈。
  • 那么在JVM中运行的应用程序的堆/堆栈没有存储在JVM的同一个堆和堆栈中?我的应用程序堆栈/堆不是我的 JVM 堆栈/堆的子集?只是想澄清一下,对不起,如果这是一个菜鸟问题。
  • 我也非常感谢您的描述性回答,以及@Parthian Shot 的随附评论。
  • Heap/Stack of an application running within the JVM are not stored within the same Heap and Stack of the JVM 不,抱歉,我不清楚。有两种不同的堆+栈组合,一种嵌套在另一种中。一种是原生的JVM heap+stack,由操作系统映射到内存中。另一个是JVM在自己的内存中创建的virtual heap+stack。因此,O/S 为 JVM 进程分配内存,然后 JVM 为内部 Java 应用程序分配内存以用于其操作。
  • @AdamJ 如果我正确理解了您的原始问题,您希望将内部 Java 堆+堆栈放在某个地方,据我所知,这不是您可以在不修改源代码的情况下指定的东西JVM 本身的代码(不推荐)。但是,可能可以将正在运行的 JVM 进程的内存映射到主内存以外的文件或设备上。如果我是你,我会调查的。除非将内部堆和堆栈分离到不同的设备真的很重要,否则我不想成为你——你必须重写你的 Java 才能做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-25
  • 2014-09-15
  • 2021-06-28
  • 1970-01-01
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多