2016-05-10 2 views
1

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

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

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

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

enter image description here

ответ

1

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

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

+0

Я вижу. Благодарю. В чем причина увеличения использования памяти, когда один клиент отправляет сообщение с более высокими ставками? Только один поток существует все время на стороне сервера. –

+0

Кстати, эти стеки хранятся в памяти без кучи? Поскольку различия намного меньше, чем 1024 КБ по умолчанию. На самом деле для памяти кучи разница почти такого размера! –

+0

См. Этот вопрос для получения дополнительной информации: http://stackoverflow.com/questions/6785754/jvm-process-vs-jvm-heap-memory-usage –

Смежные вопросы