public interface MemoryMXBean extends PlatformManagedObject
Java虚拟机具有此接口的实现类的单个实例。 实现此接口的实例是可以通过调用ManagementFactory.getMemoryMXBean()
方法或从platform MBeanServer
方法获得的MXBean 。
该ObjectName用于唯一识别的MXBean为一个MBeanServer内的存储器的系统是:
java.lang:type=Memory
可以通过调用PlatformManagedObject.getObjectName()
方法获得。
堆可能是一个固定的大小或可能扩大和缩小。 堆的内存不需要是连续的。
Java虚拟机具有在所有线程之间共享的方法区域 。 方法区属于非堆内存。 它存储每个类的结构,例如运行时常量池,字段和方法数据,以及方法和构造函数的代码。 它是在Java虚拟机启动时创建的。
方法区域在逻辑上是堆的一部分,但Java虚拟机实现可以选择不要垃圾收集或压缩它。 类似于堆,方法区域可以是固定大小的,或者可以被扩展和缩小。 方法区域的内存不需要是连续的。
除了方法区域之外,Java虚拟机实现可能需要用于内部处理或优化的内存,这也是非堆内存。 例如,JIT编译器需要内存来存储从Java虚拟机代码转换的本地机器代码以实现高性能。
Memory pools
和memory managers
是监视和管理Java虚拟机的内存系统的抽象实体。
内存池代表Java虚拟机管理的内存区域。 Java虚拟机具有至少一个内存池,并且可以在执行期间创建或删除内存池。 内存池可以属于堆或非堆内存。
内存管理器负责管理一个或多个内存池。 垃圾收集器是负责回收由不可达对象占用的内存的一种内存管理器。 Java虚拟机可能具有一个或多个内存管理器。 它可能会在执行期间添加或删除内存管理器。 内存池可以由多个内存管理器管理。
可以通过三种方式监视内存使用情况:
MemoryPoolMXBean
接口。
内存使用监视机制旨在用于负载平衡或工作负载分配使用。 例如,当应用程序的内存使用量超过某个阈值时,应用程序将停止接收任何新的工作负载。 它不适用于应用程序从低内存条件检测和恢复。
这MemoryMXBean是NotificationEmitter
发出两种类型的存储器notifications
如果存储池的任一项支持usage threshold或collection usage threshold ,其可以通过调用来确定MemoryPoolMXBean.isUsageThresholdSupported()
种MemoryPoolMXBean.isCollectionUsageThresholdSupported()
方法。
usage threshold exceeded notification
- 用于通知内存池的内存使用量增加并已达到或超过其usage threshold值。 collection usage threshold exceeded notification
- 用于在Java虚拟机已经花费在回收该内存池中未使用的对象的努力之后通知内存池的内存使用大于或等于其collection usage threshold 。 发出的通知是一个Notification
实例,其user data
设置为CompositeData
,代表一个MemoryNotificationInfo
对象,该对象在构建通知时包含有关内存池的信息。 CompositeData包含MemoryNotificationInfo
中描述的属性 。
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);
ManagementFactory.getPlatformMXBeans(Class)
,
JMX Specification. ,
Ways to Access MXBeans
Modifier and Type | Method and Description |
---|---|
void |
gc()
运行垃圾回收器。
|
MemoryUsage |
getHeapMemoryUsage()
返回用于对象分配的堆的当前内存使用情况。
|
MemoryUsage |
getNonHeapMemoryUsage()
返回Java虚拟机使用的非堆内存的当前内存使用情况。
|
int |
getObjectPendingFinalizationCount()
返回正在等待完成的对象的大致数量。
|
boolean |
isVerbose()
测试是否启用了内存系统的详细输出。
|
void |
setVerbose(boolean value)
启用或禁用内存系统的详细输出。
|
getObjectName
int getObjectPendingFinalizationCount()
MemoryUsage getHeapMemoryUsage()
返回的内存使用量中使用的内存量是未被收集的活动对象和垃圾对象占用的内存量(如果有的话)。
MBeanServer访问 :
MemoryUsage的映射类型是CompositeData ,其属性在MemoryUsage
中指定 。
MemoryUsage
对象。
MemoryUsage getNonHeapMemoryUsage()
MBeanServer访问 :
MemoryUsage的映射类型是CompositeData ,具有MemoryUsage
中规定的属性 。
MemoryUsage
对象。
boolean isVerbose()
void setVerbose(boolean value)
此方法的每次调用都可以全局启用或禁用详细输出。
value
- true以启用详细输出;
false禁用。
SecurityException
- 如果安全管理器存在,并且调用者没有ManagementPermission(“控制”)。
void gc()
gc()
有效地等效于通话:
System.gc()
System.gc()