2008年2月15日金曜日

(FreeBSD) Error occurred during initialization of VM / Could not reserve enough space for object heap / Could not create the Java virtual machine.

最近気がついたんですが、FreeBSDで、portsのeclipseをmakeすると、こんなエラーがでました。



===>  Configuring for eclipse-3.2.2
===>  Building for eclipse-3.2.2
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
*** Error code 1



どこでエラーが出てるのか調べていったら、どうやら、このコマンドでエラーになるのでした。



% java -Xmx1000M
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.



1000Mbyteだとダメで、だんだんと減らしていったところ、



% java -Xmx720M
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)



720Mbyteくらいならイケました。



使ってるJavaは、diablo-jdk1.5.0です。



以前、2Gbyteくらいが限界という話は聞いたことがあったのですが、たったの720Mbyteでめいっぱいってどういうことなの?!



どこでエラーになっているのかktraceしてみたら、mmapでした。



73922 java     CALL  clock_gettime(0,0xbfbfd5f0)
73922 java     RET   clock_gettime 0
73922 java     CALL  mmap(0,0x32e00000,0,0x1042,0xffffffff,0,0,0)
73922 java     RET   mmap -1 errno 12 Cannot allocate memory
73922 java     CALL  write(0x1,0xbfbfced0,0x2b)
73922 java     GIO   fd 1 wrote 43 bytes



ん~?2GBくらい、できそうなのに、720Mが限界???


ところが、別のFreeBSDマシンで試すと、「java -Xmx1800m」くらいまで、平気でした。



できる・できないの違いの原因はどこなのか?どうも、maxdsizじゃないか?という気がしています。



720Mbyteで精一杯だったマシンのloader.confでは、



% cat /boot/loader.conf
geom_mirror_load="YES"
cpufreq_load="YES"
#
kern.maxdsiz="2G"
kern.maxssiz="128M"



と指定しています。



% limit
cputime      unlimited
filesize     unlimited
datasize     2097152 kbytes
stacksize    131072 kbytes
coredumpsize 0 kbytes
memoryuse    unlimited
vmemoryuse   unlimited
descriptors  11095
memorylocked unlimited
maxproc      5547
sbsize       unlimited



limit datasizeで変更しても、限界720Mbyteはかわりませんでした。



もしかして、プロセスが占有できるアドレス空間に2Gバイト分が常に確保され、カーネルが1Gbyteくらい、残りのアドレス空間1Gバイト程度の中で、mmapした領域が割り振られるんでしょうか??? だとしたら納得です。


maxdsiz="2G"なホストで実行した場合。



80571 java     CALL  mmap(0x8885f000,0x1000,0x3,0x12,0x4,0,0x1d000,0)
80571 java     RET   mmap -2004488192/0x8885f000
80571 java     CALL  mmap(0,0x1170,0x3,0x1000,0xffffffff,0,0,0)
80571 java     RET   mmap -2004484096/0x88860000
80571 java     CALL  mmap(0,0x8000,0x5,0x20002,0x4,0,0,0)
80571 java     RET   mmap -2004484096/0x88860000
80571 java     CALL  mmap(0x88867000,0x1000,0x3,0x12,0x4,0,0x6000,0)
80571 java     RET   mmap -2004455424/0x88867000
80571 java     CALL  mmap(0,0x460,0x3,0x1000,0xffffffff,0,0,0)
80571 java     RET   mmap -2004451328/0x88868000
80571 java     CALL  mmap(0,0x2607ec5,0x1,0x1,0x4,0,0,0)
80571 java     RET   mmap -2004451328/0x88868000
80571 java     CALL  mmap(0,0x84760,0x1,0x1,0x4,0,0,0)
80571 java     RET   mmap -1964572672/0x8ae70000
80571 java     CALL  mmap(0,0x1401a,0x1,0x1,0x4,0,0,0)
80571 java     RET   mmap -1964027904/0x8aef5000
80571 java     CALL  mmap(0,0x86cc06,0x1,0x1,0x4,0,0,0)
80571 java     RET   mmap -1963941888/0x8af0a000
80571 java     CALL  mmap(0,0x2000000,0,0x1042,0xffffffff,0,0,0)
80571 java     RET   mmap -1955106816/0x8b777000
80571 java     CALL  mmap(0x8b777000,0x28000,0x7,0x1012,0xffffffff,0,0,0)
80571 java     RET   mmap -1955106816/0x8b777000
80571 java     CALL  mmap(0,0x80000,0,0x1042,0xffffffff,0,0,0)
80571 java     RET   mmap -1921552384/0x8d777000
80571 java     CALL  mmap(0x8d777000,0x1000,0x7,0x1012,0xffffffff,0,0,0)
80571 java     RET   mmap -1921552384/0x8d777000
80571 java     CALL  mmap(0,0x44000000,0,0x1042,0xffffffff,0,0,0)
80571 java     RET   mmap -1 errno 12 Cannot allocate memory



maxdsizの指定なしのホストで実行した場合。



85344 java     CALL  mmap(0,0x1170,0x3,0x1000,0xffffffff,0,0,0)
85344 java     RET   mmap 679845888/0x2885a000
85344 java     CALL  mmap(0,0x8000,0x5,0x20002,0x4,0,0,0)
85344 java     RET   mmap 679845888/0x2885a000
85344 java     CALL  mmap(0x28861000,0x1000,0x3,0x12,0x4,0,0x6000,0)
85344 java     RET   mmap 679874560/0x28861000
85344 java     CALL  mmap(0,0x9000,0x3,0x1002,0xffffffff,0,0,0)
85344 java     RET   mmap 679878656/0x28862000
85344 java     CALL  mmap(0,0x460,0x3,0x1000,0xffffffff,0,0,0)
85344 java     RET   mmap 679915520/0x2886b000
85344 java     CALL  mmap(0,0x2607ec5,0x1,0x1,0x4,0,0,0)
85344 java     RET   mmap 679915520/0x2886b000
85344 java     CALL  mmap(0,0x84760,0x1,0x1,0x4,0,0,0)
85344 java     RET   mmap 719794176/0x2ae73000
85344 java     CALL  mmap(0,0x1401a,0x1,0x1,0x4,0,0,0)
85344 java     RET   mmap 720338944/0x2aef8000
85344 java     CALL  mmap(0,0x86cc06,0x1,0x1,0x4,0,0,0)
85344 java     RET   mmap 720424960/0x2af0d000
85344 java     CALL  mmap(0,0x2000000,0,0x1042,0xffffffff,0,0,0)
85344 java     RET   mmap 729260032/0x2b77a000
85344 java     CALL  mmap(0x2b77a000,0x28000,0x7,0x1012,0xffffffff,0,0,0)
85344 java     RET   mmap 729260032/0x2b77a000
85344 java     CALL  mmap(0,0x80000,0,0x1042,0xffffffff,0,0,0)
85344 java     RET   mmap 762814464/0x2d77a000
85344 java     CALL  mmap(0x2d77a000,0x1000,0x7,0x1012,0xffffffff,0,0,0)
85344 java     RET   mmap 762814464/0x2d77a000
85344 java     CALL  mmap(0,0x44000000,0,0x1042,0xffffffff,0,0,0)
85344 java     RET   mmap 763338752/0x2d7fa000


これを見ると、mmapで返されているアドレスみたいな値が、あきらかにズレてます。



0 件のコメント:

コメントを投稿