ASF Bugzilla – Attachment 32252 Details for
Bug 54143
Add display of PermGen memory pool usage to the Status page of the Manager webapp
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
[patch]
2014-12-02_tc6_54143_v1.patch
2014-12-02_tc6_54143_v1.patch (text/plain), 10.09 KB, created by
Konstantin Kolinko
on 2014-12-02 15:14:27 UTC
(
hide
)
Description:
2014-12-02_tc6_54143_v1.patch
Filename:
MIME Type:
Creator:
Konstantin Kolinko
Created:
2014-12-02 15:14:27 UTC
Size:
10.09 KB
patch
obsolete
>Index: java/org/apache/catalina/manager/StatusTransformer.java >=================================================================== >--- java/org/apache/catalina/manager/StatusTransformer.java (revision 1642120) >+++ java/org/apache/catalina/manager/StatusTransformer.java (working copy) >@@ -18,8 +18,10 @@ > > package org.apache.catalina.manager; > >-import java.io.IOException; > 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; >@@ -26,12 +28,13 @@ > 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; > import javax.management.ObjectInstance; > import javax.management.ObjectName; >-import javax.servlet.ServletException; > import javax.servlet.http.HttpServletResponse; > > import org.apache.catalina.util.RequestUtil; >@@ -191,6 +194,13 @@ > public static void writeVMState(PrintWriter writer, int mode) > throws Exception { > >+ SortedMap<String, MemoryPoolMXBean> memoryPoolMBeans = >+ new TreeMap<String, MemoryPoolMXBean>(); >+ for (MemoryPoolMXBean mbean: ManagementFactory.getMemoryPoolMXBeans()) { >+ String sortKey = mbean.getType() + ":" + mbean.getName(); >+ memoryPoolMBeans.put(sortKey, mbean); >+ } >+ > if (mode == 0){ > writer.print("<h1>JVM</h1>"); > >@@ -205,6 +215,29 @@ > writer.print(formatSize > (new Long(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>"); > >@@ -213,6 +246,17 @@ > 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.getUsed() + "'/>"); >+ } >+ > writer.write("</jvm>"); > } > >@@ -520,7 +564,7 @@ > } else { > writer.write(" requestProcessingTime=\"0\""); > writer.write(" requestBytesSent=\"0\""); >- writer.write(" requestBytesRecieved=\"0\""); >+ writer.write(" requestBytesReceived=\"0\""); > writer.write(" remoteAddr=\"?\""); > writer.write(" virtualHost=\"?\""); > writer.write(" method=\"?\""); >Index: webapps/manager/status.xsd >=================================================================== >--- webapps/manager/status.xsd (revision 1642123) >+++ webapps/manager/status.xsd (working copy) >@@ -15,9 +15,15 @@ > See the License for the specific language governing permissions and > limitations under the License. > --> >-<!-- edited with XMLSPY v5 rel. 4 U (http://www.xmlspy.com) by peter lin (consultant) --> >-<!--W3C Schema generated by XMLSPY v5 rel. 4 U (http://www.xmlspy.com)--> > <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"> >+ <xs:element name="status"> >+ <xs:complexType> >+ <xs:sequence> >+ <xs:element name="jvm" type="jvm"/> >+ <xs:element name="connector" type="connector" minOccurs="1" maxOccurs="unbounded"/> >+ </xs:sequence> >+ </xs:complexType> >+ </xs:element> > <xs:complexType name="connector"> > <xs:sequence> > <xs:element name="threadInfo" type="threadInfo"/> >@@ -29,6 +35,7 @@ > <xs:complexType name="jvm"> > <xs:sequence> > <xs:element name="memory" type="memory"/> >+ <xs:element name="memorypool" type="memorypool" minOccurs="0" maxOccurs="unbounded"/> > </xs:sequence> > </xs:complexType> > <xs:complexType name="memory"> >@@ -36,6 +43,14 @@ > <xs:attribute name="total" type="xs:long" use="required"/> > <xs:attribute name="max" type="xs:long" use="required"/> > </xs:complexType> >+ <xs:complexType name="memorypool"> >+ <xs:attribute name="name" type="xs:string" use="required"/> >+ <xs:attribute name="type" type="xs:string" use="required"/> >+ <xs:attribute name="usageInit" type="xs:long" use="required"/> >+ <xs:attribute name="usageCommitted" type="xs:long" use="required"/> >+ <xs:attribute name="usageMax" type="xs:long" use="required"/> >+ <xs:attribute name="usageUsed" type="xs:long" use="required"/> >+ </xs:complexType> > <xs:complexType name="requestInfo"> > <xs:attribute name="maxTime" type="xs:long" use="required"/> > <xs:attribute name="processingTime" type="xs:int" use="required"/> >@@ -44,18 +59,8 @@ > <xs:attribute name="bytesReceived" type="xs:long" use="required"/> > <xs:attribute name="bytesSent" type="xs:long" use="required"/> > </xs:complexType> >- <xs:element name="status"> >- <xs:complexType> >- <xs:sequence> >- <xs:element name="jvm" type="jvm"/> >- <xs:element name="connector" type="connector"/> >- </xs:sequence> >- </xs:complexType> >- </xs:element> > <xs:complexType name="threadInfo"> > <xs:attribute name="maxThreads" type="xs:int" use="required"/> >- <xs:attribute name="minSpareThreads" type="xs:int" use="required"/> >- <xs:attribute name="maxSpareThreads" type="xs:int" use="required"/> > <xs:attribute name="currentThreadCount" type="xs:int" use="required"/> > <xs:attribute name="currentThreadsBusy" type="xs:int" use="required"/> > </xs:complexType> >@@ -63,7 +68,7 @@ > <xs:attribute name="stage" type="xs:string" use="required"/> > <xs:attribute name="requestProcessingTime" type="xs:int" use="required"/> > <xs:attribute name="requestBytesSent" type="xs:long" use="required"/> >- <xs:attribute name="requestBytesRecieved" type="xs:long" use="required"/> >+ <xs:attribute name="requestBytesReceived" type="xs:long" use="required"/> > <xs:attribute name="remoteAddr" type="xs:string" use="required"/> > <xs:attribute name="virtualHost" type="xs:string" use="required"/> > <xs:attribute name="method" type="xs:string" use="required"/> >@@ -73,7 +78,7 @@ > </xs:complexType> > <xs:complexType name="workers"> > <xs:sequence> >- <xs:element name="worker" type="worker"/> >+ <xs:element name="worker" type="worker" minOccurs="0" maxOccurs="unbounded"/> > </xs:sequence> > </xs:complexType> > </xs:schema> >Index: webapps/manager/xform.xsl >=================================================================== >--- webapps/manager/xform.xsl (revision 1642123) >+++ webapps/manager/xform.xsl (working copy) >@@ -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 /> > >@@ -66,10 +81,8 @@ > > <xsl:template match="threadInfo"> > <table><tr> >- <td><b>threadInfo </b></td> >+ <td><b>threadInfo</b></td> > <td><b>maxThreads:</b> <xsl:value-of select="@maxThreads"/></td> >- <td><b>minSpareThreads:</b> <xsl:value-of select="@minSpareThreads"/></td> >- <td><b>maxSpareThreads:</b> <xsl:value-of select="@maxSpareThreads"/></td> > <td><b>currentThreadCount:</b> <xsl:value-of select="@currentThreadCount"/></td> > <td><b>currentThreadsBusy:</b> <xsl:value-of select="@currentThreadsBusy"/></td> > </tr>
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 54143
: 32252