Что содержится в коде / внутренних разделах 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
), вероятно, уменьшит объем памяти, используемой "кодом", просто потому, что будет намного меньше сгенерированного кода. Но убедитесь, что вы понимаете, что такое многоуровневая компиляция и какое влияние она может оказать на производительность.