[root@lab ~]# java
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Есть идеи, как это исправить?
[root@lab ~]# uname -a
Linux lab 2.6.18-194.8.1.el5.028stab070.5 #1 SMP Fri Sep 17 19:10:36 MSD 2010 x86_64 x86_64 x86_64 GNU/Linux
Вот некоторые дополнительные детали, которые, вероятно, весьма важны: это OpenVZ VPS.
[root@lab /]# free -m
total used free shared buffers cached
Mem: 384 27 356 0 0 0
-/+ buffers/cache: 27 356
Swap: 0 0 0
Я могу заставить его загрузить jvm, если установлю максимальный объем памяти 100 или меньше, но у меня должно быть более 300 МБ, не так ли?:
[root@thehacklab /]# java -Xms32M -Xmx100M -version
java version "1.6.0_0"
OpenJDK Runtime Environment (IcedTea6 1.6) (rhel-1.13.b16.el5-x86_64)
OpenJDK 64-Bit Server VM (build 14.0-b16, mixed mode)
[root@thehacklab /]# java -Xms32M -Xmx128M -version
Error occurred during initialization of VM
java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Thread.java:614)
at java.lang.ref.Finalizer.<clinit>(Finalizer.java:194)
[root@thehacklab /]# java -Xms32M -Xmx140M -version
Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.
Кроме того, я заметил, что счетчик отказов provvmpages увеличивается каждый раз, когда я запускаю Java, так что, вероятно, это связано с достижением предела:
[root@thehacklab /]# cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
10913: kmemsize 4349290 6173197 2147483646 2147483646 0
lockedpages 0 0 999999 999999 0
privvmpages 7198 98262 98304 98304 35
shmpages 671 1647 98304 98304 0
dummy 0 0 0 0 0
numproc 16 33 999999 999999 0
physpages 4411 43452 0 2147483647 0
vmguarpages 0 0 98304 2147483647 0
oomguarpages 4412 43453 98304 2147483647 0
numtcpsock 5 31 7999992 7999992 0
numflock 5 9 999999 999999 0
numpty 1 2 500000 500000 0
numsiginfo 0 4 999999 999999 0
tcpsndbuf 107352 216752 214748160 396774400 0
tcprcvbuf 81920 13351808 214748160 396774400 0
othersockbuf 6984 44232 214748160 396774400 0
dgramrcvbuf 0 8472 214748160 396774400 0
numothersock 10 27 7999992 7999992 0
dcachesize 0 0 2147483646 2147483646 0
numfile 674 1154 23999976 23999976 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
dummy 0 0 0 0 0
numiptent 14 14 999999 999999 0
решение1
Сама программа java будет потреблять некоторое количество памяти. И что еще важнее, вы забыли посчитать "PermGen". Я не знаю, какой размер perm gen по умолчанию, но он может быть 128M или даже 256M. Общий размер кучи, требуемый JVM, составляет PermGen + размер кучи.
Почему бы вам просто не добавить немного обмена?
Также должен быть параметр, позволяющий Linux перераспределять память... Google может помочь.
решение2
При 132 МБ свободного места на моем VPS максимальный размер кучи, который я могу указать, составляет 22 МБ. Между 22 МБ и 30 МБ различным вещам не хватает памяти (например, pthreads), а после 32 МБ я получаю ошибку «Не удалось зарезервировать достаточно места для кучи объектов». Я также экспериментировал с различными значениями -Xmn, но, похоже, это никак не влияет на результат.
Для этих тестов я использовал пакет Debian sun-java6-jre.
Можете ли вы попробовать запустить с "java -client -Xmx...", и посмотреть, сможете ли вы использовать больший объем памяти? С моей виртуальной машиной java -server вообще не запускается.