Ограничение памяти процесса jvm в Ubuntu - PullRequest
11 голосов
/ 05 февраля 2012

Я знаю, что есть такие же вопросы, как , этот был задан и получен ответ.Я не удовлетворен ответами, поэтому позвольте мне добавить здесь более подробные сообщения.

Я пытаюсь запустить свое приложение с опциями JVM: -Xmx128m -Xms32m -XX:MaxPermSize=64m.Когда приложение запустилось, и я проверил использование памяти, набрав cat /proc/10413/status, я обнаружил, что размер vmsize превышает 600512 кБ!что намного больше, чем мои настройки.Я хотел бы знать, как ограничить использование памяти JVM процесса.

Name:   java
State:  S (sleeping)
Tgid:   10413
Pid:    10413
PPid:   1
TracerPid:      0
Uid:    1001    1001    1001    1001
Gid:    1007    1007    1007    1007
FDSize: 128
Groups: 1001 1007
**VmPeak:   728472 kB**
**VmSize:   600512 kB**
VmLck:         0 kB
VmHWM:    298300 kB
VmRSS:    280912 kB
VmData:   647804 kB
VmStk:       140 kB
VmExe:        36 kB
VmLib:     13404 kB
VmPTE:       808 kB
VmSwap:        0 kB
Threads:        33
SigQ:   0/31522
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000000000
SigCgt: 2000000181005ccf
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: ffffffffffffffff
Cpus_allowed:   f
Cpus_allowed_list:      0-3
Mems_allowed:   00000000,00000001
Mems_allowed_list:      0
voluntary_ctxt_switches:        3
nonvoluntary_ctxt_switches:     2

Ответы [ 2 ]

10 голосов
/ 05 февраля 2012

Вы не можете контролировать то, что хотите контролировать , -Xmx контролирует только Java Heap, оно не контролирует потребление собственной памяти JVM, которая является потребляется совершенно по-разному в зависимости от реализации.

Из следующей статьи Спасибо за память (Понимание того, как JVM использует собственную память в Windows и Linux)

Для обслуживания кучи и сборщика мусора используется собственная память, которой вы не можете управлять.

Для сохранения состояния система управления памятью, поддерживающая кучу Java. Структуры данных должны быть выделены для отслеживания свободного хранения и записи прогресса, когда собирать мусор. Точный размер и характер этих структур данных зависит от реализации, но многие из них пропорциональны размеру куча.

и JIT-компилятор использует собственную память так же, как javac

Компиляция байт-кода использует собственную память (так же, как статическая компилятору, такому как gcc, требуется память для запуска), но оба ввода ( байт-код) и вывод (исполняемый код) из JIT также должны храниться в родной памяти. Java-приложения, которые содержат много JIT-скомпилированные методы используют больше собственной памяти, чем меньшие приложения.

и затем у вас есть загрузчик классов, которые используют собственную память

Java-приложения состоят из классов, которые определяют структуру объекта и метод логики. Они также используют классы из класса времени выполнения Java библиотеки (такие как java.lang.String) и могут использовать сторонние библиотеки. Эти классы должны храниться в памяти до тех пор, пока они используются. Как хранятся классы, зависит от реализации.

Я даже не стану цитировать раздел «Потоки», думаю, вы поняли, что -Xmx не контролирует то, что вы думаете, он контролирует, он контролирует кучу JVM, не все идет в кучу JVM, и куча занимает гораздо больше родной памяти, чем указано для управление и бухгалтерский учет.

1 голос
/ 02 августа 2012

Как и любой другой процесс в Linux, вы можете ограничить использование памяти процессом JVM (скажем, до 4 ГБ):

$ ulimit -v 4194304
$ java ...   # execute your Java program

(Технически это фактически виртуальная память, которая является верхней границей для фактического использования памяти. Но ulimit, очевидно, не работает с фактическим использованием оперативной памяти. )

Это приведет к сбою выделения памяти выше предела, что, вероятно, приведет к OutOfMemoryError и выходу вашего приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...