Что содержится в коде / внутренних разделах JCMD?

Измерение Docker-контейнера для службы на основе JVM довольно сложно (как мы все знаем). Я почти уверен, что у нас немного занижен размер контейнера, и я хочу прояснить несколько вопросов, касающихся конкретных выводов jcmd (Native Memory Tracker), которые мы видим при мониторинге.

Вопросы:

  • Включены ли прямые байтовые буферы во "Internal", как сообщает jcmd?
  • Что еще, кроме кеша кода, находится в "Коде", как сообщает jcmd?
  • Есть ли хороший способ ограничить раздел "Код", как сообщает jcmd. Я прочитал https://docs.oracle.com/javase/8/embedded/develop-apps-platforms/codecache.htm но это охватывает только пределы кэша кода, и рекомендуется оставить JVM по умолчанию как есть.

Вывод JCMD здесь.

Прямой байтовый буфер JMX свойства здесь.

Некоторые детали фона:

Настройка:

  • Приложение на основе весенней загрузки
  • Параметры JVM:

    -server -Xms1792m -Xmx1792m -XX: MetaspaceSize = 128M - XX: MaxMetaspaceSize = 192M -XX: + UseG1GC -XX: + UseStringDeduplication - XX: MaxDirectMemorySize = 256m -XX: NativeMemoryTracking = detail

  • Контейнер Docker 2500MiB работает в AWS/EC2

1 ответ

Решение

Включены ли прямые байтовые буферы во "Internal", как сообщает jcmd?

(обновлено) ByteBuffer.allocateDirect внутренние звонки Unsafe.allocateMemory который подсчитывается NMT во внутреннем разделе (обозначается mtInternal константа).

Напротив, MappedByteBuffers (полученный FileChannel.map) не отражены в отчете NMT, хотя они определенно могут повлиять на объем памяти, используемый процессом с точки зрения ОС.

Что еще, кроме кеша кода, находится в "Коде", как сообщает jcmd?

Вспомогательные структуры ВМ для поддержки скомпилированного кода и сгенерированных заглушек времени выполнения: хеш-таблицы, строки кода, отпечатки адаптера и т. Д. Все они довольно малы по сравнению с самим CodeCache. Эти структуры составляют часть "malloc" в отчете, в то время как CodeCache переходит в часть "mmap".

Есть ли хороший способ ограничить раздел "Код", как сообщает jcmd.

Отключение многоуровневой компиляции (-XX:-TieredCompilation), вероятно, уменьшит объем памяти, используемой "кодом", просто потому, что будет намного меньше сгенерированного кода. Но убедитесь, что вы понимаете, что такое многоуровневая компиляция и какое влияние она может оказать на производительность.

Другие вопросы по тегам