Вопрос не имеет смысла, по крайней мере, без дополнительного контекста.
Понятие «размер» в Java достаточно хорошо определено только для примитивов: байт — это 8 бит (что неудивительно), int
— 32 бита, long
— 64 бита и т. д. (см., например, http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html для полного список).
Для экземпляров объектов это сложнее, потому что:
- Экземпляры объекта могут (и обычно будут) содержать внутренние ссылки на другие экземпляры, поэтому вы должны решить, следует ли учитывать эти зависимые экземпляры и как. Что делать, если несколько экземпляров имеют общую зависимость?
- Иногда экземпляры объекта могут использоваться повторно (например, интернирование
java.lang.String
, см. http://en.wikipedia.org/wiki/String_interning ). Поэтому, если вы используете x объектов размера y, общий размер может быть меньше, чем x * y.
- У JVM есть много возможностей для внутренней реализации объектов и экземпляров. Он может использовать разные методы для разных экземпляров (например, совместное использование внутренних структур данных), поэтому может даже не быть значимого «размера» для назначения одному объекту.
Может быть, вы могли бы объяснить, почему вас интересуют размеры объектов.
Есть несколько эмпирических правил для оценки памяти кучи, используемой экземплярами (например, в Sun JVM экземпляр java.lang.Object
использует 8 байт), но они будут зависеть от используемой вами JVM.
Как правило, если вы хотите узнать об использовании кучи, используйте профилировщик памяти/кучи.
Изменить:
Ну, есть (начиная с JDK 6) способ получить приблизительное количество памяти, используемой объектом: http://download.oracle.com/javase/6/docs/api/java/lang/instrument/Instrumentation.html#getObjectSize%28java.lang.Object%29
Это пока только приблизительно...
person
sleske
schedule
06.11.2010