Process p = Runtime.getRuntime().exec("ps -al");
BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
//然後讀取InputStream做分析…
這是通解,不過這有個很大的問題。事實上, Runtime.getRuntime().exec在Linux實作上似乎是採取fork()的方式。眾所皆知的是,fork的實作方法是duplicate parent PID的資源。這在小規模下其實不成問題,問題在於…當java memory佔用量很大的時候…
比方說,以我們這個case,2G。所以每call一次system call都會造成系統嚴重occupied。
目前我們是採用jni的方式,把system call轉移到c的部分去做。因為它是一個獨立的pid,所以不會因此而產生巨大的paging(這拷貝動作的paging實在很驚人)。這算是在java底下system call的小小(?)陷阱...
//然後讀取InputStream做分析…
這是通解,不過這有個很大的問題。事實上, Runtime.getRuntime().exec在Linu
比方說,以我們這個case,2G。所以每call一次syst
目前我們是採用jni的方式,把system call轉移到c的部分去做。因為它是一個獨立的pid,所以不