任何内存池 bean 中的 CollectionUsage、PeakUsage、Usage 字段有什么区别?
我在 jconsole 窗口中的任何应用程序的路径中看到了这些:
mbeans tab > java.lang > memorypool > select any bean。
在右侧窗格中,我们可以看到这些属性。
1 回答
它们都在MemoryPoolMXBean的 javadocs 中进行了描述
内存使用情况
getUsage() 方法提供对内存池当前使用情况的估计。对于垃圾回收的内存池,已用内存量包括池中所有对象占用的内存,包括可达对象和不可达对象。
通常,此方法是一种轻量级操作,用于获取大致的内存使用情况。对于某些内存池,例如,当对象不是连续打包时,这种方法可能是一项昂贵的操作,需要一些计算来确定当前的内存使用情况。实现应该记录这种情况。
峰值内存使用
自虚拟机启动或峰值重置以来,Java 虚拟机保持内存池的峰值内存使用量。峰值内存使用由 getPeakUsage() 方法返回,并通过调用 resetPeakUsage() 方法重置。
集合使用阈值
收集使用阈值是一个可管理的属性,仅适用于某些垃圾收集的内存池。在 Java 虚拟机通过在垃圾回收时回收内存池中未使用的对象来回收内存空间之后,内存池中被垃圾回收的一些字节数仍将被使用。集合使用阈值允许为此字节数设置一个值,这样如果超过阈值,MemoryMXBean 将发出超出集合使用阈值的通知。此外,收集使用阈值计数将增加。
isCollectionUsageThresholdSupported() 方法可用于确定是否支持此功能。
Java 虚拟机基于内存池执行集合使用阈值检查。如果集合使用阈值设置为正值,则启用此检查。如果收集使用阈值设置为零,则在此内存池上禁用此检查。默认值为零。Java 虚拟机在垃圾收集时执行收集使用阈值检查。
一些垃圾收集的内存池可能选择不支持收集使用阈值。例如,内存池仅由连续并发垃圾收集器管理。对象可以由某个线程在此内存池中分配,而未使用的对象则由并发垃圾收集器同时回收。除非有明确定义的垃圾收集时间,这是检查内存使用情况的最佳合适时间,否则不应支持收集使用阈值。
集合使用阈值是为在 Java 虚拟机花费精力回收内存空间后监控内存使用情况而设计的。收集使用也可以由上述轮询和阈值通知机制以类似方式监视使用阈值。