Назад | Перейти на главную страницу

Процесс Java съедает всю «низкую память» на моем Xen VPS

Это на 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, которые не обязательно распределяют память таким же образом и могут решить вашу проблему.

низкая память используется ядром - у вас будут следующие уровни

  • 0-16 МБ - процедуры очень низкого уровня, используемые ядром
  • 16MB - 768MB - куча для ядра
  • 768MB - MAX_MEM - используется для процессов.

Даже если вы установили для Xmx1024m значение 1024 - это не означает, что jvm не будет занимать больше памяти (1024, если память, доступная для приложения, + сам jvm) - чтобы увидеть фактический объем памяти, используйте ps -elF или top .

еще одна вещь, на которую стоит обратить внимание, - это тот факт, что у xen есть драйвер baloon, который сообщает о большем объеме памяти, чем у вас есть на самом деле - это потому, что хост (не vps) будет пытаться предоставить немного больше памяти vps, чем фактически доступно - но если хост занят, просто не будет памяти, и ваш процесс убит ... уточните у своего провайдера vps.