首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java非堆内存和堆栈内存有什么区别?他们是一样的,如果不是,他们之间有什么区别?

Java非堆内存和堆栈内存有什么区别?他们是一样的,如果不是,他们之间有什么区别?
EN

Stack Overflow用户
提问于 2014-09-16 11:48:12
回答 3查看 46.4K关注 0票数 22

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

  1. 堆内存使用
  2. 非堆内存使用
  3. 内存池"CMS老一代“
  4. 记忆池“标准伊甸园空间”
  5. 内存池"Par幸存者空间“
  6. 内存池“代码缓存”
  7. 内存池"CMS Perm Gen“

这些术语之间的区别是什么。另外,请提供关于-如何通过监视这些参数来发现应用程序行为中的异常的一些信息。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-09-16 11:57:20

在所有基于C的语言(和大多数其他语言)中,基本上有三种类型的存储:

  1. 堆栈
  2. 静态(有几种变化)

你很熟悉的堆。

堆栈,你也很熟悉,但你就是不知道。当您有一个带有“局部变量”的方法时,这些变量将在“调用框架”中分配。“调用框架”是在调用方法时分配的,在从方法返回时被删除,因此使用随调用增长和随返回收缩的“堆栈”来实现它是最有效的。

静态是没有显式分配的东西,本质上是从程序执行开始时就存在的。

堆栈所需的空间通常是相当小的,并在上面的类别中与“非堆内存”放在一起。

票数 16
EN

Stack Overflow用户

发布于 2014-09-16 11:52:16

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

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

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

票数 15
EN

Stack Overflow用户

发布于 2014-09-16 11:51:55

请按照http://www.yourkit.com/docs/kb/sizes.jspheaps.html的链接

另外,JVM的内存不是堆,称为非堆内存.它在JVM启动时创建,并存储每个类的结构,如运行时常量池、字段和方法数据、方法和构造函数的代码以及内部字符串。

不幸的是,JVM在非堆内存上提供的唯一信息是它的总体大小。没有关于非堆内存内容的详细信息。

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

如果存在类加载问题,如泄漏加载器。在这种情况下,这个问题可以通过类加载器视图来解决。如果有大量的字符串被拘留。为了检测这样的问题,可以使用对象分配记录。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25867989

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档