我目前正在托管一个java服务器程序(craftbukkit),似乎当我尝试从服务器程序(craftbukkit)获取RAM使用时,它不会返回实际使用的RAM,而是在某个地方大约一半它正在使用什么。 (虽然它并不总是一半,所以用这种方式估算实际的RAM使用率是不可能的。)
我想知道如何获得java进程使用的实际RAM,如系统监视工具(在linux上)中所见,这样我就可以检索用于报告的RAM数量。系统
我之前看过一个使用进程PID的例子,但我不知道如何获取进程的PID,只知道名称。(只有一个java实例正在运行,所以我们没有不得不担心得到错误的结果)
提前致谢!
使用ps -ef | grep“java”我得到以下输出
prodynamics@prodynamics:~$ ps -ef | grep "java"
1000 22292 29385 75 12:08 pts/0 00:42:19 java -Xmx3100M -Xms1024M -XX:MaxPermSize=248m -jar craftbukkit.jar
1000 23544 23443 0 13:04 pts/2 00:00:00 grep java
但是用ps -eo pid | grep“java” 控制台根本不返回任何结果。虽然根据我的理解,它应该返回PID。
答案 0 :(得分:0)
我能够通过以下
成功获得PIDps -eo pid,comm | grep 'java$' | awk '{print $1}' | head -1
答案 1 :(得分:0)
如果您真的需要,可以尝试以下方法:
ps -ef | grep "java" | grep -v -i "grep" | cut -d ' ' -f 7
这将仅返回java进程的PID,并将排除您以此方式进行的grep
调用。根据您的系统,最终可能需要对7进行一些调整。
它的作用是从ps -ef
获取所有结果并过滤为仅包含java
但不包含grep
的结果。然后它会在每个空格处剪切结果,并返回字段7(其中7是结尾处的数字)
答案 2 :(得分:0)
使用ps
,管道,grep
a.o,您无需浪费时间。您所需要的只是pgrep
:
pgrep java
有关详细信息,请参阅man pgrep
。
答案 3 :(得分:0)
您还可以使用platform runtime MXBean的getName()
方法从Java应用程序中检索PID:
import java.lang.management.ManagementFactory;
public class Pid {
/**
* Return the current process ID.
* @return the pid as an int, or -1 if the pid could not be obtained.
*/
public static int getPID() {
int pid = -1;
// we expect the name to be in '<pid>@hostname' format - this is JVM dependent
String name = ManagementFactory.getRuntimeMXBean().getName();
int idx = name.indexOf('@');
if (idx >= 0) {
String sub = name.substring(0, idx);
try {
pid = Integer.valueOf(sub);
System.out.println("process name=" + name + ", pid=" + pid);
} catch (Exception e) {
System.out.println("could not parse '" + sub +"' into a valid integer pid :");
e.printStackTrace();
}
}
return pid;
}
}