Что Java получает, он не возвращается. Выделение памяти требует больших усилий, поэтому Java обычно не возвращает какую-либо память, которую когда-либо предоставляла система. Поэтому, если ваша программа когда-либо использовала 760 МБ ОЗУ, это то, что она придерживается.
И тогда есть две другие факторы, которые играют важную роль. Размер кучи - это только объем памяти, которую ваша программа использует или может использовать. Но между вашей программой и ОС есть Java-VM, которая также может иметь хорошую память. Диспетчер задач показывает объем памяти, который используется вашей программой, плюс vm.
Другим фактором является фрагментация памяти. Некоторые структуры данных (например, массивы) должны быть в последовательном блоке памяти. массив [i + 1] должен находиться в слоте памяти после массива [i]. Это означает, что если у вас есть, например, 10 МБ, а средняя память 2 МБ используется, и вы хотите создать массив размером 6 МБ, на котором Java-VM должна выделить новую память, поэтому она может соответствовать массиву в один кусок. Это увеличивает использование памяти в диспетчере задач вверх, но не размер кучи, так как размер кучи показывает только фактическую используемую память.
если утечка памяти происходит набор -XX: PermSize = 256m -XX : MaxPermSize = 256m как аргументы VM – lakshman
@Vach Это не похоже на утечку памяти ... – assylias
@lakshman это вообще не устраняет утечку памяти PermGenSize, это просто задерживает актуальную проблему. Лучшим предложением было бы предложить структуру, которая фактически может разгружать классы, если они больше не нужны/не используются.Это, однако, требует разумной классовой загрузки и, кроме того, довольно строгой обработки (особенно одиночных и перечислений) –