我正在使用Jconsole监视Java应用程序。内存选项卡显示不同的堆和非堆内存,如
这些术语之间的区别是什么。另外,请提供关于-如何通过监视这些参数来发现应用程序行为中的异常的一些信息。
发布于 2014-09-16 11:57:20
在所有基于C的语言(和大多数其他语言)中,基本上有三种类型的存储:
你很熟悉的堆。
堆栈,你也很熟悉,但你就是不知道。当您有一个带有“局部变量”的方法时,这些变量将在“调用框架”中分配。“调用框架”是在调用方法时分配的,在从方法返回时被删除,因此使用随调用增长和随返回收缩的“堆栈”来实现它是最有效的。
静态是没有显式分配的东西,本质上是从程序执行开始时就存在的。
堆栈所需的空间通常是相当小的,并在上面的类别中与“非堆内存”放在一起。
发布于 2014-09-16 11:52:16
非堆内存是JVM为堆以外的目的分配的所有内存。这包括:
在您的列表中,"CMS旧世代“、"Par Eden Space”、"Par Survivor Space“和"CMS Perm Gen”都是指堆的各个部分。
发布于 2014-09-16 11:51:55
请按照http://www.yourkit.com/docs/kb/sizes.jsp和heaps.html的链接
另外,JVM的内存不是堆,称为非堆内存.它在JVM启动时创建,并存储每个类的结构,如运行时常量池、字段和方法数据、方法和构造函数的代码以及内部字符串。
不幸的是,JVM在非堆内存上提供的唯一信息是它的总体大小。没有关于非堆内存内容的详细信息。
非堆内存大小的异常增长可能表明存在潜在问题,在这种情况下,您可以检查以下内容:
如果存在类加载问题,如泄漏加载器。在这种情况下,这个问题可以通过类加载器视图来解决。如果有大量的字符串被拘留。为了检测这样的问题,可以使用对象分配记录。
https://stackoverflow.com/questions/25867989
复制相似问题