














<%@ page import="java.lang.management.*" %>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JVM Memory Monitor</title>
</head>
<body>
<table border="0" width="100%">
<tr><td colspan="2" align="center"><h3>Memory MXBean</h3></td></tr>
<tr><td
width="200">Heap Memory Usage</td><td><%=
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
%></td></tr>
<tr><td>Non-Heap Memory
Usage</td><td><%=
ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
%></td></tr>
<tr><td colspan="2"> </td></tr>
<tr><td colspan="2" align="center"><h3>Memory Pool MXBeans</h3></td></tr>
<%
Iterator iter = ManagementFactory.getMemoryPoolMXBeans().iterator();
while (iter.hasNext()) {
MemoryPoolMXBean item = (MemoryPoolMXBean) iter.next();
%>
<tr><td colspan="2">
<table border="0" width="100%" style="border: 1px #98AAB1 solid;">
<tr><td colspan="2" align="center"><b><%= item.getName() %></b></td></tr>
<tr><td width="200">Type</td><td><%= item.getType() %></td></tr>
<tr><td>Usage</td><td><%= item.getUsage() %></td></tr>
<tr><td>Peak Usage</td><td><%= item.getPeakUsage() %></td></tr>
<tr><td>Collection Usage</td><td><%= item.getCollectionUsage() %></td></tr>
</table>
</td></tr>
<tr><td colspan="2"> </td></tr>
<%} %>
</table>
</body>
</html>
<%@ page import="java.util.*" %>
<html>
<head>
<title>JVM Memory Monitor</title>
</head>
<body>
<table border="0" width="100%">
<tr><td colspan="2" align="center"><h3>Memory MXBean</h3></td></tr>
<tr><td
width="200">Heap Memory Usage</td><td><%=
ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()
%></td></tr>
<tr><td>Non-Heap Memory
Usage</td><td><%=
ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()
%></td></tr>
<tr><td colspan="2"> </td></tr>
<tr><td colspan="2" align="center"><h3>Memory Pool MXBeans</h3></td></tr>
<%
Iterator iter = ManagementFactory.getMemoryPoolMXBeans().iterator();
while (iter.hasNext()) {
MemoryPoolMXBean item = (MemoryPoolMXBean) iter.next();
%>
<tr><td colspan="2">
<table border="0" width="100%" style="border: 1px #98AAB1 solid;">
<tr><td colspan="2" align="center"><b><%= item.getName() %></b></td></tr>
<tr><td width="200">Type</td><td><%= item.getType() %></td></tr>
<tr><td>Usage</td><td><%= item.getUsage() %></td></tr>
<tr><td>Peak Usage</td><td><%= item.getPeakUsage() %></td></tr>
<tr><td>Collection Usage</td><td><%= item.getCollectionUsage() %></td></tr>
</table>
</td></tr>
<tr><td colspan="2"> </td></tr>
<%} %>
</table>
</body>
</html>
使用的結果(JDK1.5)正如doc描述:

從檢測的結果來看,non-heap memory中,包含了perm gen和一部分jvm自用的內存
其中heap memory的最大值即我們指定的啟動參數 -Xmx1024m所指定的1024m
而Perm Gen的最大值即為我們指定的啟動參數 -XX:MaxPermSize=128m 所指定的128m(不指定默認為64m)
一般的OutOfMemory大部分是因為上面兩個配置參數不夠引起的。
當然native heap 也可以產生OutOfMemory,如果os的java可用內存全部分給heap了。
如果發生oom,個人覺得首先是調整參數,比如:-server -Xms1024m -Xmx1024m -XX:PermSize=128m -XX:MaxPermSize=128m
如果參數調整之后還是oom,則需要考慮優化程序了(當然首先要把死遞歸,死循環排除),最好是用工具監測一下。
附我們tomcat配置參數修改方案:
² Tomcat配置的修改(%tomcat%表示tomcat實際安裝目錄)
如果tomcat安裝在Solaris環境下,打開 %tomcat%\bin\catalina.sh 文件,在文件的前面加下面紅色字體的內容(注意有雙引號):
LANG=zh_CN.GB18030
export LANG
JAVA_OPTS="-server -Xms
export JAVA_OPTS
JAVA_OPTS="$JAVA_OPTS -Djava.awt.headless=true"
echo $JAVA_OPTS
如果tomcat安裝在Windows環境下,打開 %tomcat%\bin\catalina.bat 文件,在文件的前面加下面紅色字體的內容(注意沒有雙引號):
set JAVA_OPTS=-server -Xms
打開 %tomcat%\conf\server.xml 文件,下面這行:
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
改成:
maxThreads="250" minSpareThreads="25" maxSpareThreads="100"