- 所有超级接口:
-
PlatformManagedObject
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()
方法确定。
使用阈值超出通知
- 用于通知内存池的内存使用增加并已达到或超过其使用阈值值。收集使用阈值超出通知
- 用于通知内存池的内存使用大于或等于其收集使用阈值值,在Java虚拟机在回收该内存池中未使用对象后已经努力过。
发出的通知是一个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) { // 处理通知 .... } } MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); NotificationEmitter emitter = (NotificationEmitter) mbean; MyListener listener = new MyListener(); emitter.addNotificationListener(listener, null, null);
- 自Java版本:
- 1.5
- 参见:
-
Method Summary
Modifier and TypeMethodDescriptionvoid
gc()
运行垃圾收集器。返回用于对象分配的堆的当前内存使用情况。返回Java虚拟机使用的非堆内存的当前内存使用情况。int
已弃用。终结已被弃用以移除。boolean
测试内存系统的详细输出是否已启用。void
setVerbose
(boolean value) 启用或禁用内存系统的详细输出。Methods declared in interface java.lang.management.PlatformManagedObject
getObjectName
-
Method Details
-
getObjectPendingFinalizationCount
Deprecated.Finalization has been deprecated for removal. SeeObject.finalize()
for details.返回待终结的对象的近似数量。- 返回:
- 待终结的对象的近似数量。如果此MemoryMXBean包含有关已禁用或删除终结的JVM的信息,则此方法始终返回零。
-
getHeapMemoryUsage
MemoryUsage getHeapMemoryUsage()返回用于对象分配的堆的当前内存使用情况。堆由一个或多个内存池组成。返回的内存使用的used
和committed
大小是所有堆内存池的这些值的总和,而返回的内存使用的init
和max
大小表示堆内存的设置,可能不是所有堆内存池的总和。返回的内存使用中已使用内存的量是由活动对象和尚未收集的垃圾对象(如果有)占用的内存量。
MBeanServer访问:
MemoryUsage
的映射类型是具有MemoryUsage
中指定属性的CompositeData
。- 返回:
-
代表堆内存使用情况的
MemoryUsage
对象。
-
getNonHeapMemoryUsage
MemoryUsage getNonHeapMemoryUsage()返回Java虚拟机使用的非堆内存的当前内存使用情况。非堆内存由一个或多个内存池组成。返回的内存使用的used
和committed
大小是所有非堆内存池的这些值的总和,而返回的内存使用的init
和max
大小表示非堆内存的设置,可能不是所有非堆内存池的总和。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()
- 参见:
-