Это на Centos 5, Linux 2.6.33.3-xenU # 1 SMP среда 5 мая 00:49:22 UTC 2010 i686 i686 i386 GNU / Linux
У меня есть процесс Java-сервера, который я обычно запускаю со следующей конфигурацией
-Xmx700m -Xms500m -XX:PermSize=128m -noclassgc
И он бежит как чемпион. Но со временем, по мере роста объема данных моего приложения, этого будет недостаточно для нормальной работы.
Недавно я добавил больше памяти к своему VPS, и я попытался расширить память:
-Xmx1024m -Xms1024m -XX:PermSize=256m -noclassgc
И что происходит, когда оно загружает приложение, оно съедает всю "нехватку памяти", и мое приложение вылетает (и часто появляется сообщение трассировки стека от ядра, но не паника или ошибка)
И в этот момент я тост - неработающий процесс, кажется, владеет всей нехваткой памяти, и oom-killer начинает убивать все. Мне нужно перезагрузиться, чтобы это исправить.
Но когда я возвращаюсь к 700 мегабайт, он снова работает как чемпион и совсем не использует много «низкой памяти» - (я имею в виду, что выделено около 690 мегабайт низкой памяти, и используется только около 140 мегабайт)
[]$ free -lm
total used free shared buffers cached
Mem: 2700 1334 1365 0 100 274
Low: 689 140 548
High: 2011 1194 816
-/+ buffers/cache: 959 1740
Swap: 714 0 714
Java - 1.6:
java version "1.6.0"
Java(TM) SE Runtime Environment (build 1.6.0-b105)
Java HotSpot(TM) Server VM (build 1.6.0-b105, mixed mode)
Кто-нибудь знает, почему это происходит? Я планирую обновить java, но если есть еще одна известная проблема для этого сценария, я бы хотел ее услышать. Изменение ядра может быть проблематичным, но если есть какие-либо изменения в конфигурации локального сервера, я мог бы использовать верхнюю память вместо низкой.
У меня были подобные проблемы в прошлом, но это было с OpenVZ VPS, а не с Xen. Помимо обновления Java, вы также можете попробовать альтернативные JVM, такие как Oracle JRockit или IBM JDK, которые не обязательно распределяют память таким же образом и могут решить вашу проблему.
низкая память используется ядром - у вас будут следующие уровни
Даже если вы установили для Xmx1024m значение 1024 - это не означает, что jvm не будет занимать больше памяти (1024, если память, доступная для приложения, + сам jvm) - чтобы увидеть фактический объем памяти, используйте ps -elF или top .
еще одна вещь, на которую стоит обратить внимание, - это тот факт, что у xen есть драйвер baloon, который сообщает о большем объеме памяти, чем у вас есть на самом деле - это потому, что хост (не vps) будет пытаться предоставить немного больше памяти vps, чем фактически доступно - но если хост занят, просто не будет памяти, и ваш процесс убит ... уточните у своего провайдера vps.