|
|||||||||
摘要: 嵌套 | 字段 | 构造方法 | 方法 | 详细信息: 字段 | 构造方法 | 方法 |
java.lang.management
接口 MemoryMXBean
-
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()
方法确定),它将发出两种类型的通知
。
使用量阈值超过通知
- 用构造方法通知内存池的内存使用量增加,已达到或超过其使用量阈值。集合使用量阈值超过通知
- 用于通知,在 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) { // 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()