最近気がついたんですが、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で返されているアドレスみたいな値が、あきらかにズレてます。