Как стать автором
Обновить

Комментарии 39

спасибо, побольше бы таких ява-программеров, которые знают, на чем ездят )
> Так почему же java программисты так мало знают об этой части своего инструмента?
А вы подумайте хорошенько (-;
SizeOf не нужен в Java, потому что нет pointer arithmetics. Для решения проблем с памятью рекомендуется использовать профайлер.

P.S. В тему
habrahabr.ru/blogs/java/124909/
Согласен, Java на то и Java, чтобы программист не заострял внимание на проблемы с памятью
Yep.

Дело еще и в том, что однозначно что-нибудь рассчитать сложно. Ответ на вопрос «сколько места в памяти займёт такой-то объект» всегда будет «зависит от JVM и от ситуации». Можно посчитать, сколько «весит» String, но есть ведь String pool например. Можно прикинуть размер массива int, но в 32 и 64-битных JVM int будет разный. И т.п.

В C(++) sizeof необходим для pointer arithmetics. Чтоб рассчитывать оффсеты и т.п. В Java зачем?

Если нужно следить за кол-вом свободной памяти:
docs.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#freeMemory()

Если следить за memory usage приложения — нужно профайлить в real life usage ситуациях. Никак иначе, и для C(++) подозреваю это тоже справедливо, хотя и в меньшей мере.

Просто странно как-то это подавать в стиле близком к такому: «вот чудаки джавишные, не знаю сколько памяти юзают. А я вот знаю хак чтоб посчитать — я крут».
Хак он хак и есть. Not for production, please.
Я с Вами не согласен. Это как не знать как работает процессор. Вы, конечно, можете апеллировать к тому, что никогда не используете напрямую регистры и система все делает за Вас. Но мне кажется, что сущность каждого программиста — изучать что-то новое. Может это и не нужно, но интересно точно.
Как «плавно» перешли от sizeof к «изучать что-то новое». Давайте еще о тайской медицине поговорим…
Изобретение sizeof != изучение принципов работы JVM.

И да, мало кто знает сейчас _как именно_ работают различные процессоры, потому что процессоры весьма непросты. Вы всё знаете о конвейерах например? Можете сходу назвать отличия в наборе инструкций x86 процессоров разных, ARM9, ARM11? И т.д и т.п. Вряд-ли.
Значит ли это, что вы — слабенький программист, который не интересуется ничем «дальше своей песочницы»? Вовсе нет.
Так о чём собственно речь?

Есть полно более полезных вещей, достойных изучения, нежели sizeof для Java.
Sizeof интересен в какой-то степени тоже, но не особо. IMHO.
Отмечу, что лично я уже давно не слежу за спецификой работы процессоров. Для x86 последний «понятный» процессор был третий пень. А потом с каждой иттерацией каждый процессор в нюансах уже другой. Тех же «четвёртых пней» — пруд пруди. И у каждого столько отличий… Следить за этим не будучи инженером в данной области просто невозможно. А ещё AMD…
А я и не говорил, что SizeOf нужен. Я говорил о том, что поголовно люди не могут оценить объем потребляемой памяти java программой. Ведь при определенных знаниях сделать это очень легко.
В Java сложно это сделать, вам уже описали выше почему, плюс ко всему работает GC, так что реальный объем памяти только через профайлинг можно отследить, не говоря уже о том что иерархии классов в Java бывают значительными, сидеть высчитывать их вычислять дело совсем не благодарное, проще запустить профайлер.
Еще и GC бывают разные…
Откуда эта часть — «Структура заголовка объекта»? Хочу пруфы.
Вы часто пишите для Java 1.3?

Я задал свой оригинальный вопрос потому, что в статье написана информация, имеющая в данный момент мало общего с реальностью.
Бросьте линком пожалуйста, если нет трудно.
Ваш первый линк.
Я про то, где можно прочитать про структуру заголовка.
Сейчас заканчиваю топик.
Не поленился, заглянул в исходники. Вот — hg.openjdk.java.net/jdk6/jdk6/hotspot/file/8389681cd7b1/src/share/vm/oops/markOop.hpp
Собственно, мне из этого трудно понять саму структуру и я не могу сказать что значат первые 1 0 0 0 байт, но похоже на инфу для сборщика. То что я вижу явно не противоречит тому, что я написал. И Ваш вывод про magic number несколько поспешен.
По-моему тех кто не знает разницы между

//первый случай
int a = 300;
//второй случай
Integer b = 301;

сложно называть программистом… Каким-то другим словом — пожалуйста, но только не программистом…
> сложно называть программистом

на Java.
А разницу между

Integer a = 127;
Integer b = 128;

?
Без понятия. Я только изучаю джаву. Но таких тонкостей не знаю пока. Что я вижу, так это автобоксинг который преобразуется компилятором в

Integer a = new Integer(127);
Integer b = new Integer(128);

А какая тут разница я без понятия… Просветите, буду благодарен

Для более эффективного использования памяти, в джаве используются так называемые пулы. Есть строковый пул, Integer pool итд. Когда мы создаем объект не используя операцию new, объект помещается в пул, и в последствии, если мы захотим создать такой же объект (опять не используя new), новый объект создан не будет, а мы просто получим ссылку на наш объект из пула.
Особенность Integer-пула — он хранит только числа, которые помещаются в тип данных byte: от -128 до 127. Для остальных чисел пул не работает.

http://habrahabr.ru/blogs/java/111189/
http://habrahabr.ru/blogs/java/112674/
и т.п.
Спасибо. Про пулы строк читал, а вот про другие не знал )
НЛО прилетело и опубликовало эту надпись здесь
Зачем и правда знать сколько с точностью до байта занимает объект памяти? Достаточно знать, что объекты жрут памяти больше чем примитивы. Если так нужно экономить — используйте Apache Commons primitives, этого достаточно я считаю
> Да, большинству из нас это вообще не нужно и никто в реальных java проектах не будет об этом думать.

