您可以用把下列代码放在一个JSP文件中,如写入memory.jsp,放到你的TOMCAT下的任何一应用中,就可以看到你的TOMCAT总大可使用多少内存,已经使用了多少.
<%--
Document : memory
Created on : 2009-4-9, 1:35:17
Author : Administrator
--%><%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd"> <html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JVM memory</title>
</head>
<body>
<%
double total = (Runtime.getRuntime().totalMemory()) / (1024.0 * 1024);
double max = (Runtime.getRuntime().maxMemory()) / (1024.0 * 1024);
double free = (Runtime.getRuntime().freeMemory()) / (1024.0 * 1024);
out.println("Java 虚拟机试图使用的最大内存量(当前JVM的最大可用内存)maxMemory(): " + max + "MB<br/>");
out.println("Java 虚拟机中的内存总量(当前JVM占用的内存总数)totalMemory(): " + total + "MB<br/>");
out.println("Java 虚拟机中的空闲内存量(当前JVM空闲内存)freeMemory(): " + free + "MB<br/>");
out.println("因为JVM只有在需要内存时才占用物理内存使用,所以freeMemory()的值一般情况下都很小,<br/>" +
"而JVM实际可用内存并不等于freeMemory(),而应该等于 maxMemory()-totalMemory()+freeMemory()。<br/>");
out.println("JVM实际可用内存: " + (max - total + free) + "MB<br/>");
out.println("jspcn");
%>
</body>
</html>
上面的例子基本可以满足性能调试使用,下面的比较详细,需要开发代码,暂时使用上面简单例子。
---------------------------------------------------------
同样也可以进入tomcat管理页面,查看内存使用情况,但是平常在生产环境都禁掉了管理员登录页面。
http://zhumeng8337797.blog.163.com/blog/static/10076891420129223928915/
1. Tomcat6中没有设置任何默认用户,因而需要手动往Tomcat6的conf文件夹下的tomcat-users.xml文件中添加用户。
如:<role rolename="manager"/>
<user username="tomcat" password="tomcat" roles="manager"/>
注:添加完需要重启Tomcat6。
2. 访问http://localhost:8080/manager/status,输入上面添加的用户名和密码。
3. 然后在如下面的JVM下可以看到内存的使用情况。
JVM:Free memory: 2.50 MB Total memory: 15.53 MB Max memory: 63.56 MB
Free memory:当前可用的内存;
Total memory:当前已经分配的JVM内存;
Max memory:当前允许分配的最大JVM内存;
上周的题目有些简单,但是tomcat也需要我们研究一下,因为涉及的知识不多,但是将来这些都是部署时候非常有用的技术。
-------------------------------------------------------
java不用jni,也可以获得当前系统性能信息
最近做个项目,就是要取得cpu占有率等等的系统信息,一开始以为要用动态链接库了,但后来发现可以像下面这样做,不去调用jni,这样省去了很多看新技术的时间o(∩_∩)o...
在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。
首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下:
1. packagecom.amgkaka.performance;
2.
3. /***//**
4. *监视信息的JavaBean类.
5. *@authoramg
6. *@version1.0
7. *Creationdate:2008-4-25-上午10:37:00
8. */
9. publicclassMonitorInfoBean{
10. /***//**可使用内存.*/
11. privatelongtotalMemory;
12.
13. /***//**剩余内存.*/
14. privatelongfreeMemory;
15.
16. /***//**最大可使用内存.*/
17. privatelongmaxMemory;
18.
19. /***//**操作系统.*/
20. privateStringosName;
21.
22. /***//**总的物理内存.*/
23. privatelongtotalMemorySize;
24.
25. /***//**剩余的物理内存.*/
26. privatelongfreePhysicalMemorySize;
27.
28. /***//**已使用的物理内存.*/
29. privatelongusedMemory;
30.
31. /***//**线程总数.*/
32. privateinttotalThread;
33.
34. /***//**cpu使用率.*/
35. privatedoublecpuRatio;
36.
37. publiclonggetFreeMemory(){
38. returnfreeMemory;
39. }
40.
41. publicvoidsetFreeMemory(longfreeMemory){
42. this.freeMemory=freeMemory;
43. }
44.
45. publiclonggetFreePhysicalMemorySize(){
46. returnfreePhysicalMemorySize;
47. }
48.
49. publicvoidsetFreePhysicalMemorySize(longfreePhysicalMemorySize){
50. this.freePhysicalMemorySize=freePhysicalMemorySize;
51. }
52.
53. publiclonggetMaxMemory(){
54. returnmaxMemory;
55. }
56.
57. publicvoidsetMaxMemory(longmaxMemory){
58. this.maxMemory=maxMemory;
59. }
60.
61. publicStringgetOsName(){
62. returnosName;
63. }
64.
65. publicvoidsetOsName(StringosName){
66. this.osName=osName;
67. }
68.
69. publiclonggetTotalMemory(){
70. returntotalMemory;
71. }
72.
73. publicvoidsetTotalMemory(longtotalMemory){
74. this.totalMemory=totalMemory;
75. }
76.
77. publiclonggetTotalMemorySize(){
78. returntotalMemorySize;
79. }
80.
81. publicvoidsetTotalMemorySize(longtotalMemorySize){
82. this.totalMemorySize=totalMemorySize;
83. }
84.
85. publicintgetTotalThread(){
86. returntotalThread;
87. }
88.
89. publicvoidsetTotalThread(inttotalThread){
90. this.totalThread=totalThread;
91. }
92.
93. publiclonggetUsedMemory(){
94. returnusedMemory;
95. }
96.
97. publicvoidsetUsedMemory(longusedMemory){
98. this.usedMemory=usedMemory;
99. }
100.
101. publicdoublegetCpuRatio(){
102. returncpuRatio;
103. }
104.
105. publicvoidsetCpuRatio(doublecpuRatio){
106. this.cpuRatio=cpuRatio;
107. }
108. }
接着编写一个获得当前的监控信息的接口,该类的代码如下所示:
1. packagecom.amgkaka.performance;
2.
3. /***//**
4. *获取系统信息的业务逻辑类接口.
5. *@authoramg*@version1.0
6. *Creationdate:2008-3-11-上午10:06:06
7. */
8. publicinterfaceIMonitorService{
9. /***//**
10. *获得当前的监控对象.
11. *@return返回构造好的监控对象
12. *@throwsException
13. *@authoramgkaka
14. *Creationdate:2008-4-25-上午10:45:08
15. */
16. publicMonitorInfoBeangetMonitorInfoBean()throwsException;
17.
18. }
该类的实现类MonitorServiceImpl如下所示:
1. packagecom.amgkaka.performance;
2.
3. importjava.io.InputStreamReader;
4. importjava.io.LineNumberReader;
5.
6. importsun.management.ManagementFactory;
7.
8. importcom.sun.management.OperatingSystemMXBean;
9.
10. /***//**
11. *获取系统信息的业务逻辑实现类.
12. *@authoramg*@version1.0Creationdate:2008-3-11-上午10:06:06
13. */
14. publicclassMonitorServiceImplimplementsIMonitorService{
15. //可以设置长些,防止读到运行此次系统检查时的cpu占用率,就不准了
16. privatestaticfinalintCPUTIME=5000;
17.
18. privatestaticfinalintPERCENT=100;
19.
20. privatestaticfinalintFAULTLENGTH=10;
21.
22. /***//**
23. *获得当前的监控对象.
24. *@return返回构造好的监控对象
25. *@throwsException
26. *@authoramg*Creationdate:2008-4-25-上午10:45:08
27. */
28. publicMonitorInfoBeangetMonitorInfoBean()throwsException{
29. intkb=1024;
30.
31. //可使用内存
32. longtotalMemory=Runtime.getRuntime().totalMemory()/kb;
33. //剩余内存
34. longfreeMemory=Runtime.getRuntime().freeMemory()/kb;
35. //最大可使用内存
36. longmaxMemory=Runtime.getRuntime().maxMemory()/kb;
37.
38. OperatingSystemMXBeanosmxb=(OperatingSystemMXBean)ManagementFactory
39. .getOperatingSystemMXBean();
40.
41. //操作系统
42. StringosName=System.getProperty("os.name");
43. //总的物理内存
44. longtotalMemorySize=osmxb.getTotalPhysicalMemorySize()/kb;
45. //剩余的物理内存
46. longfreePhysicalMemorySize=osmxb.getFreePhysicalMemorySize()/kb;
47. //已使用的物理内存
48. longusedMemory=(osmxb.getTotalPhysicalMemorySize()-osmxb
49. .getFreePhysicalMemorySize())
50. /kb;
51.
52. //获得线程总数
53. ThreadGroupparentThread;
54. for(parentThread=Thread.currentThread().getThreadGroup();parentThread
55. .getParent()!=null;parentThread=parentThread.getParent())
56. ;
57. inttotalThread=parentThread.activeCount();
58.
59. doublecpuRatio=0;
60. if(osName.toLowerCase().startsWith("windows")){
61. cpuRatio=this.getCpuRatioForWindows();
62. }
63.
64. //构造返回对象
65. MonitorInfoBeaninfoBean=newMonitorInfoBean();
66. infoBean.setFreeMemory(freeMemory);
67. infoBean.setFreePhysicalMemorySize(freePhysicalMemorySize);
68. infoBean.setMaxMemory(maxMemory);
69. infoBean.setOsName(osName);
70. infoBean.setTotalMemory(totalMemory);
71. infoBean.setTotalMemorySize(totalMemorySize);
72. infoBean.setTotalThread(totalThread);
73. infoBean.setUsedMemory(usedMemory);
74. infoBean.setCpuRatio(cpuRatio);
75. returninfoBean;
76. }
77.
78. /***//**
79. *获得CPU使用率.
80. *@return返回cpu使用率
81. *@authoramg*Creationdate:2008-4-25-下午06:05:11
82. */
83. privatedoublegetCpuRatioForWindows(){
84. try{
85. StringprocCmd=System.getenv("windir")
86. +"\\system32\\wbem\\wmic.exeprocessgetCaption,CommandLine,"
87. +"KernelModeTime,ReadOperationCount,ThreadCount,UserModeTime,WriteOperationCount";
88. //取进程信息
89. long[]c0=readCpu(Runtime.getRuntime().exec(procCmd));
90. Thread.sleep(CPUTIME);
91. long[]c1=readCpu(Runtime.getRuntime().exec(procCmd));
92. if(c0!=null&&c1!=null){
93. longidletime=c1[0]-c0[0];
94. longbusytime=c1[1]-c0[1];
95. returnDouble.valueOf(
96. PERCENT*(busytime)/(busytime+idletime))
97. .doubleValue();
98. }else{
99. return0.0;
100. }
101. }catch(Exceptionex){
102. ex.printStackTrace();
103. return0.0;
104. }
105. }
106.
107. /***//**
108. *读取CPU信息.
109. *@paramproc
110. *@return
111. *@authoramg*Creationdate:2008-4-25-下午06:10:14
112. */
113. privatelong[]readCpu(finalProcessproc){
114. long[]retn=newlong[2];
115. try{
116. proc.getOutputStream().close();
117. InputStreamReaderir=newInputStreamReader(proc.getInputStream());
118. LineNumberReaderinput=newLineNumberReader(ir);
119. Stringline=input.readLine();
120. if(line==null||line.length()<FAULTLENGTH){
121. returnnull;
122. }
123. intcapidx=line.indexOf("Caption");
124. intcmdidx=line.indexOf("CommandLine");
125. introcidx=line.indexOf("ReadOperationCount");
126. intumtidx=line.indexOf("UserModeTime");
127. intkmtidx=line.indexOf("KernelModeTime");
128. intwocidx=line.indexOf("WriteOperationCount");
129. longidletime=0;
130. longkneltime=0;
131. longusertime=0;
132. while((line=input.readLine())!=null){
133. if(line.length()<wocidx){
134. continue;
135. }
136. //字段出现顺序:Caption,CommandLine,KernelModeTime,ReadOperationCount,
137. //ThreadCount,UserModeTime,WriteOperation
138. Stringcaption=Bytes.substring(line,capidx,cmdidx-1)
139. .trim();
140. Stringcmd=Bytes.substring(line,cmdidx,kmtidx-1).trim();
141. if(cmd.indexOf("wmic.exe")>=0){
142. continue;
143. }
144. //log.info("line="+line);
145. if(caption.equals("SystemIdleProcess")
146. ||caption.equals("System")){
147. idletime+=Long.valueOf(
148. Bytes.substring(line,kmtidx,rocidx-1).trim())
149. .longValue();
150. idletime+=Long.valueOf(
151. Bytes.substring(line,umtidx,wocidx-1).trim())
152. .longValue();
153. continue;
154. }
155.
156. kneltime+=Long.valueOf(
157. Bytes.substring(line,kmtidx,rocidx-1).trim())
158. .longValue();
159. usertime+=Long.valueOf(
160. Bytes.substring(line,umtidx,wocidx-1).trim())
161. .longValue();
162. }
163. retn[0]=idletime;
164. retn[1]=kneltime+usertime;
165. returnretn;
166. }catch(Exceptionex){
167. ex.printStackTrace();
168. }finally{
169. try{
170. proc.getInputStream().close();
171. }catch(Exceptione){
172. e.printStackTrace();
173. }
174. }
175. returnnull;
176. }
177.
178. /***//**
179. *测试方法.
180. *@paramargs
181. *@throwsException
182. *@authoramg*Creationdate:2008-4-30-下午04:47:29
183. */
184. publicstaticvoidmain(String[]args)throwsException{
185. IMonitorServiceservice=newMonitorServiceImpl();
186. MonitorInfoBeanmonitorInfo=service.getMonitorInfoBean();
187. System.out.println("cpu占有率="+monitorInfo.getCpuRatio());
188.
189. System.out.println("可使用内存="+monitorInfo.getTotalMemory());
190. System.out.println("剩余内存="+monitorInfo.getFreeMemory());
191. System.out.println("最大可使用内存="+monitorInfo.getMaxMemory());
192.
193. System.out.println("操作系统="+monitorInfo.getOsName());
194. System.out.println("总的物理内存="+monitorInfo.getTotalMemorySize()+"kb");
195. System.out.println("剩余的物理内存="+monitorInfo.getFreeMemory()+"kb");
196. System.out.println("已使用的物理内存="+monitorInfo.getUsedMemory()+"kb");
197. System.out.println("线程总数="+monitorInfo.getTotalThread()+"kb");
198. }
199. }
该实现类中需要用到一个自己编写byte的工具类,该类的代码如下所示:
1. packagecom.amgkaka.performance;
2.
3. /***//**
4. *byte操作类.
5. *@authoramg*@version1.0
6. *Creationdate:2008-4-30-下午04:57:23
7. */
8. publicclassBytes{
9. /***//**
10. *由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在
11. *包含汉字的字符串时存在隐患,现调整如下:
12. *@paramsrc要截取的字符串
13. *@paramstart_idx开始坐标(包括该坐标)
14. *@paramend_idx截止坐标(包括该坐标)
15. *@return
16. */
17. publicstaticStringsubstring(Stringsrc,intstart_idx,intend_idx){
18. byte[]b=src.getBytes();
19. Stringtgt="";
20. for(inti=start_idx;i<=end_idx;i++){
21. tgt+=(char)b[i];
22. }
23. returntgt;
24. }
25. }
运行下MonitorBeanImpl类,读者将会看到当前的内存、cpu利用率等信息。