【问题标题】:JVM stack memoryJVM堆栈内存
【发布时间】:2017-02-08 01:40:45
【问题描述】:

我们 Java 开发人员有时使用 java -Xss 1M 来确保我们为每个线程特定的堆栈提供 1 MB 空间。现在,我经常对 JVM 从堆或系统内存中借用 1 MB 的位置感到困惑,或者 Java 是否为线程分配了任何特定的内存。你能帮我理解一下吗?

另外,我们是否有一个可视化(插件)运行时工具,可以以易于理解的方式显示堆和堆栈的内容?

提前致谢。

【问题讨论】:

  • 如何确定每个线程需要 1MB 的堆栈大小?

标签: java jvm heap-memory stack-memory


【解决方案1】:

JVM 从哪里借用这 1 MB,从堆内存或系统内存?

JVM 从操作系统“借用”堆栈内存,所以也许这就是您所说的“系统内存”。 JVM 实际上从操作系统的虚拟内存系统请求它用作线程堆栈空间的内存块。 JVM 使用的所有内存(代码、堆栈、堆等)都以相同的方式从操作系统请求。栈内存与堆内存是分开的,由JVM自己管理。

更多关于JVM的内存是如何划分的,我来看看这个答案:How is the java memory pool divided?

另外,我们是否有一个可视化(插件)运行时工具,可以以易于理解的方式显示堆和堆栈的内容?

如果您谈论的是堆内存的内容,那么您应该查找有关内存分析器的信息。这是一个很好的question about that topic。这里还有一个good tutorial on the subject。但是,我不确定这些工具是否会以“可理解的方式”向您展示记忆。它们用于定位内存泄漏或一般对象分配带宽问题。

没有工具可以显示 stack 内存,因为它是根据各种线程的调用堆栈分配的,并且没有以易于调查的方式组织。

最后,要了解 JVM 的各个部分使用了多少内存,您可以use jconsole as well。

【讨论】:

  • jdk 中也包含的 JVisualVM 的功能是 jconsole 的超集。尤其是 VisualGC 插件,它提供了一个很好的堆内存视图……
  • 谢谢。实际上 jconsole 提供了一些关于内存选项卡的额外细节,这些细节在 JVisualVM @Holger 上不可用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
  • 2011-06-21
  • 2012-06-03
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
相关资源
最近更新 更多