2016-12-15 6 views
0

Я настроил мой экземпляр Tomcat, чтобы не использовать более 1 Гб оперативной памяти, установив следующее setenv.sh:HTOP отчетности Tomcat 8.5 как потребление 4Гб, когда я установил -Xmx1024M

$ cat /opt/tomcat8.5/bin/setenv.sh 
#!/bin/sh 

export JAVA_OPTS="-Djava.awt.headless=true -server -Xms48m -Xmx1024M -XX:MaxPermSize=512m" 

В самом деле, это, кажется, следует принимать во внимание бегущего Tomcat например:

$ ps aux | grep -i tomcat-juli.jar | grep -v grep | awk '{print $2}' 
26105 
$ sudo jinfo 26105 | grep VM\ flagsNon-default VM flags: -XX:CICompilerCount=3 -XX:InitialHeapSize=50331648 -XX:MaxHeapSize=1073741824 -XX:MaxNewSize=357564416 -XX:MinHeapDeltaBytes=524288 -XX:NewSize=16777216 -XX:OldSize=33554432 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseParallelGC 

И прикрепляться к запущенному экземпляру с помощью Java VisualVM, я вижу картину совместимую с вышесказанным:

enter image description here

Почему тогда htop сообщают, что мой Tomcat потребляет половину моей памяти 8 ГБ?

enter image description here

ответ

3

Ограничение размера кучи (-Xmx1024M) только ограничивает размер кучи Java. JVM может использовать как можно больше «родной» памяти, которая, по ее мнению, необходима, чтобы работать сама.

Вещи, которые не являются частью Java кучи:

  1. PermGen
  2. Thread стеки
  3. Native код, скомпилированный с помощью JIT

взглянуть на Java native memory usage, чтобы увидеть, как вы можете получить представление о том, какая память используется вне кучи Java.

Обратите внимание, что если вы готовы дать вашей JVM целый гиг или RAM, вы можете также установить -Xms == -Xmx, в противном случае вы будете просто тратить циклы CPU повторно проклейки памяти с интервалами до кучи не достигнет своего максимального размера ,