Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Стоит ли опасаться утечки памяти?

JonBoss

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Jon
Мне сейчас приходится работать с большими объемами данных, и все я не могу хранить в оперативной памяти. Поэтому я подгружаю нужную информацию при необходимости (При заходе каждого игрока). Я читал, чтобы оперативная память освобождалась, нужно убирать все указатели на ненужные объекты. У меня есть вопросы:
1. Когда проходит очистка? На рандом или когда сервер займет всю выделенную ему память?
2. Можно как-то вручную удалять?
3. Дает ли сбой эта система? Если да, то как часто? Как избежать?
 
Отвечу на 1 и 2 вопрос.
Если нужно немедленно освободить память, которую занимает объект нужно всем ссылкам, указывающим на этот объект, присвоить значение null, а затем вызвать System.gc();

Например,
Код:
Integer v1 =newInteger(10);
Integer v2 = v1;
...
v1 =null;
v2 =null;
System.gc();



Метод gc() удаляет из памяти только объекты классов (на которые нет ни одной ссылки в программе). Вообще вызывать явно его не обязательно, т.к. виртуальная машина периодически вызывает его сама.

P.S. Таким образом можно удалять только объекты. Переменные встроенных типов (int, float, char и т.д.) этот метод не удаляет (да и null им присвоить нельзя).
 
Отвечу на 1 и 2 вопрос.
Если нужно немедленно освободить память, которую занимает объект нужно всем ссылкам, указывающим на этот объект, присвоить значение null, а затем вызвать System.gc();

Например,
Код:
Integer v1 =newInteger(10);
Integer v2 = v1;
...
v1 =null;
v2 =null;
System.gc();



Метод gc() удаляет из памяти только объекты классов (на которые нет ни одной ссылки в программе). Вообще вызывать явно его не обязательно, т.к. виртуальная машина периодически вызывает его сама.

P.S. Таким образом можно удалять только объекты. Переменные встроенных типов (int, float, char и т.д.) этот метод не удаляет (да и null им присвоить нельзя).
Ну если просто нужно убрать все ссылки, тогда хорошо. Спасибо :)
Еще быть бы уверенным, что сам сервер уберет свои ссылки
 
Ага, вы еще запустите поток, который бы каждый 10 секунд вызывал сборщик мусора.
Сами разрабы джавы не рекомендуют вообще самому его вызывать.
 
Ну если просто нужно убрать все ссылки, тогда хорошо. Спасибо :)
Еще быть бы уверенным, что сам сервер уберет свои ссылки
Немного про System.gc();
Если уберете все ссылки на объект, можете быть спокойны - уборщик мусора не пропустит этот объект.
Тут не надо беспокоиться как в С++, что вы не убрали какой-то динамически созданный объект из памяти
 
Немного про System.gc();
Если уберете все ссылки на объект, можете быть спокойны - уборщик мусора не пропустит этот объект.
Тут не надо беспокоиться как в С++, что вы не убрали какой-то динамически созданный объект из памяти
Как раз таки в c++ мне было спокойнее. Все было под моим контролем :)
Ага, вы еще запустите поток, который бы каждый 10 секунд вызывал сборщик мусора.
Сами разрабы джавы не рекомендуют вообще самому его вызывать.
Я не буду его юзать. Доверюсь мусорщику
 
Отвечу на 1 и 2 вопрос.
Если нужно немедленно освободить память, которую занимает объект нужно всем ссылкам, указывающим на этот объект, присвоить значение null, а затем вызвать System.gc();

Например,
Код:
Integer v1 =newInteger(10);
Integer v2 = v1;
...
v1 =null;
v2 =null;
System.gc();



Метод gc() удаляет из памяти только объекты классов (на которые нет ни одной ссылки в программе). Вообще вызывать явно его не обязательно, т.к. виртуальная машина периодически вызывает его сама.

P.S. Таким образом можно удалять только объекты. Переменные встроенных типов (int, float, char и т.д.) этот метод не удаляет (да и null им присвоить нельзя).
Как писал Agravaine, использовать System.gc() не рекомендуется. Алсо, использовать gc() в основном потоке сервера вообще анально карается.
Для того, чтобы было "спокойнее", лучше использовать (де /)сериализацию данных, если у каждого игрока одни и те же виды данных.
И после выполнения метода все созданные в нём переменные теряют ссылки, после чего вычищаются gc.
 
Вот тут можно почитать немного про то, как работает GC в Java. Правда в Java 8 что-то поменяли в реализации, я деталей не знаю, но с точки зрения языка ничего не поменялось.
P.S. Ещё тут прикольные картинки.
У джавы разных GC вагон и маленькая тележка, и они отличаются методом работы, впрочем они все обеспечивают сборку любых объектов не видимых из активной области видимости. Включая зацикленные списки.
 

Поделиться этой страницей

Назад
Верх