Небольшая разница в использовании памяти без кучи при запуске Java-программы

У меня есть простой код для многопоточного эхо-сервера в Java (он возвращает все, что получено обратно клиентам). Я профилирую различные ресурсы, включая использование памяти без кучи. Я понимаю, что незаполненная память JVM также создается при запуске JVM, однако хранит структуры для каждого класса и включает в себя стеки вызовов, память, выделенную собственным кодом, например, для кэширования вне кучи, Metaspace, а также память используется компилятором JIT (скомпилированный нативный код). Но у меня есть два основных вопроса:

1) Использование памяти без кучи немного увеличивается с течением времени. Увеличение незначительно, но что вызывает это небольшое увеличение использования памяти?

2) Несмотря на то, что использование памяти без кучи почти идентично, так как количество взаимодействующих клиентов увеличивается, если мы увеличиваем масштаб, аналогичным образом мы наблюдаем небольшое увеличение по мере увеличения количества клиентов. Какова главная причина этого? Я предполагал, что это может быть связано с тем, что для новых потоков требуется больше места, но что эти потоки делают, чтобы вызвать это небольшое увеличение?

3) Мы замечаем ту же разницу, что и в 2 выше, для памяти Heap. Однако разница гораздо больше. Каковы причины этого? Мое предположение было увеличен размер буфера, необходимый для хранения сообщений.

1 ответ

Вы сказали, что ваш сервер многопоточный - я предполагаю, что вы создаете новый поток для каждого принятого сокетного соединения.

В JVM каждый поток потребляет некоторую память под названием "стек", где хранятся все активные кадры выполнения. Размер стека по умолчанию для 64-разрядных JVM составляет 1024 КБ. Я думаю, что на этом графике памяти без кучи вы можете увидеть стеки, выделенные для потоков сокетов

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