Java 非堆内存和栈内存有啥区别?它们是不是相同,如果不同,它们之间有啥区别?

Posted

技术标签:

【中文标题】Java 非堆内存和栈内存有啥区别?它们是不是相同,如果不同,它们之间有啥区别?【英文标题】:What is the difference between Java Non Heap Memory and Stack Memory? Are they Same if not what is the difference between them?Java 非堆内存和栈内存有什么区别?它们是否相同,如果不同,它们之间有什么区别? 【发布时间】:2014-11-10 03:45:52 【问题描述】:

我正在使用 Jconsole 来监控 Java 应用程序。内存选项卡显示不同的堆和非堆内存,例如

    堆内存使用情况 非堆内存使用情况 内存池“CMS 老一代” 内存池“Par Eden Space” 内存池“Par Survivor Space” 内存池“代码缓存” 内存池“CMS Perm Gen”

这些术语之间有什么区别。还请提供一些关于 - 如何通过监控这些参数来发现应用程序行为异常的信息。

【问题讨论】:

How is the java memory pool divided? 的可能重复项 复制***.com/questions/1262328/… 【参考方案1】:

在所有基于 C 的语言(以及大多数其他语言)中,基本上都存在三类存储:

    堆 堆栈 静态(有多种变体)

你熟悉的堆。

您也熟悉堆栈,但您不知道。当您有一个带有“局部”变量的方法时,这些变量会在“调用框架”中分配。 “调用帧”在您调用方法时分配,并在您从方法返回时删除,因此使用随调用增长并随返回收缩的“堆栈”最有效地实现。

静态是你没有明确分配的东西,基本上从程序执行开始就存在。

堆栈所需的空间通常相当小,与上述类别中的“非堆内存”混为一谈。

【讨论】:

"你熟悉的堆。" -- 我是? @user64141 -- 任何时候你使用 new 都是在使用堆。【参考方案2】:

非堆内存是JVM为堆以外的目的分配的所有内存。这包括:

调用堆栈(如您所述); 本机代码分配的内存(例如,用于堆外缓存); 在 HotSpot 8 中,元空间(永久代的替代品); JIT 编译器使用的内存(已编译的本机代码)。

在您的列表中,“CMS Old Gen”、“Par Eden Space”、“Par Survivor Space”和“CMS Perm Gen”都指的是堆的各个部分。

【讨论】:

【参考方案3】:

请点击链接http://www.yourkit.com/docs/kb/sizes.jsp 和http://publib.boulder.ibm.com/infocenter/javasdk/v5r0/index.jsp?topic=%2Fcom.ibm.java.doc.diagnostics.50%2Fdiag%2Fproblem_determination%2Faix_mem_heaps.html

非堆 此外,JVM 还有堆以外的内存,称为非堆内存。它在 JVM 启动时创建并存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码,以及内部字符串。

不幸的是,JVM 提供的关于非堆内存的唯一信息是它的整体大小。没有关于非堆内存内容的详细信息。

非堆内存大小的异常增长可能表明存在潜在问题,在这种情况下您可以检查以下内容:

如果存在类加载问题,例如泄漏的加载器。在这种情况下,可以借助类加载器视图来解决问题。 如果有字符串被大量拘留。对于此类问题的检测,可以使用对象分配记录。

【讨论】:

最好不要链接到外部网站,因为页面经常被移动或删除并且链接会损坏。

以上是关于Java 非堆内存和栈内存有啥区别?它们是不是相同,如果不同,它们之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Java堆和栈的区别和介绍,JVM的堆和栈

java基础学习堆和栈的区别详解

JVM堆和栈的区别

java中堆和栈的区别

java中堆和栈的区别!!!!

Java中堆内存和栈内存的区别