首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有运行代码缓存内存池的垃圾收集

没有运行代码缓存内存池的垃圾收集
EN

Stack Overflow用户
提问于 2012-05-08 06:01:51
回答 2查看 7.7K关注 0票数 1

当我使用GarbageCollectorMXBean打印垃圾收集的详细信息时,输出显示以下信息:

代码语言:javascript
复制
Name: PS ScavengeCollection 
count: 72
Collection time: 3041
Memory Pools:   PS Eden Space   PS Survivor Space

Name: PS MarkSweepCollection 
count: 5
Collection time: 4922
Memory Pools:   PS Eden Space   PS Survivor Space   PS Old Gen 

现在,非常正确的是,ScavengeCollection和MarkSweep集合涵盖了5个可用内存池中的4个(不包括在内)。

代码缓存(非堆内存)。

我想知道为什么垃圾收集站从来不跑

由CodeCacheManager内存池管理的代码缓存内存池。

这是否意味着GC从不从CodeCacheManager内存池中垃圾收集对象??

有同样的意义吗?

EN

回答 2

Stack Overflow用户

发布于 2012-05-08 06:32:47

阅读MemoryMXBean的文档。特别是关于非堆内存的部分:

Java虚拟机管理堆以外的内存(称为非堆内存)。Java虚拟机有一个在所有线程之间共享的方法区域。该方法区域属于非堆内存。它存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码。它是在Java虚拟机启动时创建的。 方法区域在逻辑上是堆的一部分,但是Java虚拟机实现可以选择不垃圾收集或压缩它。类似于堆,方法区域可以是固定大小的,也可以扩展和缩小。方法区域的内存不需要是连续的。 除了方法区域之外,Java虚拟机实现可能需要内存来进行内部处理或优化,这也属于非堆内存。例如,JIT编译器需要内存来存储从Java虚拟机代码转换而来的本机代码,以获得高性能。

你问的非堆叠记忆里有什么?

永久生成:包含虚拟机本身的所有反射数据的池,例如类和方法对象。通过使用类数据共享的Java,这一代被划分为只读和读写区域。

代码缓存:Java还包括一个代码缓存,其中包含用于编译和存储本机代码的内存。

票数 3
EN

Stack Overflow用户

发布于 2014-10-14 09:39:33

代码缓存是一个非堆空间,它是垃圾收集的,但不是由普通GC线程收集的。相反,它是由JIT的助手线程收集的,因此它不会以其他内存池出现的方式出现。不幸的是,Cache不支持通知,因此您必须轮询或想出另一种方法来监视内存使用情况。

总之,总内存使用量可能没有帮助,因为代码缓存中的代码块无法移动,这意味着代码缓存无法压缩。因此,您可能有大量的内存,但如果它是支离破碎的,您仍然可能遭受分配失败,如果JIT线程不能正确,则清除缓存将导致JIT关闭。它不会在JVM的生存期内重新启动。

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

https://stackoverflow.com/questions/10493348

复制
相关文章

相似问题

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