Никакой GUI, старая машина? NetBSD был бы моим выбором (хотя установка является болью, если Вы не привыкли к установке всего сами). Вообще-то, если задуматься FreeBSD 9.0 намного легче настроить и поддерживать, будет легче найти. Это не использует слишком много памяти, и Ваша дуга, вероятно, поддерживается.
failcnt
повышается на privvmpages
, таким образом, Ваш контейнер не может выделить больше пространство виртуальной памяти от хоста:
root@server: ~ # cat /proc/user_beancounters
Version: 2.5
uid resource held maxheld barrier limit failcnt
privvmpages 6005601 6291447 6291456 6291456 >233<
physpages 4635460 6291456 6291456 6291456 0
vmguarpages 0 0 6291456 9223372036854775807 0
oomguarpages 1529376 2144671 6291456 9223372036854775807 0
Отметьте ту виртуальную память! = физическая память. Процессы могут выделить до где-нибудь вокруг адресуемого объема виртуальной памяти (32 бита ~ 2G - 4G, 64 бита 8 ТБ - 256 ТБ), но это не означает, что страницы физической памяти используются (страница, являющаяся блоком 4 КБ памяти).
physpages
количество страниц физической памяти, которые может использовать Ваш контейнер.
oomguarpages
гарантируемые страницы памяти, которые получит контейнер, когда хост будет ограниченной памятью.
privvmpages
количество страниц виртуальной памяти, которые может использовать Ваш контейнер
vmguarpages
гарантируемый объем виртуальной памяти таким же образом
Java Oracle будет всегда выделять один непрерывный блок виртуальной памяти. Выполнение java
без аргументов на поле приводит к 5M используемой реальной памяти (RSS
), но 660M выделенного места VM (VSZ
):
PID COMMAND VSZ RSS
20816 java 667496 4912
Рассмотрение сегментов памяти для java
процесс в он smaps
файл показывает блок выделенных приблизительно 500 МБ, остальное - файлы с отображенной памятью и нормальный материал Java.
В системе это произошло некоторое время, доступное пространство VM становится фрагментированным, поскольку процессы используют/освобождают части его. A grep Vmalloc /proc/meminfo
даст Вам VmallocChunk
который является самым большим свободным в настоящее время доступным блоком. Если это будет низко, то система попытается выделить больше когда java
запросы это, в конце концов, это фактически неограниченно на поле на 64 бита.
Скажите Вашему хосту настраивать privvmpages
и vmguarpages
намного выше. Нет никакой потребности в них совпасть с физической памятью, поскольку это влияет на способ, которым работает память Linux
Вы смогли работать вокруг проблемы временно путем отбрасывания кэша файла echo 1 > /proc/sys/vm/drop_caches
но это является только временным.
Можно ограничить блок памяти java
попытки выделить во время выполнения с минимумом Xms
или при выполнении с максимумом Xmx
. Выполнение java
с этими опциями на моей машине:
java -Xms10M -Xmx10M
уменьшает общий виртуальный размер приблизительно до 140 МБ только с 10 МБ непрерывный блок для выделенной "кучи" Java.
Вероятно, необходимо изменить размер "кучи" Java по умолчанию, испытать эти аргументы:
-Xms<size> set initial Java heap size
-Xmx<size> set maximum Java heap size
-Xss<size> set java thread stack size
например:
java -Xms64m -Xmx1512m
Этот поток мог быть полезным
Также проверьте ulimit (ulimit, обеспечивает управление ресурсами, доступными оболочке и процессам, запущенным им):
ulimit -a
ulimit -a
кажется нормальным. Большинство значений включая virtual memory
неограниченны. Те, которые казались немного низким, я удвоился (-s
от 8 192 до 16 384 и -l
от 64 до 128) для тестирования, но это не помогло также.
– BrainStone
18.01.2014, 01:14
-A
опция для меня. И мне не разрешают добавить Подкачку.
– BrainStone
19.01.2014, 18:40
Вы могли бы просто быть вне виртуальной памяти.
Вы фокусируетесь на Использовании оперативной памяти (или отсутствие), но Ваши существующие JVMs резервируют виртуальную память, не RAM. Пока к зарезервированным страницам памяти не получают доступ, нет никакого Использования оперативной памяти, о котором сообщают для них.
В то время как Linux обычно маскирует этот выпуск своими настройками чрезмерных обязательств, довольно возможно, что факт, который Вы выполняете на уровне ОС, виртуализировал, среда или уменьшает/запрещает по обязательству или установила ограничение управления ресурсами виртуальной памяти.
На регулярном экземпляре ОС (не контейнер), самый легкий путь к обходному решению это должно добавить некоторую подкачку, которая позволит зарезервированной памяти не тратить впустую RAM. На контейнере способ преодолеть проблему мог бы также потребовать увеличения глобально доступной виртуальной памяти, но в более общем плане просто сделан путем предоставления большей виртуальной памяти контейнеру.
В нашем случае это помогло ограничить размер кучи, которую виртуальная машина пытается зарезервировать при запуске.
Например, в командной строке:
export _JAVA_OPTIONS = '- Xms64M -Xmx128m'
или для Tomcat в [TOMCAT_HOME] /bin/setenv.sh
#! / Bin / sh
JAVA_OPTS = "- Xms64M -Xmx256M"
(Обратите внимание на дополнительное подчеркивание в начале командной строки.)
Объяснение нашего провайдера:
grep Vmalloc /proc/meminfo
не дает вывода), Выполнениеjava -Xms10M -Xmx10M
работы все же. Но это действительно не решает все проблемы. Как запуск дополнительных программ с Использованием оперативной памяти чего-то приблизительно 2 ГБ... – BrainStone 19.01.2014, 18:46