【问题标题】:Is stack a logical memory area in heap? [duplicate]堆栈是堆中的逻辑内存区域吗? [复制]
【发布时间】:2017-07-04 22:54:04
【问题描述】:

在 Java 中,对象存储在堆中,但方法局部变量存储在堆栈中。但是当我打开 jconsole 时,我看不到堆栈中分配的任何内存。我只看到堆和 permgen (Java 6)。堆栈只是堆中的逻辑分离而不是物理分离吗?

【问题讨论】:

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


【解决方案1】:

JVM 使用进程的本机堆栈。这样可以最大限度地减少开销,并允许堆栈是虚拟的(它的最大大小可以比实际使用的大得多)

因此,大多数堆栈很少被大量使用(

【讨论】:

  • The JVM uses the native stack of the process. 我相信这意味着操作系统为进程分配的内存。那么它必须与通过 -Xms 和 -Xmx 参数提到的堆分开。 ?
  • @emilly 仅分配虚拟内存/地址空间。发生这种情况时,只有被触摸的页面才会变成实际内存。即,如果将最大值设置为 10 MB,但仅使用 21 KB,则实际使用 6 * 4 KB (24 KB) 您可以设置堆栈的最大大小-Xss 虽然这很少需要。
  • 对不起。说我有 4 GB 的总内存。我为堆分配了 1GB 的最大内存。现在堆栈由于某种原因需要 512M 内存,那么它将被分配到 3GB (4-1) 之外?
  • @emilly 每个线程都有自己的堆栈。除非您知道这是个问题,否则我会将其保留为默认设置。
  • 我现在没有遇到任何问题,也不会更改任何默认设置。但是想了解堆栈区域的内存是在堆外分配还是从 RAM 的其余部分分配的?
【解决方案2】:

没有。堆栈是一个不同的内存区域,专门用于保存与方法调用相关的信息,例如参数值以及方法返回后程序流应返回的位置。

【讨论】:

  • 那么为什么堆栈区内存分析没有显示在任何内存分析工具(如 jconsole 等)中
  • @emilly 堆栈的大小很少有问题,该工具会显示什么?
  • 堆栈随着每次方法调用和返回而变化。您希望分析器工具报告什么?
猜你喜欢
  • 2011-08-01
  • 2016-06-29
  • 2016-03-25
  • 2011-03-29
  • 2011-02-16
  • 2017-08-18
  • 2011-08-15
  • 2011-06-25
  • 2011-07-02
相关资源
最近更新 更多