У меня есть приложение JBoss, работающее на платформе Linux, оно выводит данные, как показано ниже (на самом деле это не точные данные):
PID USER PR NI VIRT RES SHR S %CPU %MEM CODE DATA TIME+ COMMAND
1379 root 16 0 9.7g 1.6g 1980 S 0.7 1.3 36 9.7g 0:11.03 java
Он имеет 1,6 ГБ физической памяти в целом и 9,7 ГБ раздела DATA. Фактически размер кучи составляет ~128 МБ в соответствии с настройкой JVM. У меня вопрос: что хранит раздел DATA для приложения Java? Есть ли какие-нибудь подсказки? И как я могу его оптимизировать?
спасибо, Эмре
решение1
DATA
означает память, выделенную приложением с использованием brk(2)
- т.е. расширение сегмента данных.
В Java есть много разных вещей, которые она помещает в сегмент данных:
- Куча
- Любая память, выделенная собственным слоем среды выполнения (код с использованием
native
ключевого слова) - Любая память, выделенная библиотеками DLL/разделяемыми библиотеками, которые вы загружаете из Java с помощью JNI/JNA
- Память, в которую загружается байт-код, интерпретируется и компилируется JIT (кэш кода)
- Структуры памяти, используемые GC и другим кодом поддержки времени выполнения
- Стек
Обратите внимание, что предоставление программе кучи в 128 МБ выделит больше, чем это, поскольку Java также создаст некоторые структуры для управления кучей, которые не являются ее частью. Таким образом, 128 МБ означает, что у вас будет 128 МБ, в которых вы можете выделить объекты Java.
решение2
Это объем физической памяти, выделенной для кода, отличного от исполняемого, также известный как размер «набора резидентных данных» или DRS. Как правило, вы можете обратиться к странице руководства, которая подробно описывает все столбцы. Чтобы получить страницу руководства, введите man top
.