У меня есть VPS (Linux Server), где я загрузил 64-разрядную версию Java. На моем терминале я могу запускать такие команды, как:
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java -version
И получите следующий результат:
openjdk version "1.8.0_65"
OpenJDK Runtime Environment (build 1.8.0_65-b17)
OpenJDK 64-Bit Server VM (build 25.65-b01, mixed
Поэтому, чтобы проверить это для моего веб-сайта, я использовал следующий php:
<?php
$output = array();
exec('/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java -version', $output);
foreach($output as $line) {
echo $line;
echo '<br/>';
}
?>
Но получите следующую ошибку:
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 bytes
До сих пор я пробовал следующее:
1) Я обновил разрешения на java, чтобы:
stat -c "%a %n" /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java
Возвращает:
755 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.65-0.b17.el6_7.x86_64/jre/bin/java
2) Я отключил безопасный режим php
3) Я изменил максимальную память в файле php.ini до 1,5 ГБ
Что вызывает эту ошибку и как я могу запустить java-программу без ошибок?
Я запускал тяжелую программу java, хотя метод PHP: shell_exec и java вызвали ошибку:
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 byte
Версия для Linux:
uname -a
Linux box1.bluehost.com 1.2.50-39.ELK6.x86_64 #1 SMP Mon Nov 2 03:10:26 CST 2015 x86_64 x86_64 x86_64 GNU/Linux
Версия PHP:
php --version
PHP 5.4.43 (cgi-fcgi) (built: Jul 13 2015 15:00:01)
Zend Engine v2.4.0, Copyright (c) 1998-2014 Zend Technologies
with Zend Guard Loader v3.3, Copyright (c) 1998-2013, by Zend Technologies
Версия Java:
java -version
java version "1.8.0_71"
Создайте сценарий test.php в public_html, например:
<?php
shell_exec('java HungryJavaProgram > /home/user/mylog.log');
?>
Java-программа под названием HungryJavaProgram выделяет гигабайт памяти.
В браузере зайдите на сайт yoursite.com/test.php
чтобы запустить этот файл php. В программе java:
Error occurred during initialization of VM
Could not allocate metaspace: 1073741824 byte
Программа java запросила больше памяти, чем разрешала PHP.
Узнайте, сколько памяти PHP разрешено программам, запущенным внутри shell_exec, может потреблять, создав этот PHP-скрипт и посетив его в браузере:
<?php
phpinfo();
?>
Посмотрите: memory_limit
чтобы увидеть значение по умолчанию: 128M
Найдите свой php.ini в public_html и найдите переменную memory_limit
и установите значение 2048M. В bluehost изменения вступают в силу немедленно. Поймите теперь, что одна программа-изгои может теперь сбить ваш сервер. Поэтому держите это как можно ниже.
В каталоге public_html просмотрите файл .htaccess
, я увидел следующее:
AddHandler application/x-httpd-php54 .php
Прокомментируйте это и замените его на это:
AddHandler fcgid54-script .php
И теперь программа java работает без ошибок. Несмотря на то, что ограничение памяти остается на уровне 128 М, PHP, похоже, не shell_exec("java myprogram")
этот предел для java-программ, запущенных из shell_exec("java myprogram")
.
Ваш ответ находится в сообщении об ошибке:
Could not allocate metaspace: 1073741824 bytes
Вы превысили объем памяти, который вы используете Apache и PHP. В php.ini установлены ограничения, и пользователь Apache может иметь набор ulimit
.
Фондовая установка PHP для установки по умолчанию обычно устанавливается в пределах 2 МБ. Java ищет 1G памяти. Измените ограничение памяти в PHP на минимум 1G.