Комментарии 39
спасибо, побольше бы таких ява-программеров, которые знают, на чем ездят )
> Так почему же java программисты так мало знают об этой части своего инструмента?
А вы подумайте хорошенько (-;
SizeOf не нужен в Java, потому что нет pointer arithmetics. Для решения проблем с памятью рекомендуется использовать профайлер.
P.S. В тему
habrahabr.ru/blogs/java/124909/
А вы подумайте хорошенько (-;
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.
Дело еще и в том, что однозначно что-нибудь рассчитать сложно. Ответ на вопрос «сколько места в памяти займёт такой-то объект» всегда будет «зависит от 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.
Изобретение sizeof != изучение принципов работы JVM.
И да, мало кто знает сейчас _как именно_ работают различные процессоры, потому что процессоры весьма непросты. Вы всё знаете о конвейерах например? Можете сходу назвать отличия в наборе инструкций x86 процессоров разных, ARM9, ARM11? И т.д и т.п. Вряд-ли.
Значит ли это, что вы — слабенький программист, который не интересуется ничем «дальше своей песочницы»? Вовсе нет.
Так о чём собственно речь?
Есть полно более полезных вещей, достойных изучения, нежели sizeof для Java.
Sizeof интересен в какой-то степени тоже, но не особо. IMHO.
Отмечу, что лично я уже давно не слежу за спецификой работы процессоров. Для x86 последний «понятный» процессор был третий пень. А потом с каждой иттерацией каждый процессор в нюансах уже другой. Тех же «четвёртых пней» — пруд пруди. И у каждого столько отличий… Следить за этим не будучи инженером в данной области просто невозможно. А ещё AMD…
А я и не говорил, что SizeOf нужен. Я говорил о том, что поголовно люди не могут оценить объем потребляемой памяти java программой. Ведь при определенных знаниях сделать это очень легко.
В Java сложно это сделать, вам уже описали выше почему, плюс ко всему работает GC, так что реальный объем памяти только через профайлинг можно отследить, не говоря уже о том что иерархии классов в Java бывают значительными, сидеть высчитывать их вычислять дело совсем не благодарное, проще запустить профайлер.
Откуда эта часть — «Структура заголовка объекта»? Хочу пруфы.
Немного отсюда openjdk.java.net/groups/hotspot/docs/HotSpotGlossary.html
и отсюда java.sun.com/products/hotspot/docs/whitepaper/Java_HotSpot_WP_Final_4_30_01.html#pgfId=1082734
Еще была одна ссылка, сечас не могу найти
и отсюда java.sun.com/products/hotspot/docs/whitepaper/Java_HotSpot_WP_Final_4_30_01.html#pgfId=1082734
Еще была одна ссылка, сечас не могу найти
Вы часто пишите для Java 1.3?
Я задал свой оригинальный вопрос потому, что в статье написана информация, имеющая в данный момент мало общего с реальностью.
Я задал свой оригинальный вопрос потому, что в статье написана информация, имеющая в данный момент мало общего с реальностью.
Бросьте линком пожалуйста, если нет трудно.
Ваш первый линк.
Я про то, где можно прочитать про структуру заголовка.
Сейчас заканчиваю топик.
Не поленился, заглянул в исходники. Вот — hg.openjdk.java.net/jdk6/jdk6/hotspot/file/8389681cd7b1/src/share/vm/oops/markOop.hpp
Собственно, мне из этого трудно понять саму структуру и я не могу сказать что значат первые 1 0 0 0 байт, но похоже на инфу для сборщика. То что я вижу явно не противоречит тому, что я написал. И Ваш вывод про magic number несколько поспешен.
Собственно, мне из этого трудно понять саму структуру и я не могу сказать что значат первые 1 0 0 0 байт, но похоже на инфу для сборщика. То что я вижу явно не противоречит тому, что я написал. И Ваш вывод про magic number несколько поспешен.
По-моему тех кто не знает разницы между
//первый случай
int a = 300;
//второй случай
Integer b = 301;
сложно называть программистом… Каким-то другим словом — пожалуйста, но только не программистом…
//первый случай
int a = 300;
//второй случай
Integer b = 301;
сложно называть программистом… Каким-то другим словом — пожалуйста, но только не программистом…
> сложно называть программистом
на Java.
на Java.
А разницу между
Integer a = 127;
Integer b = 128;
?
Integer a = 127;
Integer b = 128;
?
Без понятия. Я только изучаю джаву. Но таких тонкостей не знаю пока. Что я вижу, так это автобоксинг который преобразуется компилятором в
Integer a = new Integer(127);
Integer b = new Integer(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/
и т.п.
Для более эффективного использования памяти, в джаве используются так называемые пулы. Есть строковый пул, 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 не будем вспоминать)
На этой фразе я почувствовал конгитивный диссонанс. Я вроде бы занимаюсь реальным проектом, мне это нужно, я об этом думаю, значит я отношусь к категории «никто»?
> Иными словами, размеры экземпляров Ваших классов могут отличатся от одной JVM к другой.
Вот! Это верно, а остальное — шелуха.
> Зачем и правда знать сколько с точностью до байта занимает объект памяти?
Чтобы при необходимости оптимизации из нескольких вариантов выбрать более подходящий. Зачем строителю знать вес железобетонной плиты? Чтобы рассчитать размер фундамента и выбрать подходящий кран. Впрочем, строителю не нужна точность до грамма, а жава-программисту до байта (критические случаи CDC и всякие Java-Card не будем вспоминать)
А если есть необходимость оптимизации, не стоит ли тут глянуть в сторону настройки параметров Java Memory Model? Пересмотром размеров eden, old generation и т.д. можно многого добиться.
Java бывает не только на компьютерах.
Давайте сформулируем общий принцип: не всегда есть доступ к настройкам того окружения в котором будет выполняться твоя программа.
(в моем случае в тезисе можно смело заменить «не всегда есть доступ» на «нет доступа» — я программирую для телефонов)
Давайте сформулируем общий принцип: не всегда есть доступ к настройкам того окружения в котором будет выполняться твоя программа.
(в моем случае в тезисе можно смело заменить «не всегда есть доступ» на «нет доступа» — я программирую для телефонов)
Уважаемые Java программисты.
Не путайте, плиз, Java Memory Model и то как работает Memory Management.
Это разные вещи. Java Memory Model — не настраивается.
Не путайте, плиз, Java Memory Model и то как работает Memory Management.
Это разные вещи. Java Memory Model — не настраивается.
Мне кажется, что акцент в статье неправильно поставлен над тем, сколько занимает объект. Правильнее задумываться, что именно содержится в заголовке объекта и для чего эта информация служит. Например, часто на интервью людям с опытом задаю простой вопрос: для чего в JVM определено два разных байткода: invokevirtual и invokeinterface? Вопрос на самом деле из разряда бонусных: не знаешь так не знаешь, хуже про тебя никто думать не будет. Но показательно, что за многие годы никто пока не ответил.
Oracle разве так и не добавил сжатие заголовок для объектов в 64битовой системе?
я джва года ждал эту статью!
А Вы не пробовали написать sizeof utility? Естественно для внутренних классов JVM нужно будет сделать предрасчет для разных платформ. Я когда-то пробовал, но не хватило терпения.
На вопрос «для чего»: Для регулирования кол-ва объектов в Cache, когда объекты динамического размера, например содержат разное кол-во содержимых атрибутов, стринги разной длины, и.т.п. Конкретно, мне надо было расчитивать оптимальный размер Cache для платформы датинга, где заполненность профиля может быть разная, и меняться от релиза к релизу из-за добавления новых полей. Было бы полезно, если бы Cache мог бы сам адаптировать свой размер (кол-во профилей) исходя из доступной памяти и среднего размера объектов.
На вопрос «для чего»: Для регулирования кол-ва объектов в Cache, когда объекты динамического размера, например содержат разное кол-во содержимых атрибутов, стринги разной длины, и.т.п. Конкретно, мне надо было расчитивать оптимальный размер Cache для платформы датинга, где заполненность профиля может быть разная, и меняться от релиза к релизу из-за добавления новых полей. Было бы полезно, если бы Cache мог бы сам адаптировать свой размер (кол-во профилей) исходя из доступной памяти и среднего размера объектов.
НЛО прилетело и опубликовало эту надпись здесь
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Размер Java объектов