当前位置:   article > 正文

利用JAVA代码获得各操作系统内存_java 获取系统内存

java 获取系统内存
各系统获取系统内存的指令
系统命令
windowwmic memorychip get capacity
linuxcat /proc/meminfo
macsysctl hw.memsize
FreeBSDsysctl hw.physmem

 

Java 获取系统内存

  1. package com.bigdata.sampler;
  2. import org.slf4j.Logger;
  3. import org.slf4j.LoggerFactory;
  4. import java.io.BufferedReader;
  5. import java.io.FileReader;
  6. import java.io.IOException;
  7. import java.io.InputStreamReader;
  8. import java.lang.management.ManagementFactory;
  9. import java.lang.management.OperatingSystemMXBean;
  10. import java.lang.reflect.InvocationTargetException;
  11. import java.lang.reflect.Method;
  12. import java.util.regex.Matcher;
  13. import java.util.regex.Pattern;
  14. /**
  15. * Created by yuanhailong on 2019/8/29.
  16. */
  17. public class Hardware {
  18. private static final Logger LOG = LoggerFactory.getLogger(Hardware.class);
  19. private static final String LINUX_MEMORY_INFO_PATH = "/proc/meminfo";
  20. private static final Pattern LINUX_MEMORY_REGEX = Pattern.compile("^MemTotal:\\s*(\\d+)\\s+kB$");
  21. //获取系统CPU数量
  22. public static int getNumberCPUCores() {
  23. return Runtime.getRuntime().availableProcessors();
  24. }
  25. /**
  26. * 获取系统内存
  27. * @return
  28. */
  29. public static long getSizeOfPhysicalMemory() {
  30. //在Oracle JVM下系统有可能直接告诉我们系统内存,因此首先通过这种方式尝试获取内存
  31. try {
  32. Class<?> clazz = Class.forName("com.sun.management.OperatingSystemMXBean");
  33. Method method = clazz.getMethod("getTotalPhysicalMemorySize");
  34. OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
  35. //检查是否是sun提供的MXBean
  36. if (clazz.isInstance(operatingSystemMXBean)) {
  37. return (Long) method.invoke(operatingSystemMXBean);
  38. }
  39. }
  40. catch (Exception e) {
  41. }
  42. if(System.getProperty("os.name").toLowerCase().startsWith("linux")){ //linux system
  43. return getSizeOfPhysicalMemoryForLinux();
  44. }else if (System.getProperty("os.name").toLowerCase().startsWith("window")){
  45. return getSizeOfPhysicalMemoryForWindows();
  46. }else if (System.getProperty("os.name").toLowerCase().startsWith("mac")){
  47. return getSizeOfPhysicalMemoryForMac();
  48. }else if (System.getProperty("os.name").toLowerCase().startsWith("freebsd")){
  49. return getSizeOfPhysicalMemoryForFreeBSD();
  50. }else{
  51. return -1; //如果都不是返回-1
  52. }
  53. }
  54. /**
  55. * Linux系统获取内存
  56. * @return
  57. */
  58. private static long getSizeOfPhysicalMemoryForLinux() {
  59. try (BufferedReader lineReader = new BufferedReader(new FileReader(LINUX_MEMORY_INFO_PATH))) {
  60. String line;
  61. while ((line = lineReader.readLine()) != null) {
  62. Matcher matcher = LINUX_MEMORY_REGEX.matcher(line);
  63. if (matcher.matches()) {
  64. String totalMemory = matcher.group(1);
  65. return Long.parseLong(totalMemory) * 1024L; // 换算为KB
  66. }
  67. }
  68. return -1;
  69. }
  70. catch (Exception e) {
  71. return -1;
  72. }
  73. }
  74. /**
  75. * Mac系统获取内存
  76. */
  77. private static long getSizeOfPhysicalMemoryForMac() {
  78. BufferedReader bi = null;
  79. try {
  80. Process proc = Runtime.getRuntime().exec("sysctl hw.memsize");
  81. bi = new BufferedReader(new InputStreamReader(proc.getInputStream()));
  82. String line;
  83. while ((line = bi.readLine()) != null) {
  84. if (line.startsWith("hw.memsize")) {
  85. long memsize = Long.parseLong(line.split(":")[1].trim());
  86. bi.close();
  87. proc.destroy();
  88. return memsize;
  89. }
  90. }
  91. } catch (Throwable t) {
  92. return -1;
  93. } finally {
  94. if (bi != null) {
  95. try {
  96. bi.close();
  97. } catch (IOException ignored) {}
  98. }
  99. }
  100. return -1;
  101. }
  102. /**
  103. * FreeBSD系统
  104. */
  105. private static long getSizeOfPhysicalMemoryForFreeBSD() {
  106. BufferedReader bi = null;
  107. try {
  108. Process proc = Runtime.getRuntime().exec("sysctl hw.physmem");
  109. bi = new BufferedReader(new InputStreamReader(proc.getInputStream()));
  110. String line;
  111. while ((line = bi.readLine()) != null) {
  112. if (line.startsWith("hw.physmem")) {
  113. long memsize = Long.parseLong(line.split(":")[1].trim());
  114. bi.close();
  115. proc.destroy();
  116. return memsize;
  117. }
  118. }
  119. return -1;
  120. }
  121. catch (Throwable t) {
  122. return -1;
  123. }
  124. finally {
  125. if (bi != null) {
  126. try {
  127. bi.close();
  128. } catch (IOException ignored) {}
  129. }
  130. }
  131. }
  132. /**
  133. * Window 系统
  134. */
  135. private static long getSizeOfPhysicalMemoryForWindows() {
  136. BufferedReader bi = null;
  137. try {
  138. Process proc = Runtime.getRuntime().exec("wmic memorychip get capacity");
  139. bi = new BufferedReader(new InputStreamReader(proc.getInputStream()));
  140. String line = bi.readLine();
  141. if (line == null) {
  142. return -1L;
  143. }
  144. if (!line.startsWith("Capacity")) {
  145. return -1L;
  146. }
  147. long sizeOfPhyiscalMemory = 0L;
  148. while ((line = bi.readLine()) != null) {
  149. if (line.isEmpty()) {
  150. continue;
  151. }
  152. line = line.replaceAll(" ", "");
  153. sizeOfPhyiscalMemory += Long.parseLong(line);
  154. }
  155. return sizeOfPhyiscalMemory;
  156. }
  157. catch (Throwable t) {
  158. return -1L;
  159. }
  160. finally {
  161. if (bi != null) {
  162. try {
  163. bi.close();
  164. } catch (Throwable ignored) {}
  165. }
  166. }
  167. }
  168. public static void main(String[] args) {
  169. System.out.println(Hardware.getSizeOfPhysicalMemory());
  170. }
  171. }

 

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号