Задать вопрос
soulburner
@soulburner

Расход памяти под методы объектов?

Я — новичок в Java, по этому сорри, если вопрос глупый.


Суть в следующем — мы пишем сервер для онлайн игры, но не суть важно.


Допустим, есть класс «Player». В объектах этого класса хранятся всякие характеристики игроков — здоровье, сила, ловкость и т.п:

<br/>
public class Player extends Object {<br/>
 public int hp = 0;<br/>
 public int str = 0;<br/>
 public int dex = 0;<br/>
 public int agil = 0;<br/>
 // ... и т.п.<br/>
}<br/>


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


Допустим, у нас 50 тыс. игроков. Памяти такие объекты будут жрать порядочно. По этому, хочется досканально понять расходование памяти джавой.


Соответственно, вопрос в следующем — если мне нужно создать какие-то методы, оперирующие с игроком — следует ли мне обязательно делать их статическими?


Почему я спрашиваю — я думал, что если я создаю какой-то не-статический метод в классе Player, то при каждом создании объекта этого класса в памяти будет выделяться место под код всех его методов. Т.е. если я хочу метод savePlayer(), то создав 50 тыс. игроков, я получу в памяти 50 тыс. копий кода этого метода. Что явно fail. И по-этому я обязан создавать статический метод типа savePlayer(Player player).


Я прав?


Просто, дело в том, что я решил это проверить. Посмотрел в профайлер Эклипса… Сейчас у меня одна инстанция Player занимает 112 байт. После этого я добавил не-статический метод в «плеера», запустил снова… и странно — инстанция плеера по-прежнему занимает 112 байт. Я ожидал увидеть увеличение размера инстанции «плеера» на размер кода добавленного метода.


Объясните, плиз.
  • Вопрос задан
  • 3983 просмотра
Подписаться 3 Оценить Комментировать
Решения вопроса 1
Виртуальная машина (JVM) хранит данные экземпляров классов и их методы в разных областях памяти.

При умножении количества экземпляров одного класса умножения копий его методов не происходит.

Более развёрнуто можно почитать в главе The Structure of the Java Virtual Machine спецификации JVM: The Java Virtual Machine Specification
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 4
@Limosha
Я не спец в Java, но в большинстве ООП языков методы (все, не только статические) хранятся отдельно от данных и в единственном экземпляре.
Ответ написан
javax
@javax
Software Architect, Java Developer since 1996
Код метода хранится один раз для класса, а не копируется для каждого объекта.

Статические хранятся там же, просто они не могут использовать поля класса.
Ответ написан
Комментировать
@reality
Вы слишком рано начинаете думать об оптимизации, тем более такой мелкой. Я вас уверяю, что у итоге вы столкнетесь с совсем другими проблемами. Так что пишите игру и не думайте раньше времени об этом )
Ответ написан
vanxant
@vanxant
Думать вам надо не о памяти, занимаемой смешными 50к объектов (на сервер можно запихнуть и 32гб ОЗУ). Вам надо думать о том, как вы будете обеспечивать целостность вашей базы данных при зависании или рестарте сервера. Возможность откатиться минут на 5-10 раньше зависания может оказаться бесценной.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы