Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > Расход памяти под методы объектов |
Автор: soulburner 25.12.2010, 14:57 | ||
Я - новичок в Java, по этому не ругайте, если вопрос глупый. Суть в следующем - мы пишем сервер для онлайн игры, но не суть важно. Допустим, есть класс "Player". В объектах этого класса хранятся всякие характеристики игроков - здоровье, сила, ловкость и т.п:
Соответственно, таких объектов требуется по количеству столько же, сколько игроков. Допустим, у нас 50 тыс. игроков. Памяти такие объекты будут жрать порядочно. По этому, хочется досканально понять расходование памяти джавой. Соответственно, вопрос в следующем - если мне нужно создать какие-то методы, оперирующие с игроком - следует ли мне обязательно делать их статическими? Почему я спрашиваю - я думал, что если я создаю какой-то не-статический метод в классе Player, то при каждом создании объекта этого класса в памяти будет выделяться место под код всех его методов. Т.е. если я хочу метод savePlayer(), то создав 50 тыс. игроков, я получу в памяти 50 тыс. копий кода этого метода. Что явно fail. И по-этому я обязан создавать статический метод типа savePlayer(Player player). Я прав? Просто, дело в том, что я решил это проверить. Посмотрел в профайлер Эклипса... Сейчас у меня одна инстанция Player занимает 112 байт. После этого я добавил не-статический метод в "плеера", запустил снова... и странно - инстанция плеера по-прежнему занимает 112 байт. Я ожидал увидеть увеличение размера инстанции "плеера" на размер кода добавленного метода. Объясните, плиз. |
Автор: bems 25.12.2010, 15:36 |
Все экземпляры разделяют общий код методов. |
Автор: mgarin 25.12.2010, 22:00 |
И плюс к этому, если говорить конкретно о 50 тысячах таких как вы привели экземпляров - они не много съедят памяти ![]() Также, если рассчитывается, что сервер игры будет крутиться на достаточно современной машине (4+ гб оперативки и среднестатистический проц) то я бы советовал вообще не зацикливаться на сохранении памяти (но это не значит что можно забивать на места явной утечки памяти - всему есть разумный предел). Скажем так, в нашей архивной системе, где кол-во объектов (более сложных и крупных) может достигать 1-2 миллионов, сервер при запросах объектов кэширует их и пока что 2гб, выделенных под приложение, как мне известно, всегда хватало даже на таких объемах. Тут важную роль играет и то, что никогда все 2млн объектов не будут висеть в памяти (достаточно старые, автоматически стираются). В вашем случае также вряд ли все 50 тысяч пользователей будут онлайн одновременно P.S. Как кто-то уже говорил - "проблемы стоит решать по мере их появления" ;) Конечно, опять же, это не значит что нужно их себе создавать |