Module  java.management
软件包  java.lang.management

Interface MemoryMXBean

  • All Superinterfaces:
    PlatformManagedObject


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

    Java虚拟机具有此接口的实现类的单个实例。 这种情况下实现此接口是MXBean ,可以通过调用能够得到ManagementFactory.getMemoryMXBean()方法或从platform MBeanServer方法。

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

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

    记忆

    Java虚拟机的内存系统管理以下几种内存:

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

    堆可能是一个固定的大小或可能扩大和缩小。 堆的内存不需要是连续的。

    2.非堆存储器

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

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

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

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

    内存池和内存管理器

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

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

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

    内存使用监控

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

    可以通过三种方式监视内存使用情况:

    • 轮询
    • 使用阈值通知
    • 集合使用阈值通知
    详细信息在MemoryPoolMXBean界面中指定。

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

    通知

    MemoryMXBeanNotificationEmitter其中如果任何一个存储器池支持usage thresholdcollection usage threshold ,其可以通过调用MemoryPoolMXBean.isUsageThresholdSupported()MemoryPoolMXBean.isCollectionUsageThresholdSupported()方法来确定。

    发出的通知是一个Notification实例,其user data设置为CompositeData ,表示一个MemoryNotificationInfo对象,该对象包含有关构建通知时内存池的信息。 所述CompositeData含有作为中描述的属性MemoryNotificationInfo


    的NotificationEmitter

    所述MemoryMXBean通过返回对象ManagementFactory.getMemoryMXBean()实现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
    另请参见:
    ManagementFactory.getPlatformMXBeans(Class)JMX Specification.Ways to Access MXBeans
    • 方法详细信息

      • getObjectPendingFinalizationCount

        int getObjectPendingFinalizationCount​()
        返回正在等待完成的对象的大致数量。
        结果
        最终定案待处理的大致数字对象。
      • getHeapMemoryUsage

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

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

        MBeanServer访问
        MemoryUsage的映射类型为CompositeData ,其属性在MemoryUsage指定。

        结果
        表示堆内存使用的MemoryUsage对象。
      • getNonHeapMemoryUsage

        MemoryUsage getNonHeapMemoryUsage​()
        新新新新旗新新新新旗新新旗新新旗新新旗新新旗旗新新旗新新200新新新旗200新新新新旗: 非堆存储器由一个或多个内存池组成。 返回的内存使用量的usedcommitted大小是所有非堆内存池的值的总和,而返回的内存使用量的initmax大小表示非堆内存的设置,可能不是所有非堆内存池的那些。

        MBeanServer访问
        MemoryUsage的映射类型为CompositeData ,属性如MemoryUsage所述

        结果
        表示非堆内存使用的MemoryUsage对象。
      • isVerbose

        boolean isVerbose​()
        测试是否启用了内存系统的详细输出。
        结果
        true如果启用了内存系统的详细输出; 否则为false
      • setVerbose

        void setVerbose​(boolean value)
        启用或禁用内存系统的详细输出。 发出详细信息的详细输出信息和输出流是依赖于实现的。 通常,当Java虚拟机实现在垃圾收集时释放内存时,将打印出一条消息。

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

        参数
        value - true启用详细输出; false禁用。
        异常
        SecurityException - 如果安全管理器存在并且调用者没有ManagementPermission(“控制”)。
      • gc

        void gc​()
        运行垃圾回收器。 电话gc()有效地等效于通话:
         System.gc()
         
        另请参见:
        System.gc()