вторник, 12 декабря 2017 г.

JAVA memory usage. Часть 3


При использовании java-приложений в контейнерах, которым необходимо ограничивать ресурсы, возникает необходимость в точном определении количества используемой памяти  Java-машиной
В первых двух частях (Часть 2 Часть 1) разбирались принципы выделения памяти. В третьей, закючительной, будут рассмотрены способы получения размеров отдельных областей памяти с помощью mbean и NMT

Подготовительные работы

  1. Включаем NativeMemoryTracking, добавляя соответствующие ключи
    https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr007.html
    -XX:NativeMemoryTracking=summary
    или
    -XX:NativeMemoryTracking=detail
  2. Снимаем статстику
    /opt/oracle/java/latest/bin/jcmd 29 VM.native_memory summary
    примерный вывод.
    Total: reserved=20272361KB, committed=19037005KB
    -                 Java Heap (reserved=17825792KB, committed=17825792KB)
                                (mmap: reserved=17825792KB, committed=17825792KB)
    -                     Class (reserved=1097201KB, committed=54769KB)
                                (classes #9178)
                                (malloc=1521KB #19960)
                                (mmap: reserved=1095680KB, committed=53248KB)
    -                    Thread (reserved=129906KB, committed=129906KB)
                                (thread #359)
                                (stack: reserved=127640KB, committed=127640KB)
                                (malloc=1175KB #1820)
                                (arena=1091KB #716)
    -                      Code (reserved=261351KB, committed=68431KB)
                                (malloc=11751KB #12492)
                                (mmap: reserved=249600KB, committed=56680KB)
    -                        GC (reserved=134795KB, committed=134795KB)
                                (malloc=68983KB #503)
                                (mmap: reserved=65812KB, committed=65812KB)
    -                  Compiler (reserved=804KB, committed=804KB)
                                (malloc=673KB #1296)
                                (arena=131KB #3)
    -                  Internal (reserved=522778KB, committed=522774KB)
                                (malloc=522742KB #41658)
                                (mmap: reserved=36KB, committed=32KB)
    -                    Symbol (reserved=11660KB, committed=11660KB)
                                (malloc=10182KB #92944)
                                (arena=1479KB #1)
    -    Native Memory Tracking (reserved=2973KB, committed=2973KB)
                                (malloc=237KB #3598)
                                (tracking overhead=2736KB)
    -               Arena Chunk (reserved=546KB, committed=546KB)
                                (malloc=546KB)
    -                   Unknown (reserved=284556KB, committed=284556KB)
                                (mmap: reserved=284556KB, committed=284556KB)
    Что означают эти области памяти можно почитать в предыдущих частях.

Получение результатов.

В таблице перечислены основные потребители памяти. Для большинства из них существуют MBean, с помошью которых можно получить искомое значение и включать NMT не бязательно.




область памятиMBean



Java Heap
java.lang Memory HeapMemoryUsage.max


Thread
java.lang Threading PeakThreadCount



Code

java.lang MemoryPool Code Cache Usage.max (reserved)
java.lang MemoryPool Code Cache Usage.commited (commited)





java.lang Memory NonHeapMemory Usage.committed (committed)



Class
java.lang MemoryPool Metaspace Usage.max (reserved)
java.lang MemoryPool Metaspace Usage.commited (commited)





CompressedClassSpace
java.lang MemoryPool Compressed Class Space Usage.max (reserved)
java.lang MemoryPool Compressed Class Space Usage.committed (commited)


Symbol 




BufferPool
jmx["java.nio:type=BufferPool,name=direct",MemoryUsed]


GC



Unknown







Java Heap

Размер Haep должен быть ограничен ключом -Xmx.
Для оценки верхней границы области памяти heap берётся значение этого этого ключа или соответствующего mbean.

Class

Метаинформация классов и, если HEAP меньше 32Гб, область для хранения соответствия сжатых указателей. Для ограничения занимаемого этой областью памяти размера необходимо:
задать -XX:CompressedClassSpaceSize
задать -XX:MaxMetaspaceSize
-                     Class (reserved=1146767KB, committed=110607KB)
                            (classes #19918)
                            (malloc=1935KB #27656)
                            (mmap: reserved=1144832KB, committed=108672KB)

Для оценки верхней границы области памяти используется максимальное значение за продолжительное время работы JVM, снятое под характерной нагрузкой (committed)

Thread

Размер занимаемой памяти стэками потоков. Размер стэка для потока задаётся ключом -Xss
Текущее значение можно посмотреть в ps -ef | grep Xss --color

Если не задано, default-значение можно посмотреть так:
/opt/oracle/java/latest/bin/java -XX:+PrintFlagsFinal -version | grep ThreadStackSize 
      intx VMThreadStackSize   = 1024       {pd product}

Память под стэки трэдов (Mb) = VMThreadStackSize*Number Of Threads/1024

Для оценки верхней границы потребления памяти необходимо брать значение максимального кол-во трэдов за период работы.

BufferPool

Область памяти, использующаяся JVM при работе c "native IO" (сокеты, файлы и т.д.) Необходимо выбирать на основе значения соответствующего mbean-а java.nio:type=BufferPool,name=direct",MemoryUsed под нагрузкой за продолжительный период времени.

GC, Uncnown

Область памяти, используемая сборщиком мусора. Для получения количества памяти, занимаемой сборщиком мусора необходимо включать NMT или пользоваться приблизительными значениями. Как показано во второй части, область сборщика мусора пропорциональна размеру heap.

Комментариев нет:

Отправить комментарий