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 非堆内存和栈内存有啥区别?它们是不是相同,如果不同,它们之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章