2014-02-03 19 views
1

Насколько я знаю хорошо известный инструмент Инструмент Java не может правильно рассчитать глубину объекта.JVM глубокий объем памяти объекта

Есть ли надежный способ вычислить на JVM правильный глубокий размер объекта?

Используемый случай, о котором я думаю, представляет собой фиксированную (или верхнюю ограниченную) структуру данных размера памяти, то есть кэш.

Примечание: насколько это возможно, я хотел бы корпоративное решение готово, так как «стандарт» кодирования практики или хорошо протестирована библиотека

+0

Не могли бы вы обновить свой вопрос, чтобы объяснить, почему http://stackoverflow.com/a/52682/3224483 не работает для вас? Это был первый результат Google для ** памяти Java **, который говорит мне, что вы не выглядели очень тяжело. – Rainbolt

+0

JVM может выделять столько памяти, сколько захочет (http://docs.oracle.com/javase/7/docs/technotes/guides/vm/performance-enhancements-7.html#compressedOop), и это не собираюсь рассказывать вам, что он делает внутри (за исключением внешних профилировщиков, возможно), расчеты могут быть хорошей оценкой в ​​лучшем случае. И что означает глубокий размер, который вы ссылаетесь на объект, на который также ссылается что-то еще? – zapl

+0

@ Джон ничего себе, надеюсь, вы не дали -1 для этого! getObjectSize(), как я указал в вопросе, AFAIK не перенастраивает глубокий размер объекта, кстати, даже в документации говорится, что это приближение! –

ответ

1

Я знаю, хорошо известный метод Инструментарий Java не может правильно вычислить глубину объекта.

С прибором один, нет.

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

Есть ли надежный способ вычислить на JVM правильный глубокий размер объекта?

Я использую профилировщик, но если вы не верите некоторым инструментам, которые вы используете, вы никогда не узнаете.

Используемый случай, о котором я думаю, представляет собой фиксированную (или верхнюю ограниченную) структуру данных размера памяти, то есть кэш.

Как медленно вы готовы сделать свой кеш для точного использования памяти? Если это 10x или 100x медленнее, но имеет очень точное использование, это лучше, чем что-то, что просто подсчитывает количество элементов?

так, либо «стандарт» кодирования практики или хорошо протестирована библиотека

В этом случае использует подсчет элементов. Для этого вы можете использовать LinkedHashMap или ehcache.

+0

Здравствуйте, так ответ: вы не можете ограничить размер памяти в структуре данных? О том, как я знаю: http://stackoverflow.com/questions/52353/in-java-what-is-the-best-way-to-determine-the-size-of-an-object –

+0

@downvoter, care комментировать почему? –

+0

@ VincenzoMaggio вы спросили, можете ли вы определить глубину структуры данных, и вы можете сделать это с помощью Instrumentation. Замечания о его приближении основаны на попытке определить, насколько добавлена ​​структура данных, и вы не можете легко определить это без изучения всей памяти. например профилировщик тоже может это сделать. –

Смежные вопросы