public interface MemoryMXBean
Java 虚拟机内存系统的管理接口。
Java 虚拟机具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean ,可以通过调用 ManagementFactory.getMemoryMXBean()
方法或从平台 MBeanServer
方法获得。
在 MBeanServer 中唯一标识内存系统的 MXBean 的 ObjectName 为:
java.lang:type=Memory
Java 虚拟机的内存系统管理以下类型的内存:
Java 虚拟机具有一个堆 ,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。对象的堆内存由称为垃圾回收器 的自动内存管理系统回收。
堆的大小可以固定,也可以扩大和缩小。堆的内存不需要是连续空间。
Java 虚拟机管理堆之外的内存(称为非堆内存 )。
Java 虚拟机具有一个由所有线程共享的方法区 。方法区属于非堆内存。它存储每个类结构,如运行时常量池、字段和方法数据,以及方法和构造方法的代码。它是在 Java 虚拟机启动时创建的。
方法区在逻辑上是堆的一部分,但 Java 虚拟机实现可以选择不对其进行回收或压缩。与堆类似,方法区的大小可以固定,也可以扩大和缩小。方法区的内存不需要是连续空间。
除了方法区外,Java 虚拟机实现可能需要用于内部处理或优化的内存,这种内存也是非堆内存。例如,JIT 编译器需要内存来存储从 Java 虚拟机代码转换而来的本机代码,从而获得高性能。
内存池
和内存管理器
都是抽象实体,对 Java 虚拟机的内存系统进行监视和管理。
内存池表示 Java 虚拟机管理的内存区域。Java 虚拟机至少有一个内存池,而且可以在执行期间创建或删除内存池。内存池可以是堆内存,也可以是非堆内存。
内存管理器负责管理一个或多个内存池。垃圾回收器就是一种内存管理器,负责回收不可到达对象占用的内存。Java 虚拟机可以有一个或多个内存管理器。可以在运行期间添加或删除内存管理器。一个内存池可以由多个内存管理器进行管理。
对于内存系统而言,内存使用量是一个非常重要的监视属性。例如,内存使用量可以指示:
可以采用三种方式监视内存使用量:
具体细节在 MemoryPoolMXBean
接口中指定。
内存使用量监视机制旨在用于负载平衡或工作负载分布。例如,应用程序在其内存使用量超过特定阈值时,将会停止接收任何新的工作负载。它不适合用于供应用程序进行检测并从低内存情况恢复。
此 MemoryMXBean 是一个 NotificationEmitter
,如果任何一个内存池支持使用量阈值 或集合使用量阈值 (可以通过调用 MemoryPoolMXBean.isUsageThresholdSupported()
和 MemoryPoolMXBean.isCollectionUsageThresholdSupported()
方法确定),它将发出两种类型的通知
。
使用量阈值超过通知
- 用于通知内存池的内存使用量增加,已达到或超过其使用量阈值 。 集合使用量阈值超过通知
- 用于通知在 Java 虚拟机对内存池中不使用的对象进行了回收工作之后,该内存池的内存使用量已大于或等于其集合使用量阈值 。 发出的通知是一个 Notification
实例,其用户数据
设置为 CompositeData
(表示包含构造该通知时内存池信息的 MemoryNotificationInfo
对象)。CompositeData 包含 MemoryNotificationInfo
中描述的各个属性。
ManagementFactory.getMemoryMXBean()
返回的 MemoryMXBean 对象实现了 NotificationEmitter
接口,该接口允许在 MemoryMXBean 中将侦听器注册为通知侦听器。 以下示例代码将注册 MyListener 以处理 MemoryMXBean 发出的通知。
class MyListener implements javax.management.NotificationListener { public void handleNotification(Notification notif, Object handback) { // handle notification .... } } MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); NotificationEmitter emitter = (NotificationEmitter) mbean; MyListener listener = new MyListener(); emitter.addNotificationListener(listener, null, null);
<!-- ========== METHOD SUMMARY =========== --><!-- -->
方法摘要 void |
gc () 运行垃圾回收器。 |
MemoryUsage |
getHeapMemoryUsage () 返回用于对象分配的堆的当前内存使用量。 |
MemoryUsage |
getNonHeapMemoryUsage () 返回 Java 虚拟机使用的非堆内存的当前内存使用量。 |
int |
getObjectPendingFinalizationCount () 返回其终止被挂起的对象的近似数目。 |
boolean |
isVerbose () 测试内存系统的 verbose 输出是否已启用。 |
void |
setVerbose (booleanvalue) 启用或禁用内存系统的 verbose 输出。 |
<!-- ============ METHOD DETAIL ========== --><!-- -->
方法详细信息int getObjectPendingFinalizationCount ()
MemoryUsage getHeapMemoryUsage ()
返回的内存使用量中已使用内存量为活动对象和尚未回收的垃圾对象(如果有)所占用内存的总量。
MBeanServer 访问 :
MemoryUsage 的映射类型为 CompositeData ,具有 MemoryUsage
中指定的属性。
MemoryUsage
对象。
MemoryUsage getNonHeapMemoryUsage ()
MBeanServer 访问 :
MemoryUsage 的映射类型为 CompositeData ,具有 MemoryUsage
中指定的属性。
MemoryUsage
对象。
boolean isVerbose ()
void setVerbose (booleanvalue)
此方法的每次调用都会全局启用或禁用 verbose 输出。
value
- 为
true 将启用 verbose 输出;为
false 将禁用输出。
SecurityException
- 如果存在安全管理器,且调用方不具有 ManagementPermission("control")。
void gc ()
gc()
实际上等同于调用:
System.gc()
System.gc()
<!-- ========= END OF CLASS DATA ========= -->