【发布时间】:2011-03-02 14:20:49
【问题描述】:
可用 RAM:我的目标指标。
Java:我选择的工具。
???:很好使用后者获取前者的方法。
【问题讨论】:
-
为什么标题要以“网络”开头?
-
“可用内存”如“程序可用的内存”或“系统中未分配的内存”?
标签: java memory operating-system
可用 RAM:我的目标指标。
Java:我选择的工具。
???:很好使用后者获取前者的方法。
【问题讨论】:
标签: java memory operating-system
question 提供了一些有用的信息。
【讨论】:
大概是这样,使用 Java 原生接口 (JNI):
Kernel32 lib = (Kernel32) Native.loadLibrary ("kernel32",Kernel32.class);
Kernel32.MEMORYSTATUS mem = new Kernel32.MEMORYSTATUS ();
lib.GetMem(mem);
System.out.println ("Available physical memory " + mem.dwAvailPhys);
【讨论】:
Kernel32 肯定不是 J2SE 类。
如果不求助于不可移植或本地库,这很难做到。
有点像
Runtime.getRuntime().freeMemory()
只会返回JVM可用的内存,可能与系统范围的可用内存不同。
这个页面提供了一个很好的纲要。
http://blog.codebeach.com/2008/02/determine-available-memory-in-java.html
【讨论】:
我知道有两个项目购买了JNIWrapper,并且对结果很满意。两种基于 Windows 的用法。当我将它嵌入到我们当前的项目中时,我们想知道当用户启动我们的应用程序(WebStart)时有多少可用内存,因为有很多性能投诉很难调查(我们怀疑内存问题)。 JNIWrapper 帮助我们在启动时收集有关可用内存、总数和 CPU 等的统计信息,因此如果用户组在抱怨,我们可以检查我们的统计信息,看看他们是否收到了不可靠的机器。救命。
【讨论】:
通过执行命令free -m获取Free RAM,然后解释如下:
Runtime runtime = Runtime.getRuntime();
BufferedReader br = new BufferedReader(
new InputStreamReader(runtime.exec("free -m").getInputStream()));
String line;
String memLine = "";
int index = 0;
while ((line = br.readLine()) != null) {
if (index == 1) {
memLine = line;
}
index++;
}
// total used free shared buff/cache available
// Mem: 15933 3153 9683 310 3097 12148
// Swap: 3814 0 3814
List<String> memInfoList = Arrays.asList(memLine.split("\\s+"));
int totalSystemMemory = Integer.parseInt(memInfoList.get(1));
int totalSystemUsedMemory = Integer.parseInt(memInfoList.get(2));
int totalSystemFreeMemory = Integer.parseInt(memInfoList.get(3));
System.out.println("Total system memory in mb: " + totalSystemMemory);
System.out.println("Total system used memory in mb: " + totalSystemUsedMemory);
System.out.println("Total system free memory in mb: " + totalSystemFreeMemory);
【讨论】: