WAS(Tomcat 또는 기타등등~) 메모리 사용현황 모니터링 JSP

java.lang.management.ManagementFactory 클래스를 이용하면 현재 실행중인 JVM 의 여러가지 정보를 가져올수 있다.

ManagementFactory 를 통해 가져올수 있는 정보들은 대충 메소드 이름을 보면 알수 있다.


뭐 이것저것 있는것 같은데 다른것들은 나중에 시간되면 한번 써묵어 보도록 해야겠다.



아무튼 쓸 수 있는 여러가지 메소드들중 
ManagementFactory.getMemoryMXBean() 메소드와 ManagementFactory.getMemoryPoolMXBeans() 메소드를 이용하면 현재 JVM 의 메모리 사용현황을 조회하는 JSP 페이지를 작성할 수 있다.

맨들 페이지의 최종 모양은 대충 요렇다.



그리고 JSP 솟스~!
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>

<%@ page import="java.lang.management.ManagementFactory"%>
<%@ page import="java.lang.management.MemoryMXBean"%>

<%
	pageContext.setAttribute("memoryBean", ManagementFactory.getMemoryMXBean());
	pageContext.setAttribute("poolBeans", ManagementFactory.getMemoryPoolMXBeans());
%>

<html>
<head>
	<title>JVM Memory Monitor</title>

	<style type="text/css">
		body{ font-family:"Myriad Pro","Myriad Web","Tahoma","Helvetica","Arial",sans-serif; }
		table{ border-collapse: collapse; }
		td,th{ padding: 5px; }
		th { background-color: navy; color: #fff; font-weight: bold; }
		td { text-align: right; }
	</style>
</head>

<body>
	<h1>TOTAL</h1>
	
	<table border="1" width="100%">
		<colgroup>
			<col width="20%"/>
			<col width="20%"/>
			<col width="20%"/>
			<col width="20%"/>
			<col width="20%"/>
		</colgroup>
		<tr>
			<th>Usage</th>
			<th>Max</th>
			<th>Init</th>
			<th>Used</th>
			<th>Committed</th>
		</tr>
		<tr>
			<td style="text-align: left">Heap Memory Usage</td>
			<td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.max/(1024 * 1024)}" 
					maxFractionDigits="1" />MB</td>
			<td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.init/(1024 * 1024)}" 
					maxFractionDigits="1" />MB</td>
			<td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.used/(1024 * 1024)}" 
					maxFractionDigits="1" />MB</td>
			<td><fmt:formatNumber value="${memoryBean.heapMemoryUsage.committed/(1024 * 1024)}"
					maxFractionDigits="1" />MB</td>
		</tr>
		<tr>
			<td style="text-align: left">Non-heap Memory Usage</td>
			<td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.max/(1024 * 1024)}" 
					maxFractionDigits="1" />MB</td>
			<td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.init/(1024 * 1024)}" 
					maxFractionDigits="1" />MB</td>
			<td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.used/(1024 * 1024)}" 
					maxFractionDigits="1" />MB</td>
			<td><fmt:formatNumber value="${memoryBean.nonHeapMemoryUsage.committed/(1024 * 1024)}" 
					maxFractionDigits="1" />MB</td>
		</tr>
	</table>

	<hr/>
	<h1>Memory Pools</h1>
	
	<c:forEach var="bean" items="${poolBeans}">
		<h2>${bean.name}(${bean.type})</h2>
		<table border="1" width="100%">
			<colgroup>
				<col width="20%"/>
				<col width="20%"/>
				<col width="20%"/>
				<col width="20%"/>
				<col width="20%"/>
			</colgroup>
			<tr>
				<th>Usage</th>
				<th>Max</th>
				<th>Init</th>
				<th>Used</th>
				<th>Committed</th>
			</tr>
			<tr>
				<td style="text-align: left">Memory Usage</td>
				<td><fmt:formatNumber value="${bean.usage.max/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.usage.init/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.usage.used/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.usage.committed/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
			</tr>
			<tr>
				<td style="text-align: left">Peak Usage</td>
				<td><fmt:formatNumber value="${bean.peakUsage.max/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.peakUsage.init/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.peakUsage.used/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.peakUsage.committed/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
			</tr>
			<tr>
				<td style="text-align: left">Collection Usage</td>
				<td><fmt:formatNumber value="${bean.collectionUsage.max/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.collectionUsage.init/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.collectionUsage.used/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
				<td><fmt:formatNumber value="${bean.collectionUsage.committed/(1024 * 1024)}" 
						maxFractionDigits="1" />MB</td>
			</tr>
		</table>
	</c:forEach>
</body>
</html>

이 페이지를 실행하기 위해서는 jstl-1.2.jar 파일을 WEB-INF/lib 폴더에 추가시켜 주면되고,

maven 을 이용하는 경우는 dependencies 에
<dependency>
	<groupId>jstl</groupId>
	<artifactId>jstl</artifactId>
	<version>1.2</version>
</dependency>
을 추가하면 된다.

jstl-1.2.jar