我正在使用Jconsole来监控Java应用程序。内存选项卡显示不同的堆和非堆内存,如
这些条款之间有什么区别。另请提供一些信息 - 如何通过监控这些参数来查找应用程序行为异常。
答案 0 :(得分:11)
所有基于C的语言(以及大多数其他语言)基本上有三类存储:
祝你熟悉。
堆栈你也熟悉,但你不知道。当你有一个" local"变量,这些变量在"调用框架中分配"。 "调用框架"在您调用方法时分配,并在从方法返回时删除,因此使用"堆栈"最有效地实现它。随着回调而增长,随着回报而缩小。静态是你没有明确分配的东西,并且从程序执行开始时就存在。
堆栈所需的空间通常相当小,并且与“#Heap Memory"在上面的类别中。
答案 1 :(得分:8)
非堆内存是JVM为堆以外的目的分配的所有内存。这包括:
在您的列表中,“CMS Old Gen”,“Par Eden Space”,“Par Survivor Space”和“CMS Perm Gen”,都是指堆的各个部分。
答案 2 :(得分:1)
请点击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在非堆内存上提供的唯一信息是它的整体大小。没有关于非堆内存内容的详细信息。
非堆内存大小的异常增长可能表示存在潜在问题,在这种情况下,您可以检查以下内容:
如果存在类加载问题,例如泄漏的加载器。在这种情况下,可以借助类加载器视图解决问题。 如果有字符串被大量实施。为了检测这种问题,可以使用对象分配记录。