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

时间:2014-09-16 11:48:13

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

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

  1. 堆内存使用
  2. 非堆内存使用
  3. Memory Pool" CMS Old Gen"
  4. 记忆池" Par Eden Space"
  5. 记忆池" Par Survivor Space"
  6. 内存池"代码缓存"
  7. Memory Pool" CMS Perm Gen"
  8. 这些条款之间有什么区别。另请提供一些信息 - 如何通过监控这些参数来查找应用程序行为异常。

3 个答案:

答案 0 :(得分:11)

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

  1. 堆栈
  2. 静态(有多种变化)
  3. 祝你熟悉。

    堆栈你也熟悉,但你不知道。当你有一个" local"变量,这些变量在"调用框架中分配"。 "调用框架"在您调用方法时分配,并在从方法返回时删除,因此使用"堆栈"最有效地实现它。随着回调而增长,随着回报而缩小。

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

    堆栈所需的空间通常相当小,并且与“#Heap Memory"在上面的类别中。

答案 1 :(得分:8)

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

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

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

答案 2 :(得分:1)

请点击http://www.yourkit.com/docs/kb/sizes.jsphttp://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在非堆内存上提供的唯一信息是它的整体大小。没有关于非堆内存内容的详细信息。

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

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