首页 文章

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

提问于
浏览
12

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

  • 堆内存使用情况

  • 非堆内存使用情况

  • Memory Pool "CMS Old Gen"

  • Memory Pool "Par Eden Space"

  • Memory Pool "Par Survivor Space"

  • Memory Pool "Code Cache"

  • Memory Pool "CMS Perm Gen"

这些术语有什么区别 . 另外,请提供一些信息 - 如何通过监视这些参数来查找应用程序行为中的异常 .

3 回答

  • 8

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

    • 堆栈

    • 静态(有几种变化)

    你熟悉了 .

    堆栈你也熟悉,但你只是不知道 . 如果您有一个带有“本地”变量的方法,那么这些变量将在“调用框架”中分配 . 调用方法时会分配“调用框架”,而当从方法返回时会删除“调用框架”,因此使用随着调用而增长的“堆栈”和使用返回收缩的“堆栈”最有效地实现它 .

    静态是您没有明确分配的东西,并且从程序执行开始时基本上存在 .

    堆栈所需的空间通常相当小,并且在上面的类别中与“非堆内存”混为一谈 .

  • 1

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

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

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

  • 11

    请点击链接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在非堆内存上提供的唯一信息是它的整体大小 . 没有关于非堆内存内容的详细信息 .

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

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

相关问题