memorypoolmxbean.html
来自「j2se5-api-zh,java文档的中文版本」· HTML 代码 · 共 806 行 · 第 1/3 页
HTML
806 行
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><!--NewPage--><HTML><HEAD><!-- Generated by javadoc (build 1.5.0_03) on Wed Nov 02 09:50:14 CST 2005 --><META http-equiv="Content-Type" content="text/html; charset=gb2312"><TITLE>MemoryPoolMXBean (Java 2 Platform SE 5.0)</TITLE><META NAME="keywords" CONTENT="java.lang.management.MemoryPoolMXBean interface"><LINK REL ="stylesheet" TYPE="text/css" HREF="../../../stylesheet.css" TITLE="Style"><SCRIPT type="text/javascript">function windowTitle(){ parent.document.title="MemoryPoolMXBean (Java 2 Platform SE 5.0)";}</SCRIPT><NOSCRIPT></NOSCRIPT></HEAD><BODY BGCOLOR="white" onload="windowTitle();"><!-- ========= START OF TOP NAVBAR ======= --><A NAME="navbar_top"><!-- --></A><A HREF="#skip-navbar_top" title="跳过导航链接"></A><TABLE BORDER="0" WIDTH="100%" CELLPADDING="1" CELLSPACING="0" SUMMARY=""><TR><TD COLSPAN=2 BGCOLOR="#EEEEFF" CLASS="NavBarCell1"><A NAME="navbar_top_firstrow"><!-- --></A><TABLE BORDER="0" CELLPADDING="0" CELLSPACING="3" SUMMARY=""> <TR ALIGN="center" VALIGN="top"> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../overview-summary.html"><FONT CLASS="NavBarFont1"><B>概述</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-summary.html"><FONT CLASS="NavBarFont1"><B>软件包</B></FONT></A> </TD> <TD BGCOLOR="#FFFFFF" CLASS="NavBarCell1Rev"> <FONT CLASS="NavBarFont1Rev"><B>类</B></FONT> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="class-use/MemoryPoolMXBean.html"><FONT CLASS="NavBarFont1"><B>使用</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="package-tree.html"><FONT CLASS="NavBarFont1"><B>树</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../deprecated-list.html"><FONT CLASS="NavBarFont1"><B>已过时</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../index-files/index-1.html"><FONT CLASS="NavBarFont1"><B>索引</B></FONT></A> </TD> <TD BGCOLOR="#EEEEFF" CLASS="NavBarCell1"> <A HREF="../../../help-doc.html"><FONT CLASS="NavBarFont1"><B>帮助</B></FONT></A> </TD> </TR></TABLE></TD><TD ALIGN="right" VALIGN="top" ROWSPAN=3><EM><b>Java<sup><font size=-2>TM</font></sup> 2 Platform<br>Standard Ed. 5.0</b></EM></TD></TR><TR><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <A HREF="MemoryNotificationInfo.html" title="java.lang.management 中的类"><B>上一个类</B></A> <A HREF="MemoryType.html" title="java.lang.management 中的枚举"><B>下一个类</B></A></FONT></TD><TD BGCOLOR="white" CLASS="NavBarCell2"><FONT SIZE="-2"> <A HREF="../../../index.html@java_2Flang_2Fmanagement_2FMemoryPoolMXBean.html" target="_top"><B>框架</B></A> <A HREF="MemoryPoolMXBean.html" target="_top"><B>无框架</B></A> <SCRIPT type="text/javascript"> <!-- if(window==top) { document.writeln('<A HREF="../../../allclasses-noframe.html"><B>所有类</B></A>'); } //--></SCRIPT><NOSCRIPT> <A HREF="../../../allclasses-noframe.html"><B>所有类</B></A></NOSCRIPT></FONT></TD></TR><TR><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2"> 摘要: 嵌套 | 字段 | 构造方法 | <A HREF="#method_summary">方法</A></FONT></TD><TD VALIGN="top" CLASS="NavBarCell3"><FONT SIZE="-2">详细信息: 字段 | 构造方法 | <A HREF="#method_detail">方法</A></FONT></TD></TR></TABLE><A NAME="skip-navbar_top"></A><!-- ========= END OF TOP NAVBAR ========= --><HR><!-- ======== START OF CLASS DATA ======== --><H2><FONT SIZE="-1">java.lang.management</FONT><BR>接口 MemoryPoolMXBean</H2><HR><DL><DT><PRE>public interface <B>MemoryPoolMXBean</B></DL></PRE><P>内存池的管理接口。内存池表示由 Java 虚拟机管理的内存资源,由一个或多个<A HREF="MemoryManagerMXBean.html" title="java.lang.management 中的接口"><CODE>内存管理器</CODE></A>对内存池进行管理。<p> Java 虚拟机具有此接口的实现类的一个或多个实例。实现此接口的实例是 <a href="ManagementFactory.html#MXBean">MXBean</a>,可以通过调用 <A HREF="ManagementFactory.html#getMemoryPoolMXBeans()"><CODE>ManagementFactory.getMemoryPoolMXBeans()</CODE></A> 方法或从<A HREF="ManagementFactory.html#getPlatformMBeanServer()"><CODE>平台 <tt>MBeanServer</tt></CODE></A> 方法获得。<p>在 <tt>MBeanServer</tt> 中惟一标识内存池的 MXBean 的 <tt>ObjectName</tt> 为: <blockquote> <A HREF="ManagementFactory.html#MEMORY_POOL_MXBEAN_DOMAIN_TYPE"><CODE><tt>java.lang:type=MemoryPool</tt></CODE></A><tt>,name=</tt><i>pool's name</i> </blockquote><h4>内存类型</h4><p>Java 虚拟机具有一个用于对象分配的堆,还包含用于方法区域和 Java 虚拟机执行的非堆内存。Java 虚拟机可以有一个或多个内存池。每个内存池表示一个内存区域,此内存区域可为以下类型之一:<ul> <li><A HREF="MemoryType.html#HEAP"><CODE>堆</CODE></A></li> <li><A HREF="MemoryType.html#NON_HEAP"><CODE>非堆</CODE></A></li> </ul><h4>内存使用量监视</h4>内存池具有以下属性:<ul> <li><a href="Usage">内存使用量</a></li> <li><a href="PeakUsage">峰值内存使用量</a></li> <li><a href="UsageThreshold">使用量阈值</a></li> <li><a href="CollectionThreshold">回收使用量阈值</a>(仅由某些<em>垃圾回收</em> 内存池支持)</li> </ul><h4><a name="Usage">1. 内存使用量</a></h4><A HREF="MemoryPoolMXBean.html#getUsage()"><CODE>getUsage()</CODE></A> 方法提供了内存池当前使用量的估计数。对于垃圾回收内存池,已使用的内存包括由池中所有对象(包括<em>可到达</em> 对象和<em>不可达到</em> 对象)占用的内存。 <p>通常,此方法是一个轻量操作,用于获取近似内存使用量。对于某些内存池(例如,当对象未连续打包时),此方法可能成为开销巨大的操作,要求进行计算以确定当前的内存使用量。如果是这样,实现应该加以注释。<h4><a name="PeakUsage">2. 峰值内存使用量</a></h4>Java 虚拟机会维护自虚拟机启动或者峰值重置以来的内存池峰值内存使用量。峰值内存使用量由 <A HREF="MemoryPoolMXBean.html#getPeakUsage()"><CODE>getPeakUsage()</CODE></A> 方法返回,通过调用 <A HREF="MemoryPoolMXBean.html#resetPeakUsage()"><CODE>resetPeakUsage()</CODE></A> 方法可将其重置。<h4><a name="UsageThreshold">3. 使用量阈值</a></h4> 每个内存池都有一个可管理的属性,称为<i>使用量阈值</i>,其默认值由 Java 虚拟机提供。此默认值与平台有关。可以通过 <A HREF="MemoryPoolMXBean.html#setUsageThreshold(long)"><CODE>setUsageThreshold</CODE></A> 方法设置使用量阈值。如果阈值设置为正数,将启用此内存池中的使用量阈值超过检查。如果使用率阈值设置为零,将禁用此内存池的使用量阈值超过检查。<A HREF="MemoryPoolMXBean.html#isUsageThresholdSupported()"><CODE>isUsageThresholdSupported()</CODE></A> 方法可用于确定是否支持此功能。 <p>Java 虚拟机在其最恰当的时候(通常在垃圾回收时)会对内存池逐个进行使用量阈值超过检查。每个内存池均维护一个<A HREF="MemoryPoolMXBean.html#getUsageThresholdCount()"><CODE>使用量阈值计数</CODE></A>,每次 Java 虚拟机检测到内存池使用量超过阈值,此值都会加 1。 <p>此可管理的使用量阈值属性设计用于以低开销监视内存使用量增加的趋势。使用量阈值可能不适合某些内存池。例如,生存期垃圾回收器是在很多 Java 虚拟机实现中都使用的一种常见的垃圾回收算法,它按照生存时间管理划分为两代或多代的对象。很多对象都分配在<em>最新的一代</em>(称为新生内存池)。新生内存池的设计使其很容易被填满,回收新生内存池将会释放其大部分内存空间,因为这种内存池包含了大多数生存时间短的对象,以及大多数在垃圾回收时不可到达的对象。在这种情况下,新生内存池不支持使用量阈值会更为合适。此外,如果在一个内存池中进行对象分配的开销很小(例如,只是原子指针交换),Java 虚拟机将可能不支持该内存池的使用量阈值,因为使用量阈值的开销比对象分配的开销大。 <p>系统的内存使用量可以通过<a href="#Polling">轮询</a>或<a href="#Notification">阈值通知</a>机制进行监视。 <ol type="a"><li><a name="Polling"><b>轮询</b></a> <p>通过调用所有内存池的 <A HREF="MemoryPoolMXBean.html#getUsage()"><CODE>getUsage()</CODE></A> 方法或调用支持使用量阈值的内存池的 <A HREF="MemoryPoolMXBean.html#isUsageThresholdExceeded()"><CODE>isUsageThresholdExceeded()</CODE></A> 方法,应用程序可以持续监视其内存使用量。以下的示例代码具有一个专门用于任务分配和处理的线程。每隔一段时间,它将根据其内存使用量确定是否应当接受和处理新任务。如果内存使用量超过了其使用量阈值,它会将所有未处理的任务重新分配给其他 VM 并停止接受新任务,直到内存使用量低于其使用量阈值。 <pre> // Assume the usage threshold is supported for this pool. // Set the threshold to myThreshold above which no new tasks // should be taken. pool.setUsageThreshold(myThreshold); .... boolean lowMemory = false; while (true) { if (pool.isUsageThresholdExceeded()) { // potential low memory, so redistribute tasks to other VMs lowMemory = true; redistributeTasks(); // stop receiving new tasks stopReceivingTasks(); } else { if (lowMemory) { // resume receiving tasks lowMemory = false; resumeReceivingTasks(); } // processing outstanding task ... } // sleep for sometime try { Thread.sleep(sometime); } catch (InterruptedException e) { ... } } </pre> <hr>以上示例并没有对以下两种情况加以区分,即内存使用量临时低于使用量阈值的情况和内存使用量在两次迭代之间保持高于阈值的情况。由 <A HREF="MemoryPoolMXBean.html#getUsageThresholdCount()"><CODE>getUsageThresholdCount()</CODE></A> 方法返回的使用量阈值计数可用于确定在两次轮询之间返回的内存使用量是否低于阈值。<p>以下是另一个示例,该示例在内存池出现内存空间不足时将采取一些操作,并会忽略在操作处理期间的内存使用量变化。 <pre> // Assume the usage threshold is supported for this pool. // Set the threshold to myThreshold which determines if // the application will take some action under low memory condition. pool.setUsageThreshold(myThreshold); int prevCrossingCount = 0; while (true) { // A busy loop to detect when the memory usage // has exceeded the threshold. while (!pool.isUsageThresholdExceeded() || pool.getUsageThresholdCount() == prevCrossingCount) { try { Thread.sleep(sometime) } catch (InterruptException e) { .... } } // Do some processing such as check for memory usage // and issue a warning .... // Gets the current threshold count. The busy loop will then // ignore any crossing of threshold happens during the processing. prevCrossingCount = pool.getUsageThresholdCount(); } </pre><hr> </li><li><a name="ThresholdNotification"><b>使用量阈值通知</b></a> <p>使用量阈值通知将由 <A HREF="MemoryMXBean.html" title="java.lang.management 中的接口"><CODE>MemoryMXBean</CODE></A> 发出。当 Java 虚拟机检测到内存池的内存使用量达到或超过其内存使用量阈值时,虚拟机将触发 <tt>MemoryMXBean</tt> ,发出<A HREF="MemoryNotificationInfo.html#MEMORY_THRESHOLD_EXCEEDED"><CODE>使用量阈值超过通知</CODE></A>。直到使用量降低到阈值以下,然后再次超过了阈值,才会再次生成使用量阈值超过通知。 <p>以下示例代码实现了与以上示例相同的逻辑,但使用了使用量阈值通知机制(而非轮询)来检测低内存情况。在此示例代码中,接收到通知时,通知侦听器将通知另一个线程执行实际的操作,如重新分配未处理的任务、停止接受任务,或恢复接受任务等。<tt>handleNotification</tt> 方法应该设计为完成很少的工作,且无延迟地返回,以避免导致交付后续通知时出现延迟。耗时的操作应该使用独立的线程来执行。通知侦听器可以由多个线程并发调用,因此侦听器执行的任务应该进行适当地同步。 <pre> class MyListener implements javax.management.NotificationListener { public void handleNotification(Notification notification, Object handback) { String notifType = notification.getType(); if (notifType.equals(MemoryNotificationInfo.MEMORY_THRESHOLD_EXCEEDED)) { // potential low memory, notify another thread // to redistribute outstanding tasks to other VMs // and stop receiving new tasks. lowMemory = true; notifyAnotherThread(lowMemory); } } } // Register MyListener with MemoryMXBean MemoryMXBean mbean = ManagementFactory.getMemoryMXBean(); NotificationEmitter emitter = (NotificationEmitter) mbean; MyListener listener = new MyListener(); emitter.addNotificationListener(listener, null, null); // Assume this pool supports a usage threshold. // Set the threshold to myThreshold above which no new tasks // should be taken. pool.setUsageThreshold(myThreshold); // Usage threshold detection is enabled and notification will be // handled by MyListener. Continue for other processing. .... </pre> <hr> <p>无法保证 <tt>MemoryMXBean</tt> 何时发出阈值通知和交付通知。当调用通知侦听器时,内存池的内存使用量可能已经多次超过使用量阈值。<A HREF="MemoryNotificationInfo.html#getCount()"><CODE>MemoryNotificationInfo.getCount()</CODE></A> 方法将返回构造通知时内存使用量已超过使用量阈值的次数。可以将此值与 <A HREF="MemoryPoolMXBean.html#getUsageThresholdCount()"><CODE>getUsageThresholdCount()</CODE></A> 返回的当前使用量阈值计数进行比较,以确定是否出现了此类情况。 </li> </ol><h4><a name="CollectionThreshold">4. 回收使用量阈值</a></h4> 回收使用量阈值是一个可管理属性,仅适用于某些垃圾回收内存池。Java 虚拟机通过在垃圾回收时回收内存池中未使用的对象,完成了内存空间的回收工作之后,内存池中某些经过垃圾回收的字节仍在使用。回收使用量阈值允许为此字节数设置一个值,这样在超过该阈值的情况下,将由 <A HREF="MemoryMXBean.html" title="java.lang.management 中的接口"><CODE>MemoryMXBean</CODE></A> 发出<A HREF="MemoryNotificationInfo.html#MEMORY_THRESHOLD_EXCEEDED"><CODE>回收使用量超过通知</CODE></A>。此外,<A HREF="MemoryPoolMXBean.html#getCollectionUsageThresholdCount()"><CODE>回收使用量阈值计数</CODE></A>将增加 1。 <p><A HREF="MemoryPoolMXBean.html#isCollectionUsageThresholdSupported()"><CODE>isCollectionUsageThresholdSupported()</CODE></A> 方法可用于确定是否支持此功能。 <p>Java 虚拟机按内存池执行回收使用量阈值检查。如果回收使用量阈值设置为正数,则将启用此检查。如果回收使用量阈值设置为零,将在此内存池上禁用此检查。默认值为零。Java 虚拟机将在垃圾回收时执行回收使用量阈值检查。 <p>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?