Module java.management

Interface MemoryMXBean

所有超级接口:
PlatformManagedObject

public interface MemoryMXBean extends PlatformManagedObject
Java虚拟机的内存系统的管理接口。

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

用于在MBeanServer中唯一标识内存系统的MXBean的ObjectName是:

java.lang:type=Memory
可以通过调用PlatformManagedObject.getObjectName()方法获取。

内存

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

1. 堆

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

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

2. 非堆内存

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

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

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

除了方法区,Java虚拟机实现可能需要内存用于内部处理或优化,这也属于非堆内存。例如,JIT编译器需要内存来存储从Java虚拟机代码翻译为本机机器代码以实现高性能所需的代码。

内存池和内存管理器

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

内存池表示Java虚拟机管理的内存区域。Java虚拟机至少有一个内存池,并且在执行过程中可能创建或删除内存池。内存池可以属于堆内存或非堆内存。

内存管理器负责管理一个或多个内存池。垃圾收集器是一种负责回收不可达对象占用的内存的内存管理器类型。Java虚拟机可能有一个或多个内存管理器。它可以在执行过程中添加或删除内存管理器。一个内存池可以由多个内存管理器管理。

内存使用监控

内存使用是内存系统的一个非常重要的监控属性。例如,内存使用可能表示:
  • 应用程序的内存使用情况,
  • 自动内存管理系统所施加的工作负载,
  • 潜在的内存泄漏。

内存使用可以通过以下三种方式进行监控:

  • 轮询
  • 使用阈值通知
  • 收集使用阈值通知
详细信息在MemoryPoolMXBean接口中指定。

内存使用监控机制旨在用于负载平衡或工作负载分配。例如,当应用程序的内存使用超过某个阈值时,应用程序将停止接收任何新的工作负载。它不适用于应用程序检测和恢复低内存条件。

通知

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

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


NotificationEmitter

ManagementFactory.getMemoryMXBean()返回的MemoryMXBean对象实现了NotificationEmitter接口,允许在MemoryMXBean内注册监听器作为通知监听器。以下是一个示例代码,注册一个MyListener来处理MemoryMXBean发出的通知。
 class MyListener implements javax.management.NotificationListener {
     public void handleNotification(Notification notif, Object handback) {
         // 处理通知
         ....
     }
 }

 MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
 NotificationEmitter emitter = (NotificationEmitter) mbean;
 MyListener listener = new MyListener();
 emitter.addNotificationListener(listener, null, null);
 
自Java版本:
1.5
参见:
  • Method Details

    • getObjectPendingFinalizationCount

      @Deprecated(since="18") int getObjectPendingFinalizationCount()
      Deprecated.
      Finalization has been deprecated for removal. See Object.finalize() for details.
      返回待终结的对象的近似数量。
      返回:
      待终结的对象的近似数量。如果此MemoryMXBean包含有关已禁用或删除终结的JVM的信息,则此方法始终返回零。
    • getHeapMemoryUsage

      MemoryUsage getHeapMemoryUsage()
      返回用于对象分配的堆的当前内存使用情况。堆由一个或多个内存池组成。返回的内存使用的usedcommitted大小是所有堆内存池的这些值的总和,而返回的内存使用的initmax大小表示堆内存的设置,可能不是所有堆内存池的总和。

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

      MBeanServer访问:
      MemoryUsage的映射类型是具有MemoryUsage中指定属性的CompositeData

      返回:
      代表堆内存使用情况的MemoryUsage对象。
    • getNonHeapMemoryUsage

      MemoryUsage getNonHeapMemoryUsage()
      返回Java虚拟机使用的非堆内存的当前内存使用情况。非堆内存由一个或多个内存池组成。返回的内存使用的usedcommitted大小是所有非堆内存池的这些值的总和,而返回的内存使用的initmax大小表示非堆内存的设置,可能不是所有非堆内存池的总和。

      MBeanServer访问:
      MemoryUsage的映射类型是具有MemoryUsage中指定属性的CompositeData

      返回:
      一个表示非堆内存使用情况的MemoryUsage对象。
    • isVerbose

      boolean isVerbose()
      检查内存系统的详细输出是否已启用。
      返回:
      如果内存系统的详细输出已启用,则返回true; 否则返回false
    • setVerbose

      void setVerbose(boolean value)
      启用或禁用内存系统的详细输出。详细输出信息和发出详细信息的输出流取决于实现。通常,Java虚拟机实现在垃圾回收时释放内存时打印消息。

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

      参数:
      value - true 启用详细输出; false 禁用详细输出。
      抛出:
      SecurityException - 如果存在安全管理器且调用者没有ManagementPermission("control")。
    • gc

      void gc()
      运行垃圾收集器。调用gc()实际上等效于调用:
       System.gc()
       
      参见: