public interface MemoryPoolMXBean extends PlatformManagedObject
memory managers
管理。
一个java虚拟机具有这个接口的实现类的一个或多个实例。实现该接口的实例是一个MXBean可以通过调用ManagementFactory.getMemoryPoolMXBeans()
方法或从platform MBeanServer
方法得到的。
用于唯一识别MXBean一内存池内的ObjectName是MBeanServer:
java.lang:type=MemoryPool
,name=
pool's name
可以通过调用
PlatformManagedObject.getObjectName()
方法得到的。
java虚拟机有一个对象分配堆和维护方法区非堆内存和java虚拟机执行。java虚拟机可以有一个或多个内存池。每个内存池表示以下类型的一个内存区域:
getUsage()
法提供了一个内存池的当前使用的估计。一个垃圾回收的内存池,内存使用量包括在池包括可达和不可达的对象的所有对象占用的内存。
在一般情况下,该方法是一个轻量级的操作,得到一个近似的内存使用。对于一些内存池,例如,当物体的包装不连续,这种方法可能是一个昂贵的操作,需要一定的计算来确定当前的内存使用情况。当情况是这样的时候,一个实现应该文档。
getPeakUsage()
法和重置通过调用
resetPeakUsage()
方法。
setUsageThreshold
方法。如果阈值设置为正值,则在这个内存池中启用了使用阈值交叉检查的方法。如果使用阈值设置为零,则禁用此内存池的使用阈值交叉检查。的
isUsageThresholdSupported()
方法可用来确定是否支持此功能。
一个java虚拟机的执行使用阈值交叉在一个内存池基础检查在其最好的合适的时间,一般来说,在垃圾收集时。每个内存池保持usage threshold count
将递增每当java虚拟机检测到内存池的使用是跨越门槛。
这种可管理的使用阈值属性是专为监测低开销的内存使用率的增加趋势。使用阈值可能不适合一些内存池。例如,一个垃圾回收器,一个用于许多java虚拟机的实现常见的垃圾收集算法,管理两个或更多代分离对象的年龄。大多数的对象都分配在最年轻的一代(说一个幼儿园的内存池)。幼儿园的内存池的设计是充满了收集圃内存池将免费其大部分内存空间因为它预计将包含主要是短命的对象大多是遥不可及的在垃圾收集时。在这种情况下,它更适合于不支持使用阈值的存储池存储池。另外,如果在一个内存池分配一个对象的成本是非常低的(例如,只是原子指针交换),java虚拟机可能不会因为在比较使用与阈值的开销支持内存池的使用门槛高于对象分配的成本。
该系统可以监视内存的使用情况使用polling或threshold notification机制。
应用程序可以通过调用方法的不断getUsage()
所有内存池的内存池或支持使用门限的isUsageThresholdExceeded()
方法监视内存使用。下面是一个例子代码,有一个线程专用的任务分配和处理。在每一个时间间隔,它将决定是否应该接收和处理新的任务,根据它的内存使用。如果内存使用超过它的使用门槛,它将重新分配所有的突出任务的其他虚拟机和停止接收新的任务直到内存使用收益低于其使用门槛。
/假设支持此池的使用阈值。/ / mythreshold上面没有新任务设置门槛应采取的。池setusagethreshold(mythreshold);的…布尔lowmemory = false;虽然(真){如果(池。isusagethresholdexceeded()){/ /潜在的低内存,那么分配任务的其他虚拟机lowmemory =真;redistributetasks();/停止接收新的任务stopreceivingtasks();其他{ }如果(lowmemory){/恢复接收任务lowmemory = false;resumereceivingtasks();}/处理优秀的任务…}有时间睡觉尝试{线程,睡眠(某个时间);} catch(InterruptedException e){…}}
getUsageThresholdCount()
方法返回可用于确定内存使用了低于阈值之间的两个民调。下面显示了另一个例子,如果内存池处于低内存内存池,并且忽略了在操作处理过程中的内存使用量的变化,则需要采取一些行动。
/假设支持此池的使用阈值。//设置mythreshold决定阈值如果在低内存条件下,应用程序将采取一些行动。池setusagethreshold(mythreshold);国际prevcrossingcount = 0;虽然(真){当内存使用时,一个繁忙的循环来检测已超过阈值。而(!isusagethresholdexceeded() | |池。池。getusagethresholdcount() = = prevcrossingcount){尝试{线程,睡眠(某个时间)} catch(interruptexception e){的…}}做一些处理,如检查内存使用情况并发出警告的…获取当前的阈值计数。然后繁忙的循环将在处理过程中会发生任何交叉的阈值。prevcrossingcount =池。getusagethresholdcount();}
使用阈值通知将发出MemoryMXBean
。当java虚拟机检测到一个内存池的内存使用率已经达到或超过了使用门槛的虚拟机将触发MemoryMXBean发出usage threshold exceeded notification
。另一个使用阈值超过通知之前不会使用低于阈值然后超过它再次产生。
下面是一个示例代码,实现了相同的逻辑作为第一个例子,但使用的使用阈值通知机制来检测低内存条件,而不是轮询。在这个例子中的代码,在接到通知后,通知另一个线程监听通知来执行实际的行动,如重新分配的突出任务,停止接收任务,或继续接受任务。handleNotification方法的设计应该做非常少量的工作,立即返回以避免造成后续通知延迟交付。耗时的操作应该由一个单独的线程执行。通知侦听器可以同时由多个线程调用;因此侦听器所执行的任务应正确同步。
类mylistener实现javax.management.notificationlistener {公共void handleNotification(通知、Object handback){字符串notiftype =通知。gettype();如果(notiftype。等于(memorynotificationinfo。memory_threshold_exceeded)){/潜在的低内存,通知另一个线程/ /重新分配给其他虚拟机的突出任务/停止接收新的任务。lowmemory =真;notifyanotherthread(lowmemory);}}}/ /登记mylistener与memorymxbeanmemorymxbean MBean = managementfactory。getmemorymxbean();notificationemitter发射器=(notificationemitter)MBean;mylistener听众=新mylistener();发射器。addnotificationlistener(听众,null,null);/假设这个池支持一个使用阈值。/ / mythreshold上面没有新任务设置门槛应采取的。池setusagethreshold(mythreshold);启用/使用阈值检测和通知将/ /由mylistener。继续其他处理。的…
没有保障的MemoryMXBean时会散发出一种阈值时通知和通知。当调用通知侦听器时,内存池的内存使用量可能超过一次使用过多的阈值。的MemoryNotificationInfo.getCount()
方法返回的次数,内存使用了使用门槛的时间点时,通知了。它可与目前使用的阈值计数恢复的getUsageThresholdCount()
方法来确定是否发生了这样的情况。
collection usage threshold exceeded notification
将由
MemoryMXBean
发射。此外,该
collection usage threshold count
将递增。
的isCollectionUsageThresholdSupported()
方法可用来确定是否支持此功能。
一个java虚拟机执行采集使用阈值对内存池的基础上检查。如果将集合使用阈值设置为正值,则启用此检查。如果集合使用阈值设置为零,则此检查将禁用此内存池中的内存池。默认值为零。java虚拟机执行收集的使用门槛在垃圾收集时检查。
一些垃圾收集的内存池可能会选择不支持集合使用阈值。例如,一个内存池只由一个连续的并发垃圾收集器管理。对象可以通过一些线程在内存池中分配,而未使用的对象同时由并发的垃圾收集器回收。除非有一个定义良好的垃圾收集时间,这是最好的适当的时间来检查内存的使用情况,收集使用的阈值不应该被支持。
收集的使用门槛是专为在java虚拟机回收内存空间的内存使用监测花费的努力。收集的使用也可以通过投票和阈值通知上述机制以类似的方式的usage threshold监测。
ManagementFactory.getPlatformMXBeans(Class)
,
JMX Specification.,
Ways to Access MXBeans
Modifier and Type | Method and Description |
---|---|
MemoryUsage |
getCollectionUsage()
返回后,java虚拟机最近花费的努力在这个内存池的内存使用回收未使用的对象。
|
long |
getCollectionUsageThreshold()
返回这个内存池的集合使用阈值。
|
long |
getCollectionUsageThresholdCount()
返回次数,java虚拟机检测到的内存使用率已经达到或超过了集合的使用门槛。
|
String[] |
getMemoryManagerNames()
返回管理此内存池的内存管理器的名称。
|
String |
getName()
返回表示此内存池的名称。
|
MemoryUsage |
getPeakUsage()
返回该内存池的内存使用峰值由于java虚拟机的启动或自峰被重置。
|
MemoryType |
getType()
返回此内存池的类型。
|
MemoryUsage |
getUsage()
返回这个内存池的内存使用量的估计值。
|
long |
getUsageThreshold()
以字节为单位返回该内存池的使用阈值。
|
long |
getUsageThresholdCount()
返回内存使用已越过使用阈值的次数的次数。
|
boolean |
isCollectionUsageThresholdExceeded()
如果这个内存池的内存使用率在最近收集的java虚拟机所花费的努力已经达到或超过其收集的使用门槛。
|
boolean |
isCollectionUsageThresholdSupported()
测试如果这个内存池支持集合使用阈值。
|
boolean |
isUsageThresholdExceeded()
测试,如果这个内存池的内存使用达到或超过它的使用阈值。
|
boolean |
isUsageThresholdSupported()
测试这个内存池是否支持使用阈值。
|
boolean |
isValid()
如果这个内存池的java虚拟机是有效的。
|
void |
resetPeakUsage()
重置该内存池的内存使用峰值统计当前内存使用率。
|
void |
setCollectionUsageThreshold(long threshold)
设置为给定值
threshold这个内存池收集的使用门槛。
|
void |
setUsageThreshold(long threshold)
设置为给定值
threshold这个内存池的门槛,如果这个内存池支持的使用门槛。
|
getObjectName
String getName()
MemoryType getType()
MBeanServer访问:
的MemoryType映射类型String和价值是对MemoryType名称。
MemoryUsage getUsage()
这种方法要求java虚拟机努力最好这个内存池的当前内存使用情况的估计。对于一些内存池,这种方法可能是一个昂贵的操作,需要一些计算,以确定估计。当情况是这样的时候,一个实现应该文档。
此方法是专为使用在监测系统的内存使用和检测低内存条件。
MBeanServer访问:
的MemoryUsage映射的类型与属性中指定的MemoryUsage
CompositeData。
MemoryUsage
对象;或
null如果这池无效。
MemoryUsage getPeakUsage()
MBeanServer访问:
的MemoryUsage映射的类型与属性中指定的MemoryUsage
CompositeData。
MemoryUsage
对象;或
null如果这个游泳池是无效的。
void resetPeakUsage()
SecurityException
-如果存在一个安全管理和调用方没有managementpermission(“控制”)。
boolean isValid()
String[] getMemoryManagerNames()
long getUsageThreshold()
setUsageThreshold
方法改变。
UnsupportedOperationException
-如果这个内存池不支持使用门限。
isUsageThresholdSupported()
void setUsageThreshold(long threshold)
threshold
字节阈值。必须非负。
IllegalArgumentException
-如果
threshold阴性或大于这个内存池的最大内存量如果定义。
UnsupportedOperationException
-如果这个内存池不支持使用门限。
SecurityException
-如果存在一个安全管理和调用方没有managementpermission(“控制”)。
isUsageThresholdSupported()
,
Usage threshold
boolean isUsageThresholdExceeded()
UnsupportedOperationException
-如果这个内存池不支持使用门限。
long getUsageThresholdCount()
UnsupportedOperationException
-如果这个内存池不支持使用门限。
boolean isUsageThresholdSupported()
long getCollectionUsageThreshold()
setCollectionUsageThreshold
方法改变。
UnsupportedOperationException
-如果这个内存池不支持集合的使用门槛。
isCollectionUsageThresholdSupported()
void setCollectionUsageThreshold(long threshold)
如果设置为正值,则该内存池中启用了集合使用阈值交叉检查的方法。如果设置为零,则“交叉检查”的集合使用阈值交叉检查被禁用。
threshold
-新的收集使用阈值的字节数。必须非负。
IllegalArgumentException
-如果
threshold阴性或大于这个内存池的最大内存量如果定义。
UnsupportedOperationException
-如果这个内存池不支持集合的使用门槛。
SecurityException
-如果存在一个安全管理和调用方没有managementpermission(“控制”)。
isCollectionUsageThresholdSupported()
,
Collection usage threshold
boolean isCollectionUsageThresholdExceeded()
UnsupportedOperationException
-如果这个内存池不支持使用门限。
long getCollectionUsageThresholdCount()
UnsupportedOperationException
-如果这个内存池不支持集合的使用门槛。
isCollectionUsageThresholdSupported()
MemoryUsage getCollectionUsage()
MBeanServer访问:
的MemoryUsage映射的类型与属性中指定的MemoryUsage
CompositeData。
MemoryUsage
表示这个内存池的内存使用后,java虚拟机最近花费的努力回收未使用的对象;
null如果不支持这个方法。
boolean isCollectionUsageThresholdSupported()
Submit a bug or feature
For further API reference and developer documentation, see Java SE Documentation. That documentation contains more detailed, developer-targeted descriptions, with conceptual overviews, definitions of terms, workarounds, and working code examples.
Copyright © 1993, 2014, Oracle and/or its affiliates. All rights reserved.