Я обнаружил, что если у моего приложения много свободной памяти, оно использует больше памяти, чем нужно. Я слышал, что такое поведение является общим для всех приложений Java, но для меня оно неприемлемо.
Это зависит от того, что вы имеете в виду «больше памяти, чем нужно». Если вы имеете в виду, больше, чем минимальный объем памяти для представления объектов вашего приложения, то вы правы.
Это стандартное поведение, когда Java использует больше памяти, чем тот минимум, который теоретически может сойти с рук. «Что еще хуже», большинство JVM не возвращают память операционной системе ... даже если эта память была освобождена GC. Оба эти свойства необходимы для эффективной работы сборщика мусора общего назначения.
Если это неприемлемо для вас, вы не должны использовать язык для сбора мусора. Используйте C или C ++. (Но также имейте в виду, что для распределителей памяти C / C ++ необычно иметь возможность возвращать память операционной системе либо ... даже если реализация позволяет это.)
Положительной стороной этого является то, что Java (и фактически любой язык GC) на самом деле будет работать лучше, если вы выделите ему много памяти. Современные GC работают более эффективно, так как соотношение мусора и не мусора увеличивается, и большая куча делает это возможным. (Конечно, вы можете зайти слишком далеко, особенно если приложение конкурирует с другими вещами за реальную память.)
Как уже говорилось в других ответах, вызов System.gc()
не помогает. Это вряд ли приведет к возвращению какой-либо памяти. Хуже того, вы, скорее всего, будете запускать GC, когда уровень мусора слишком низок для эффективной работы, поэтому вы будете увеличивать время ЦП без какой-либо выгоды.
Относительно вашего "PS":
Я не думаю, что есть способ (надежно) обнаружить наличие утечки памяти ... кроме мониторинга тенденций использования памяти.
Я не думаю, что есть способ (надежно) предсказать, когда у вас появится новое оборудование ... кроме трендов мониторинга использования памяти (и других).
Я не думаю, что есть способ заставить использование памяти вашего приложения быть пропорциональным количеству пользователей ... кроме разработки / кодирования вашего приложения так, чтобы оно масштабировалось так, как вы хотите.
С другой стороны, вы можете сказать то же самое о приложении C / C ++.