- 浏览: 275076 次
- 性别:
- 来自: 南宁
文章分类
- 全部博客 (249)
- Memcached (6)
- 操作系统-Linux (18)
- 操作系统-Windows (2)
- JAVA-多线程 (6)
- Java-Web (46)
- Eclipse (19)
- Struts-Spring-Hibernate (25)
- 消息队列 (10)
- JBPM (3)
- 全文检索-Solr (2)
- WebService (3)
- 数据库-Oracle (9)
- 数据库-MySQL (14)
- 数据库-MS SQL (2)
- ESB(企业服务总线) (1)
- 前端技术 (9)
- 互联网安全技术 (1)
- 日志log4j (3)
- 分布式框架 (11)
- 版本控制-SVN (3)
- 版本控制-Git (5)
- Maven (11)
- 大数据-Hadoop (3)
- PHP (1)
- JAVA注解 (2)
- 系统架构 (1)
- 会话-权限-JWT (10)
- 定时任务 (1)
- 非技术 (1)
- Redis (5)
- Nginx (5)
- 云计算和虚拟化 (1)
- swagger (1)
- 移动端UI和框架 (5)
最新评论
-
lgh1992314:
applicationContext.xml 是 spring ...
Spring的applicationContext和spring-mvc.xml的区别
最近做个项目,就是要取得cpu占有率等等的系统信息,一开始以为要用动态链接库了,但后来发现可以像下面这样做,不去调用jni,这样省去了很多看新技术的时间o(∩_∩)o...
在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。
首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下:
接着编写一个获得当前的监控信息的接口,该类的代码如下所示:
该实现类中需要用到一个自己编写byte的工具类,该类的代码如下所示:
运行下MonitorBeanImpl类,读者将会看到当前的内存、cpu利用率等信息。
在Java中,可以获得总的物理内存、剩余的物理内存、已使用的物理内存等信息,下面例子可以取得这些信息,并且获得在Windows下的内存使用率。
首先编写一个MonitorInfoBean类,用来装载监控的一些信息,包括物理内存、剩余的物理内存、已使用的物理内存、内存使用率等字段,该类的代码如下:
1. package com.amgkaka.performance; 2. 3. /** *//** 4. * 监视信息的JavaBean类. 5. * @author amg 6. * @version 1.0 7. * Creation date: 2008-4-25 - 上午10:37:00 8. */ 9. public class MonitorInfoBean { 10. /** *//** 可使用内存. */ 11. private long totalMemory; 12. 13. /** *//** 剩余内存. */ 14. private long freeMemory; 15. 16. /** *//** 最大可使用内存. */ 17. private long maxMemory; 18. 19. /** *//** 操作系统. */ 20. private String osName; 21. 22. /** *//** 总的物理内存. */ 23. private long totalMemorySize; 24. 25. /** *//** 剩余的物理内存. */ 26. private long freePhysicalMemorySize; 27. 28. /** *//** 已使用的物理内存. */ 29. private long usedMemory; 30. 31. /** *//** 线程总数. */ 32. private int totalThread; 33. 34. /** *//** cpu使用率. */ 35. private double cpuRatio; 36. 37. public long getFreeMemory() { 38. return freeMemory; 39. } 40. 41. public void setFreeMemory(long freeMemory) { 42. this.freeMemory = freeMemory; 43. } 44. 45. public long getFreePhysicalMemorySize() { 46. return freePhysicalMemorySize; 47. } 48. 49. public void setFreePhysicalMemorySize(long freePhysicalMemorySize) { 50. this.freePhysicalMemorySize = freePhysicalMemorySize; 51. } 52. 53. public long getMaxMemory() { 54. return maxMemory; 55. } 56. 57. public void setMaxMemory(long maxMemory) { 58. this.maxMemory = maxMemory; 59. } 60. 61. public String getOsName() { 62. return osName; 63. } 64. 65. public void setOsName(String osName) { 66. this.osName = osName; 67. } 68. 69. public long getTotalMemory() { 70. return totalMemory; 71. } 72. 73. public void setTotalMemory(long totalMemory) { 74. this.totalMemory = totalMemory; 75. } 76. 77. public long getTotalMemorySize() { 78. return totalMemorySize; 79. } 80. 81. public void setTotalMemorySize(long totalMemorySize) { 82. this.totalMemorySize = totalMemorySize; 83. } 84. 85. public int getTotalThread() { 86. return totalThread; 87. } 88. 89. public void setTotalThread(int totalThread) { 90. this.totalThread = totalThread; 91. } 92. 93. public long getUsedMemory() { 94. return usedMemory; 95. } 96. 97. public void setUsedMemory(long usedMemory) { 98. this.usedMemory = usedMemory; 99. } 100. 101. public double getCpuRatio() { 102. return cpuRatio; 103. } 104. 105. public void setCpuRatio(double cpuRatio) { 106. this.cpuRatio = cpuRatio; 107. } 108. }
接着编写一个获得当前的监控信息的接口,该类的代码如下所示:
1. package com.amgkaka.performance; 2. 3. /** *//** 4. * 获取系统信息的业务逻辑类接口. 5. * @author amg * @version 1.0 6. * Creation date: 2008-3-11 - 上午10:06:06 7. */ 8. public interface IMonitorService { 9. /** *//** 10. * 获得当前的监控对象. 11. * @return 返回构造好的监控对象 12. * @throws Exception 13. * @author amgkaka 14. * Creation date: 2008-4-25 - 上午10:45:08 15. */ 16. public MonitorInfoBean getMonitorInfoBean() throws Exception; 17. 18. } 该类的实现类MonitorServiceImpl如下所示: Java代码 1. package com.amgkaka.performance; 2. 3. import java.io.InputStreamReader; 4. import java.io.LineNumberReader; 5. 6. import sun.management.ManagementFactory; 7. 8. import com.sun.management.OperatingSystemMXBean; 9. 10. /** *//** 11. * 获取系统信息的业务逻辑实现类. 12. * @author amg * @version 1.0 Creation date: 2008-3-11 - 上午10:06:06 13. */ 14. public class MonitorServiceImpl implements IMonitorService { 15. //可以设置长些,防止读到运行此次系统检查时的cpu占用率,就不准了 16. private static final int CPUTIME = 5000; 17. 18. private static final int PERCENT = 100; 19. 20. private static final int FAULTLENGTH = 10; 21. 22. /** *//** 23. * 获得当前的监控对象. 24. * @return 返回构造好的监控对象 25. * @throws Exception 26. * @author amg * Creation date: 2008-4-25 - 上午10:45:08 27. */ 28. public MonitorInfoBean getMonitorInfoBean() throws Exception { 29. int kb = 1024; 30. 31. // 可使用内存 32. long totalMemory = Runtime.getRuntime().totalMemory() / kb; 33. // 剩余内存 34. long freeMemory = Runtime.getRuntime().freeMemory() / kb; 35. // 最大可使用内存 36. long maxMemory = Runtime.getRuntime().maxMemory() / kb; 37. 38. OperatingSystemMXBean osmxb = (OperatingSystemMXBean) ManagementFactory 39. .getOperatingSystemMXBean(); 40. 41. // 操作系统 42. String osName = System.getProperty("os.name"); 43. // 总的物理内存 44. long totalMemorySize = osmxb.getTotalPhysicalMemorySize() / kb; 45. // 剩余的物理内存 46. long freePhysicalMemorySize = osmxb.getFreePhysicalMemorySize() / kb; 47. // 已使用的物理内存 48. long usedMemory = (osmxb.getTotalPhysicalMemorySize() - osmxb 49. .getFreePhysicalMemorySize()) 50. / kb; 51. 52. // 获得线程总数 53. ThreadGroup parentThread; 54. for (parentThread = Thread.currentThread().getThreadGroup(); parentThread 55. .getParent() != null; parentThread = parentThread.getParent()) 56. ; 57. int totalThread = parentThread.activeCount(); 58. 59. double cpuRatio = 0; 60. if (osName.toLowerCase().startsWith("windows")) { 61. cpuRatio = this.getCpuRatioForWindows(); 62. } 63. 64. // 构造返回对象 65. MonitorInfoBean infoBean = new MonitorInfoBean(); 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. return infoBean; 76. } 77. 78. /** *//** 79. * 获得CPU使用率. 80. * @return 返回cpu使用率 81. * @author amg * Creation date: 2008-4-25 - 下午06:05:11 82. */ 83. private double getCpuRatioForWindows() { 84. try { 85. String procCmd = System.getenv("windir") 86. + "\\system32\\wbem\\wmic.exe process get Caption,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. long idletime = c1[0] - c0[0]; 94. long busytime = c1[1] - c0[1]; 95. return Double.valueOf( 96. PERCENT * (busytime) / (busytime + idletime)) 97. .doubleValue(); 98. } else { 99. return 0.0; 100. } 101. } catch (Exception ex) { 102. ex.printStackTrace(); 103. return 0.0; 104. } 105. } 106. 107. /** *//** 108. * 读取CPU信息. 109. * @param proc 110. * @return 111. * @author amg * Creation date: 2008-4-25 - 下午06:10:14 112. */ 113. private long[] readCpu(final Process proc) { 114. long[] retn = new long[2]; 115. try { 116. proc.getOutputStream().close(); 117. InputStreamReader ir = new InputStreamReader(proc.getInputStream()); 118. LineNumberReader input = new LineNumberReader(ir); 119. String line = input.readLine(); 120. if (line == null || line.length() < FAULTLENGTH) { 121. return null; 122. } 123. int capidx = line.indexOf("Caption"); 124. int cmdidx = line.indexOf("CommandLine"); 125. int rocidx = line.indexOf("ReadOperationCount"); 126. int umtidx = line.indexOf("UserModeTime"); 127. int kmtidx = line.indexOf("KernelModeTime"); 128. int wocidx = line.indexOf("WriteOperationCount"); 129. long idletime = 0; 130. long kneltime = 0; 131. long usertime = 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. String caption = Bytes.substring(line, capidx, cmdidx - 1) 139. .trim(); 140. String cmd = 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("System Idle Process") 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. return retn; 166. } catch (Exception ex) { 167. ex.printStackTrace(); 168. } finally { 169. try { 170. proc.getInputStream().close(); 171. } catch (Exception e) { 172. e.printStackTrace(); 173. } 174. } 175. return null; 176. } 177. 178. /** *//** 179. * 测试方法. 180. * @param args 181. * @throws Exception 182. * @author amg * Creation date: 2008-4-30 - 下午04:47:29 183. */ 184. public static void main(String[] args) throws Exception { 185. IMonitorService service = new MonitorServiceImpl(); 186. MonitorInfoBean monitorInfo = 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. } }
该实现类中需要用到一个自己编写byte的工具类,该类的代码如下所示:
1. package com.amgkaka.performance; 2. 3. /** *//** 4. * byte操作类. 5. * @author amg * @version 1.0 6. * Creation date: 2008-4-30 - 下午04:57:23 7. */ 8. public class Bytes { 9. /** *//** 10. * 由于String.subString对汉字处理存在问题(把一个汉字视为一个字节),因此在 11. * 包含汉字的字符串时存在隐患,现调整如下: 12. * @param src 要截取的字符串 13. * @param start_idx 开始坐标(包括该坐标) 14. * @param end_idx 截止坐标(包括该坐标) 15. * @return 16. */ 17. public static String substring(String src, int start_idx, int end_idx){ 18. byte[] b = src.getBytes(); 19. String tgt = ""; 20. for(int i=start_idx; i<=end_idx; i++){ 21. tgt +=(char)b[i]; 22. } 23. return tgt; 24. } }
运行下MonitorBeanImpl类,读者将会看到当前的内存、cpu利用率等信息。
发表评论
-
JAVA SortedMap接口
2020-03-23 11:03 462SortedMap接口主要提供有序的Map实现。 M ... -
java利用Jpcap实现抓包
2019-03-28 11:27 16741.准备工作 Jpcap是一个可以监控当前网络情况的 ... -
实战:使用JpcapCaptor实例来捕捉网络数据包
2019-03-28 11:23 709当你通过打开网卡设备得到JpcapCaptor实例后,就可以 ... -
通过java进行电脑屏幕截图
2019-01-22 03:12 865package image; import java. ... -
Java中将InputStream读取为String, 各种方法的性能对比
2018-09-17 13:12 1125如下, 一共存在11种实现方式及其对应的性能测试结果:1. ... -
浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
2018-07-29 21:10 5611.@RequestMapping 国际惯例先介绍什么是@ ... -
关于split截取字符时,问号的特殊情况
2018-06-10 00:09 2688有一段字符 tring str = “gjjxxcx/gjj ... -
报错:No main manifest attribute
2018-04-15 23:21 5457报错信息 在Linux系统下执行Java -jar XXX ... -
CentOS下安装JDK的三种方法
2018-04-15 23:31 351由于各Linux开发厂商的不同,因此不同开发厂商的Linux ... -
Lombok 安装、入门 - 消除冗长的 java 代码
2017-10-25 22:31 369前言: 逛开源社区的时候无意发现的,用了一段时间,觉 ... -
Filter 过滤器
2017-04-18 09:32 487原文链接:http://tianweili.github. ... -
BigDecimal如何比较是否相等
2016-11-29 18:30 5447例子: BigDecimal a = new BigDec ... -
Tomcat内存设置详解
2016-11-01 18:53 417Java内存溢出详解 ... -
RESTful API 设计指南
2016-10-10 19:39 442网络应用程序,分为前端和后端两个部分。当前的发展趋势,就是前 ... -
getJdbcTemplate中execute和update的区别
2016-04-29 17:48 14821、update可以带参数,而execute不可以。例如:j ... -
处理大数字BigInteger与BigDecimal
2016-04-27 17:01 758关键技术剖析: ² BigInteger:支持任意精度的整 ... -
深入理解 Java中的 流 (Stream)
2016-04-27 16:58 689个人小站,正在持续整理中,欢迎访问:http://shito ... -
关于split函数的注意点
2016-04-27 16:58 607如果 String str = "aa|bb| ... -
企业数据总线(ESB)和注册服务管理(dubbo)的区别
2016-04-20 17:50 1580一、概述 1、什么是ESB ... -
Quartz作业调度框架
2016-04-20 14:11 456Quartz 是一个开源的作业调度框架,它完全由 Java ...
相关推荐
监控Tomcat内存使用情况是确保应用稳定运行的关键环节。Tomcat作为一款广泛应用的Java Servlet容器,其内存管理直接影响到Web应用程序的性能和响应速度。理解并监控这些内存指标可以帮助我们及时发现并解决潜在的...
### 修改Tomcat内存大小 在部署Java Web应用时,经常需要根据实际运行...- 定期监控Tomcat的内存使用情况,以便及时调整配置。 通过以上步骤,我们可以有效地调整Tomcat服务器的内存配置,以满足不同场景下的需求。
4. **使用工具辅助诊断**:可以利用JVisualVM等工具来监控和分析Java应用程序的内存使用情况,及时发现并解决问题。 综上所述,通过合理配置JVM参数,可以在很大程度上避免Tomcat服务器上的Java应用出现内存溢出的...
TOMCAT内存大小调整是指在使用Java程序从数据库中查询大量数据或应用服务器(如Tomcat、JBoss、WebLogic)加载jar包时,出现java.lang.OutOfMemoryError异常的解决方法。这种异常主要是由于应用服务器的内存不足引起...
为了解决Tomcat内存溢出问题,主要是加大Tomcat可利用内存,并在程序当中加大内存使用。具体解决方法如下: 1. 加大Tomcat可利用内存: 在Tomcat的目录下,也就是在Tomcat41/bin/catalina.bat文件最前面加入set ...
### Tomcat 6.0 修改启动内存设置及 Java JVM 参数配置详解 #### 一、背景与目的 在部署和运行 Java Web 应用时,合理地配置应用服务器(如 Apache Tomcat)的内存是非常重要的。这不仅可以提升应用程序的性能,还...
- **监控与测试**:使用性能监控工具(如JMX、VisualVM等)实时监测Tomcat的内存使用情况,并通过压力测试评估不同内存配置下的应用性能。 - **分阶段调整**:在调整参数时,建议采用分阶段的方式逐步试验,每调整一...
- **JVM工具**:使用JDK自带的JConsole、VisualVM或JProfiler等工具可以实时监控Tomcat的内存使用情况,找出可疑的对象和类。 - **heap dump**:通过JVM命令`jmap -dump`生成堆转储文件,然后使用分析工具查看内存...
4. **监控和分析**:使用JMX(Java Management Extensions)或者第三方工具(如VisualVM,JProfiler)实时监控Tomcat的内存使用情况,帮助找出内存泄露的源头。此外,JVM的堆转储(Heap Dump)文件也能提供详细的...
通常,我们可以通过监控Tomcat的内存使用情况,如通过JMX或VisualVM等工具,来确定合适的内存分配值。同时,优化应用的内存使用,如减少对象创建和及时垃圾回收,也是提高Tomcat性能的重要手段。 总结来说,本文件...
#### 四、Tomcat内存配置 Tomcat是一款免费开源的轻量级Web服务器,常用于部署Java Web应用程序。 **1. 配置步骤** 使用Eclipse的Tomcat插件时,可以在“Window > Preferences > Tomcat > JVM Setting”中添加相应...
【标题】"Tomcat-9-Java" 是一个与Java应用程序服务器相关的主题,特别是关于Tomcat的第9个主要版本。Tomcat是一个开源的、基于Java的Web应用服务器,广泛用于部署Servlet和JSP应用程序。它由Apache软件基金会维护,...
通过对Tomcat内存配置的深入理解与实践,我们可以更高效地管理和优化Java Web应用程序的性能。需要注意的是,内存配置并不是一成不变的,而应该根据具体的应用场景和服务器硬件条件进行调整。同时,随着技术的发展,...
2. **分析内存使用**:使用内存分析工具,如VisualVM或JProfiler,来监控Tomcat运行时的内存使用情况,找出内存泄漏的源头。 3. **优化代码**:检查代码中是否有创建大量临时对象、未及时释放大对象或者静态变量...