以前、お仕事をさせて頂いた方から質問を頂いたのでちょっと調べてみた。
Q & A
Q.
Solaris10 で、java のプロセスを多数起動していくと物理メモリではなく、swap から使っているように見える。
vmstat の結果をチェックしていたら、free には余裕があるように見えるのに、java のプロセスの起動と共に swap が、どんどん減っていく。物理メモリに余裕あるのに、swap から使っていくのはなぜか?
A.
物理メモリ不足で swap を使っているのではなく、カーネルが活動が少ない部分をメモリから排除して swap に追い出し、空いたメモリをバッファやキャッシュに転用しているためではないかと思います。
検証結果
$ cat Hoge.java public class Hoge { public static void main(String[] args) { for(;;){ try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } } $ javac Hoge.java $ for i in {1..20} > do > java -Xms512M Hoge >/dev/null 2>&1 & > done [1] 24492 [2] 24493 [3] 24494 [4] 24497 [5] 24498 [6] 24499 [7] 24500 [8] 24501 [9] 24502 [10] 24503 [11] 24510 [12] 24511 [13] 24512 [14] 24513 [15] 24514 [16] 24515 [17] 24516 [18] 24527 [19] 24528 [20] 24529 $ pkill -f Hoge
$ vmstat 2 procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ r b swpd free buff cache si so bi bo in cs us sy id wa st 0 0 302184 148080 172964 1358308 1 1 8 9 6 13 0 0 100 0 0 0 0 302184 148080 172964 1358316 0 0 0 8 1006 183 0 0 100 0 0 0 0 302184 148080 172964 1358316 0 0 0 8 1011 209 0 0 100 0 0 0 0 302184 148080 172988 1358308 0 0 0 24 1008 183 0 0 100 0 0 20 0 302184 75592 172988 1358912 0 0 2 24 1022 409 16 9 75 0 0 <-- java プロセス起動 0 0 302184 59348 172988 1358908 0 0 6 30 1010 978 15 3 83 0 0 0 0 302184 59348 172996 1358900 0 0 0 14 1005 863 0 0 100 0 0 0 0 302184 59224 173036 1359004 0 0 0 88 1010 914 0 0 100 0 0 0 0 302184 59224 173036 1359004 0 0 0 8 1006 878 0 0 100 0 0 0 0 302184 59224 173044 1358972 0 0 0 18 1006 881 0 0 100 0 0 0 0 302184 59224 173044 1358980 0 0 0 48 1010 889 0 0 100 0 0 0 0 302184 59224 173044 1358980 0 0 0 8 1006 873 0 0 100 0 0 2 0 302184 59224 173052 1358972 0 0 0 6 1004 894 0 0 100 0 0 0 0 302184 59224 173052 1358980 0 0 0 10 1005 884 0 0 100 0 0 2 0 302184 59224 173052 1358980 0 0 0 18 1006 876 0 0 100 0 0 0 0 302184 59224 173064 1358968 0 0 0 14 1015 927 0 0 100 0 0 2 0 302184 59224 173064 1358968 0 0 0 8 1013 900 0 0 100 0 0 0 0 302184 59224 173064 1358968 0 0 0 8 1003 892 0 0 100 0 0 0 0 302184 146520 173072 1358376 0 0 0 6 1009 860 3 2 95 0 0 <-- java プロセス kill 0 0 302184 146644 173072 1358380 0 0 0 18 1004 178 0 0 100 0 0 0 0 302184 146644 173072 1358380 0 0 0 8 1003 170 0 0 100 0 0 0 0 302184 146768 173104 1358372 0 0 0 40 1007 183 0 0 100 0 0 0 0 302184 146768 173104 1358332 0 0 0 8 1004 176 0 0 100 0 0 0 0 302184 147016 173104 1358332 0 0 0 18 1006 172 0 0 100 0 0 0 0 302184 147016 173112 1358332 0 0 0 16 1004 179 0 0 100 0 0 0 0 302184 147140 173116 1358328 0 0 0 18 1006 171 0 0 100 0 0
期待する結果にならなかったw
ま、いいか。