Monday, November 05, 2012

Java System Call problem -- in Linux

我們在Java裡面要做execution external command的時候通常會用到Runtime.getRuntime().exec("<你要執行的外部指令>"); 這個算是比較常見的做法,但是他有一些隱含的問題

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的小小(?)陷阱...