Author: kkolinko Date: Tue Nov 13 22:49:52 2012 New Revision: 1409007 URL: http://svn.apache.org/viewvc?rev=1409007&view=rev Log: Fix https://issues.apache.org/bugzilla/show_bug.cgi?id=54143 Add display of memory pools usage (including PermGen) to the Status page of the Manager web application.
Modified: tomcat/trunk/java/org/apache/catalina/manager/StatusTransformer.java tomcat/trunk/webapps/manager/xform.xsl Modified: tomcat/trunk/java/org/apache/catalina/manager/StatusTransformer.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/catalina/manager/StatusTransformer.java?rev=1409007&r1=1409006&r2=1409007&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/catalina/manager/StatusTransformer.java (original) +++ tomcat/trunk/java/org/apache/catalina/manager/StatusTransformer.java Tue Nov 13 22:49:52 2012 @@ -19,12 +19,17 @@ package org.apache.catalina.manager; import java.io.PrintWriter; +import java.lang.management.ManagementFactory; +import java.lang.management.MemoryPoolMXBean; +import java.lang.management.MemoryUsage; import java.lang.reflect.Method; import java.text.MessageFormat; import java.util.Date; import java.util.Enumeration; import java.util.Iterator; import java.util.Set; +import java.util.SortedMap; +import java.util.TreeMap; import java.util.Vector; import javax.management.MBeanServer; @@ -200,6 +205,12 @@ public class StatusTransformer { public static void writeVMState(PrintWriter writer, int mode) throws Exception { + SortedMap<String, MemoryPoolMXBean> memoryPoolMBeans = new TreeMap<>(); + for (MemoryPoolMXBean mbean: ManagementFactory.getMemoryPoolMXBeans()) { + String sortKey = mbean.getType() + ":" + mbean.getName(); + memoryPoolMBeans.put(sortKey, mbean); + } + if (mode == 0){ writer.print("<h1>JVM</h1>"); @@ -214,6 +225,29 @@ public class StatusTransformer { writer.print(formatSize( Long.valueOf(Runtime.getRuntime().maxMemory()), true)); writer.print("</p>"); + + writer.write("<table border=\"0\"><thead><tr><th>Memory Pool</th><th>Type</th><th>Initial</th><th>Total</th><th>Maximum</th><th>Used</th></tr></thead><tbody>"); + for (MemoryPoolMXBean memoryPoolMBean : memoryPoolMBeans.values()) { + MemoryUsage usage = memoryPoolMBean.getUsage(); + writer.write("<tr><td>"); + writer.print(memoryPoolMBean.getName()); + writer.write("</td><td>"); + writer.print(memoryPoolMBean.getType()); + writer.write("</td><td>"); + writer.print(formatSize(Long.valueOf(usage.getInit()), true)); + writer.write("</td><td>"); + writer.print(formatSize(Long.valueOf(usage.getCommitted()), true)); + writer.write("</td><td>"); + writer.print(formatSize(Long.valueOf(usage.getMax()), true)); + writer.write("</td><td>"); + writer.print(formatSize(Long.valueOf(usage.getUsed()), true)); + if (usage.getMax() > 0) { + writer.write(" (" + + (usage.getUsed() * 100 / usage.getMax()) + "%)"); + } + writer.write("</td></tr>"); + } + writer.write("</tbody></table>"); } else if (mode == 1){ writer.write("<jvm>"); @@ -222,6 +256,17 @@ public class StatusTransformer { writer.write(" total='" + Runtime.getRuntime().totalMemory() + "'"); writer.write(" max='" + Runtime.getRuntime().maxMemory() + "'/>"); + for (MemoryPoolMXBean memoryPoolMBean : memoryPoolMBeans.values()) { + MemoryUsage usage = memoryPoolMBean.getUsage(); + writer.write("<memorypool"); + writer.write(" name='" + memoryPoolMBean.getName() + "'"); + writer.write(" type='" + memoryPoolMBean.getType() + "'"); + writer.write(" usageInit='" + usage.getInit() + "'"); + writer.write(" usageCommitted='" + usage.getCommitted() + "'"); + writer.write(" usageMax='" + usage.getMax() + "'"); + writer.write(" usageUsed='" + usage.getInit() + "'/>"); + } + writer.write("</jvm>"); } Modified: tomcat/trunk/webapps/manager/xform.xsl URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/manager/xform.xsl?rev=1409007&r1=1409006&r2=1409007&view=diff ============================================================================== --- tomcat/trunk/webapps/manager/xform.xsl (original) +++ tomcat/trunk/webapps/manager/xform.xsl Tue Nov 13 22:49:52 2012 @@ -44,6 +44,9 @@ <xsl:template match="jvm"> <xsl:apply-templates select="memory"/> + <b>Memory Pools</b><br /> + <xsl:apply-templates select="memorypool"/> + <hr /> </xsl:template> <xsl:template match="memory"> @@ -56,6 +59,18 @@ </table><hr /> </xsl:template> + <xsl:template match="memorypool"> + <table><tr> + <td><b>Name:</b> <xsl:value-of select="@name"/></td> + <td><b>Type:</b> <xsl:value-of select="@type"/></td> + <td><b>Initial:</b> <xsl:value-of select="@usageInit"/></td> + <td><b>Committed:</b> <xsl:value-of select="@usageCommitted"/></td> + <td><b>Maximum:</b> <xsl:value-of select="@usageMax"/></td> + <td><b>Used:</b> <xsl:value-of select="@usageUsed"/></td> + </tr> + </table> + </xsl:template> + <xsl:template match="connector"> <b>Connector -- </b> <xsl:value-of select="@name"/><br /> --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org