На этой фразе я почувствовал конгитивный диссонанс. Я вроде бы занимаюсь реальным проектом, мне это нужно, я об этом думаю, значит я отношусь к категории «никто»?

> Иными словами, размеры экземпляров Ваших классов могут отличатся от одной JVM к другой.

Вот! Это верно, а остальное — шелуха.

> Зачем и правда знать сколько с точностью до байта занимает объект памяти?

Чтобы при необходимости оптимизации из нескольких вариантов выбрать более подходящий. Зачем строителю знать вес железобетонной плиты? Чтобы рассчитать размер фундамента и выбрать подходящий кран. Впрочем, строителю не нужна точность до грамма, а жава-программисту до байта (критические случаи CDC и всякие Java-Card не будем вспоминать)

А если есть необходимость оптимизации, не стоит ли тут глянуть в сторону настройки параметров Java Memory Model? Пересмотром размеров eden, old generation и т.д. можно многого добиться.
Java бывает не только на компьютерах.
Давайте сформулируем общий принцип: не всегда есть доступ к настройкам того окружения в котором будет выполняться твоя программа.
(в моем случае в тезисе можно смело заменить «не всегда есть доступ» на «нет доступа» — я программирую для телефонов)
Уважаемые Java программисты.
Не путайте, плиз, Java Memory Model и то как работает Memory Management.
Это разные вещи. Java Memory Model — не настраивается.
Мне кажется, что акцент в статье неправильно поставлен над тем, сколько занимает объект. Правильнее задумываться, что именно содержится в заголовке объекта и для чего эта информация служит. Например, часто на интервью людям с опытом задаю простой вопрос: для чего в JVM определено два разных байткода: invokevirtual и invokeinterface? Вопрос на самом деле из разряда бонусных: не знаешь так не знаешь, хуже про тебя никто думать не будет. Но показательно, что за многие годы никто пока не ответил.
Погуглил, нашел ответ. Не могу понять, зачем нужно это знание Java программисту.
Oracle разве так и не добавил сжатие заголовок для объектов в 64битовой системе?
Сжимаются указатели на объекты. Заголовок так и остался равен двум 64-битным словам.
я джва года ждал эту статью!
А Вы не пробовали написать sizeof utility? Естественно для внутренних классов JVM нужно будет сделать предрасчет для разных платформ. Я когда-то пробовал, но не хватило терпения.
На вопрос «для чего»: Для регулирования кол-ва объектов в Cache, когда объекты динамического размера, например содержат разное кол-во содержимых атрибутов, стринги разной длины, и.т.п. Конкретно, мне надо было расчитивать оптимальный размер Cache для платформы датинга, где заполненность профиля может быть разная, и меняться от релиза к релизу из-за добавления новых полей. Было бы полезно, если бы Cache мог бы сам адаптировать свой размер (кол-во профилей) исходя из доступной памяти и среднего размера объектов.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации