java.lang.management

接口
异常
public interface MemoryMXBean

Java 虚拟机内存系统的管理接口。

Java 虚拟机具有此接口的实现类的单一实例。实现此接口的实例是一个 MXBean,可以通过调用 ManagementFactory.getMemoryMXBean() 方法或从平台 MBeanServer 方法获得。

在 MBeanServer 中唯一标识内存系统的 MXBean 的 ObjectName 为:

java.lang:type=Memory

内存

Java 虚拟机的内存系统管理以下类型的内存:

1. 堆

Java 虚拟机具有一个 ,堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。对象的堆内存由称为 垃圾回收器 的自动内存管理系统回收。

堆的大小可以固定,也可以扩大和缩小。堆的内存不需要是连续空间。

2. 非堆内存

Java 虚拟机管理堆之外的内存(称为 非堆内存)。

Java 虚拟机具有一个由所有线程共享的方法区。方法区属于非堆内存。它存储每个类结构,如运行时常量池、字段和方法数据,以及方法和构造方法的代码。它是在 Java 虚拟机启动时创建的。

方法区在逻辑上是堆的一部分,但 Java 虚拟机实现可以选择不对其进行回收或压缩。与堆类似,方法区的大小可以固定,也可以扩大和缩小。方法区的内存不需要是连续空间。

除了方法区外,Java 虚拟机实现可能需要用于内部处理或优化的内存,这种内存也是非堆内存。例如,JIT 编译器需要内存来存储从 Java 虚拟机代码转换而来的本机代码,从而获得高性能。

内存池和内存管理器

内存池内存管理器都是抽象实体,对 Java 虚拟机的内存系统进行监视和管理。

内存池表示 Java 虚拟机管理的内存区域。Java 虚拟机至少有一个内存池,而且可以在执行期间创建或删除内存池。内存池可以是堆内存,也可以是非堆内存。

内存管理器负责管理一个或多个内存池。垃圾回收器就是一种内存管理器,负责回收不可到达对象占用的内存。Java 虚拟机可以有一个或多个内存管理器。可以在运行期间添加或删除内存管理器。一个内存池可以由多个内存管理器进行管理。

内存使用量监视

对于内存系统而言,内存使用量是一个非常重要的监视属性。例如,内存使用量可以指示:
  • 应用程序的内存使用量,
  • 自动内存管理系统上的工作负载,
  • 潜在的内存泄漏。

可以采用三种方式监视内存使用量:

  • 轮询
  • 使用量阈值通知
  • 集合使用量阈值通知
具体细节在 MemoryPoolMXBean 接口中指定。

内存使用量监视机制旨在用于负载平衡或工作负载分布。例如,应用程序在其内存使用量超过特定阈值时,将会停止接收任何新的工作负载。它不适合用于供应用程序进行检测并从低内存情况恢复。

通知

MemoryMXBean 是一个 NotificationEmitter,如果任何一个内存池支持使用量阈值集合使用量阈值(可以通过调用 MemoryPoolMXBean.isUsageThresholdSupported()MemoryPoolMXBean.isCollectionUsageThresholdSupported() 方法确定),它将发出两种类型的通知

发出的通知是一个 Notification 实例,其用户数据设置为 CompositeData(表示包含构造该通知时内存池信息的 MemoryNotificationInfo 对象)。CompositeData 包含 MemoryNotificationInfo 中描述的各个属性。


NotificationEmitter

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);
 

从以下版本开始:
1.5
另请参见:
JMX Specification., Ways to Access MXBeans

方法摘要
 void gc()
          运行垃圾回收器。
 MemoryUsage getHeapMemoryUsage()
          返回用于对象分配的堆的当前内存使用量。
 MemoryUsage getNonHeapMemoryUsage()
          返回 Java 虚拟机使用的非堆内存的当前内存使用量。
 int getObjectPendingFinalizationCount()
          返回其终止被挂起的对象的近似数目。
 boolean isVerbose()
          测试内存系统的 verbose 输出是否已启用。
 void setVerbose(boolean value)
          启用或禁用内存系统的 verbose 输出。
 

方法详细信息

getObjectPendingFinalizationCount

int getObjectPendingFinalizationCount()
返回其终止被挂起的对象的近似数目。

返回:
其终止被挂起的对象的近似数目。

getHeapMemoryUsage

MemoryUsage getHeapMemoryUsage()
返回用于对象分配的堆的当前内存使用量。堆由一个或多个内存池组成。返回的内存使用量中的 已使用大小和 已提交大小为所有堆内存池的对应值的总和,而返回的内存使用量中表示堆内存设置的 初始大小和 最大大小则可能不等于所有堆内存池对应值的总和。

返回的内存使用量中已使用内存量为活动对象和尚未回收的垃圾对象(如果有)所占用内存的总量。

MBeanServer 访问
MemoryUsage 的映射类型为 CompositeData,具有 MemoryUsage 中指定的属性。

返回:
表示堆内存使用量的 MemoryUsage 对象。

getNonHeapMemoryUsage

MemoryUsage getNonHeapMemoryUsage()
返回 Java 虚拟机使用的非堆内存的当前内存使用量。非堆内存由一个或多个内存池组成。返回的内存使用量中的 已使用大小和 已提交大小为所有非堆内存池的对应值的总和,而返回的内存使用量中表示非堆内存设置的 初始大小和 最大大小则可能不等于所有非堆内存池对应值的总和。

MBeanServer 访问
MemoryUsage 的映射类型为 CompositeData,具有 MemoryUsage 中指定的属性。

返回:
表示非堆内存使用量的 MemoryUsage 对象。

isVerbose

boolean isVerbose()
测试内存系统的 verbose 输出是否已启用。

返回:
如果启用了内存系统的 verbose 输出,则返回 true;否则返回 false

setVerbose

void setVerbose(boolean value)
启用或禁用内存系统的 verbose 输出。verbose 输出信息和 verbose 信息发送到的输出流都与实现有关。通常,只要垃圾回收时释放了内存,Java 虚拟机实现就会输出一条消息。

此方法的每次调用都会全局启用或禁用 verbose 输出。

参数:
value - 为 true 将启用 verbose 输出;为 false 将禁用输出。
抛出:
SecurityException - 如果存在安全管理器,且调用方不具有 ManagementPermission("control")。

gc

void gc()
运行垃圾回收器。调用 gc() 实际上等同于调用:
 System.gc()
 

另请参见:
System.gc()