当我使用GarbageCollectorMXBean打印垃圾收集的详细信息时,输出显示以下信息:
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内存池中垃圾收集对象??
有同样的意义吗?
发布于 2012-05-08 06:32:47
阅读MemoryMXBean的文档。特别是关于非堆内存的部分:。
Java虚拟机管理堆以外的内存(称为非堆内存)。Java虚拟机有一个在所有线程之间共享的方法区域。该方法区域属于非堆内存。它存储每个类的结构,例如运行时常量池、字段和方法数据,以及方法和构造函数的代码。它是在Java虚拟机启动时创建的。 方法区域在逻辑上是堆的一部分,但是Java虚拟机实现可以选择不垃圾收集或压缩它。类似于堆,方法区域可以是固定大小的,也可以扩展和缩小。方法区域的内存不需要是连续的。 除了方法区域之外,Java虚拟机实现可能需要内存来进行内部处理或优化,这也属于非堆内存。例如,JIT编译器需要内存来存储从Java虚拟机代码转换而来的本机代码,以获得高性能。
你问的非堆叠记忆里有什么?
永久生成:包含虚拟机本身的所有反射数据的池,例如类和方法对象。通过使用类数据共享的Java,这一代被划分为只读和读写区域。
代码缓存:Java还包括一个代码缓存,其中包含用于编译和存储本机代码的内存。
发布于 2014-10-14 09:39:33
代码缓存是一个非堆空间,它是垃圾收集的,但不是由普通GC线程收集的。相反,它是由JIT的助手线程收集的,因此它不会以其他内存池出现的方式出现。不幸的是,Cache不支持通知,因此您必须轮询或想出另一种方法来监视内存使用情况。
总之,总内存使用量可能没有帮助,因为代码缓存中的代码块无法移动,这意味着代码缓存无法压缩。因此,您可能有大量的内存,但如果它是支离破碎的,您仍然可能遭受分配失败,如果JIT线程不能正确,则清除缓存将导致JIT关闭。它不会在JVM的生存期内重新启动。
https://stackoverflow.com/questions/10493348
复制相似问题