Java Game Server занимает слишком много памяти! - PullRequest
1 голос
/ 05 февраля 2011

У меня работает сервер командной строки на основе Java, на котором размещены рекорды игры, которую я сделал на своем веб-сайте. Работает качественно и быстро. Тем не менее, он занимает около 200 МБ оперативной памяти! Я попробовал все, от ручного обнуления всего до вызова System.gc ()

Я начинаю подозревать, что это может быть связано с входным потоком и объектами выходного потока, которые я использую из соединения Socket. Я заметил, что при первом запуске программы она занимает нормальный объем оперативной памяти. Затем, как только он получает соединение, он переходит на 100 МБ и продолжает увеличиваться для каждого соединения.

РЕДАКТИРОВАТЬ: В одном из моих классов я храню все имена, оценки и метки времени в 3 различных списках ArrayList. Однако тщательное изучение с использованием jhat и jmap показало, что в совокупности они используют только около 5 МБ ОЗУ.

Если это будет слишком расплывчато, чтобы кто-нибудь мог ответить, спросите, и я с удовольствием предоставлю исходный код.

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

У вас может быть утечка, вызванная сохранением ссылок на объекты после истечения срока их полезного использования.

Я предлагаю вам получить профиль и использовать его для расследования.Хорошее и бесплатное начало - это программа VisualVM, которая распространяется на Java 6.

Профилировщик - это отдельная программа, которая либо подключается к JVM, либо размещает JVM для вашей программы и контролирует выполнение вашей программы.Он может отслеживать распределение объектов и выполнение кода либо статистически, либо путем «инструментирования» исполняемого кода.Он покажет вам, если объекты размещены и не освобождены, и может показать, какие они объекты и где они были размещены (среди многих других полезных вещей).

Я использую jProfiler, который является коммерческим (но стоит того,это для профессионала).В прошлый раз, когда я искал, было несколько профилей хорошего качества, доступных бесплатно (по крайней мере, для личного использования).VisualVM имеет базовые, но полезные возможности для профилирования, и я бы начал с этого (в Windows вы можете найти его в каталоге bin JDK; я полагаю, что то же самое верно для Linux и Mac).

0 голосов
/ 05 февраля 2011

Попробуйте использовать что-то вроде jmap, затем jhat, чтобы увидеть, как на самом деле используется ваша память.

Sun (Oracle) JVM никогда не освобождает память обратно в ОС, поэтому неудивительно, что вы наблюдаете монотонный рост использования памяти.

...