首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >堆的PermGen空间

堆的PermGen空间
EN

Stack Overflow用户
提问于 2013-11-21 11:17:25
回答 5查看 2.9K关注 0票数 4

图像所示,Permgen进一步分为几个部分。

运行时常量池存储与类加载器加载的每种类型有关的常量。 方法区域存储方法返回类型、方法名称等方法信息。(如果我错了,请纠正我。) 而预留区是在permgen需要更多内存的情况下保留的部分。

但我不明白的是,图像中的代码区域是什么?任何代码都存储在这个空间中(在我看来似乎很模糊)?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-11-21 11:51:13

代码语言:javascript
复制
Any code is stored in this space(seems vague to me)?

有什么特别的原因吗?

可能的答案可能是:代码区域存储加载到内存中的类的字节代码。

但是接下来的问题是:为什么不直接在内存中加载类?

因为我们有一个JVM来提供互操作性,因为JVM是java代码和机器之间的中介,所以我们需要一些地方来存储代码语句,直到OS计划JVM执行其代码(因为OS是一个进程)。因此,它加载代码区域中的字节代码(如果我是正确的),并在计划时进一步将代码(.class)解释为底层机器指令。

我的答案是“代码区域保存类的字节代码”。

为了支持上面提到的想法,下面是从Oracle博客复制的一些概念,它说:

因此Java类存储在永久代中。这一切意味着什么?除了Java类的基本字段之外,还有:

  1. 类的方法(包括字节码)
  2. 类的名称(以指向字符串的对象的形式,也是在永久生成中)
  3. 常量池信息(从类文件中读取的数据,请参阅JVM规范第4章中的所有细节)。
  4. 与类关联的对象数组和类型数组(例如,包含对方法的引用的对象数组)。
  5. JVM创建的内部对象(例如java/lang/Object或java/lang/exception )
  6. 用于编译器优化的信息(JITs)

希望一切都过去了。

票数 2
EN

Stack Overflow用户

发布于 2013-11-21 11:54:44

来自一篇关于PermGen:Java 8会解决PermGen OutOfMemoryError吗?问题的有趣文章

Oracle在他的博客中解释了永久生成的目的:永久生成包含关于类的信息,例如字节码、名称和JIT信息。它存储在一个单独的空间中,因为它大多是静态的,而垃圾收集可以通过将其分离来得到更多的优化。

票数 0
EN

Stack Overflow用户

发布于 2013-11-21 11:58:52

实际上,PermGen存储了所有的静态代码。我认为这对您来说是有道理的,为什么在PermGen中有一个代码区域。

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

https://stackoverflow.com/questions/20119478

复制
相关文章

相似问题

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