Я выполнял тестирование нагрузки на сервере tomcat. На сервере имеется физическая память 10G и пространство подкачки 2G. Размер кучи (xms и xmx) был установлен до 3G раньше, и сервер просто работал нормально. Так как я все еще видел много свободной памяти, и производительность не была хорошей, я увеличил размер кучи до 7G и снова проверил нагрузочное тестирование. На этот раз я заметил, что физическая память была съедена очень быстро, и система начала потреблять пространство подкачки. Позже, tomcat потерпел крах после того, как закончил свободное пространство. Я включил -XX:+HeapDumpOnOutOfMemoryError
при запуске tomcat, но я не получил кучу кучи. Когда я проверил /var/log/messages
, я увидел kernel: Out of memory: Kill process 2259 (java) score 634 or sacrifice child
.
Чтобы предоставить дополнительную информацию, вот что я увидел из команды Linux top
, когда размер кучи установлен на 3G и 7G
xms & xmx = 3G (который работал нормально):
-
Перед запуском tomcat:
Mem: 10129972k total, 1135388k used, 8994584k free, 19832k buffers Swap: 2097144k total, 0k used, 2097144k free, 56008k cached
-
После запуска tomcat:
Mem: 10129972k total, 3468208k used, 6661764k free, 21528k buffers Swap: 2097144k total, 0k used, 2097144k free, 143428k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2257 tomcat 20 0 5991m 1.9g 19m S 352.9 19.2 3:09.64 java
-
После запуска нагрузки в течение 10 минут:
Mem: 10129972k total, 6354756k used, 3775216k free, 21960k buffers Swap: 2097144k total, 0k used, 2097144k free, 144016k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2257 tomcat 20 0 6549m 3.3g 10m S 332.1 34.6 16:46.87 java
xms & xmx = 7G (что вызвало крах tomcat):
-
Перед запуском tomcat:
Mem: 10129972k total, 1270348k used, 8859624k free, 98504k buffers Swap: 2097144k total, 0k used, 2097144k free, 74656k cached
-
После запуска tomcat:
Mem: 10129972k total, 6415932k used, 3714040k free, 98816k buffers Swap: 2097144k total, 0k used, 2097144k free, 144008k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2310 tomcat 20 0 9.9g 3.5g 10m S 0.3 36.1 3:01.66 java
-
После запуска нагрузки в течение 10 минут (прямо перед тем, как был убит tomcat):
Mem: 10129972k total, 9960256k used, 169716k free, 164k buffers Swap: 2097144k total, 2095056k used, 2088k free, 3284k cached PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 2310 tomcat 20 0 10.4g 5.3g 776 S 9.8 54.6 14:42.56 java
Версия Java и JVM:
Java(TM) SE Runtime Environment (build 1.7.0_21-b11)
Java HotSpot(TM) 64-Bit Server VM (build 23.21-b01, mixed mode)
Версия Tomcat:
6.0.36
Сервер Linux:
Red Hat Enterprise Linux Server release 6.4 (Santiago)
Итак, мои вопросы:
- Почему эта проблема произойдет? Когда JVM исчерпывает память, почему нет OutOfMemoryError? И почему это прямо идет на использование свопа?
- Почему
top
RES
показывает, что java использует память 5.3G, там больше потребляемой памяти?
Я изучал и искал какое-то время, но не могу найти основную причину этой проблемы. Большое спасибо!