У меня есть сервер командной строки на базе Java, на котором размещены рекорды для игры, которую я сделал на своем веб-сайте. Он работает эффективно и быстро. Однако это занимает около 200 МБ ОЗУ! Я пробовал все, от вручную обнулять все, называть System.gc() Java Game Server занимает слишком много памяти!
Я начинаю подозревать, что это может иметь что-то делать с потоком входных и выходных потоков объектов, которые я использую из гнезда подключения. Я заметил, что когда я впервые запускаю программу, она занимает обычное количество оперативной памяти. Затем, когда он получает соединение, он перескакивает до 100 МБ и продолжает получать больше для каждого соединения.
EDIT: В одном из моих классов я держу все имена, оценки и временную метку в трех разных ArrayLists. Однако тщательное обследование с использованием jhat и jmap показало, что в сочетании они используют только около 5 МБ ОЗУ.
Если это слишком расплывчато для любого, чтобы ответить, спросите, и я с радостью отправлю исходный код.
Если вы видите, что он растет с каждым соединением и не падает, когда клиенты отключаются, вы, вероятно, поддерживаете ссылки на закрытые сокеты. – ide
Если JVM - это что-то вроде .NET, то «заставить» сбор мусора не гарантируется на самом деле собирать что-либо, даже если есть неиспользуемые объекты, у которых нет ссылок на них. Кроме того, 200M - это арахис, когда вы можете купить 24 ГБ оперативной памяти за 300 $. Это действительно проблема? –
@ide Это очень много растет с каждым подключением, а затем немного падает, поскольку они отключаются, так как я пытался вручную обнулить каждую ссылку на все объекты до того, как их жизнь закончится. – ra4king