Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

Сколько памяти занимает обьект?

#java #netbeans


Как узнать сколько занимает памяти ArrayList, или простые object?

Java 1.7-1.8, NetBeans
    


Ответы

Ответ 1



Например, можно использовать package java.lang.instrument. Скомпилируйте этот класс в JAR: import java.lang.instrument.Instrumentation; public class ObjectSizeFetcher { private static Instrumentation instrumentation; public static void premain(String args, Instrumentation inst) { instrumentation = inst; } public static long getObjectSize(Object o) { return instrumentation.getObjectSize(o); } } Добавьте следующую строчку в MANIFEST.MF: Premain-Class: ObjectSizeFetcher Теперь можно использовать getObjectSize: public class C { private int x; private int y; public static void main(String [] args) { System.out.println(ObjectSizeFetcher.getObjectSize(new C())); } } Запускается так: java -javaagent:ObjectSizeFetcherAgent.jar C Перевод этого ответа с en.SO

Ответ 2



На самом деле, очень интересный вопрос. Покопавшись в библиотеке ehcache-sizeOf нашел в ней несколько способов определения размера объекта: С помощью Reflection. Подход довольно тривиальный, зная у объекта класс, мы можем определить какие у него и его "родителей" есть поля и вычислить приблизительный размер. Так же к этому значению стоит добавить размер заголовка. Более подробно можно посмотреть в исходниках класса RelflectionSizeOf Следующий подход представляет из себя использование хорошо знакомого класса java.lang.instrument.Instrumentation. Самостоятельно создать объект данного класса нельзя. Поэтому для получения экземпляра класса приложение запускается с нужным Java агентом который, в свою очередь, сохраняет объект в static поле. После того как агент закончил свою работу, можно уже будет вызвать метод Instrumentation::getObjectSize который в свою очередь вызовет native метод jvm. AgentSizeOf Так же есть возможность воспользоваться непубличным api стандартной библиотеки, а именно классом sun.misc.Unsafe. Алгоритм не сложный. Опять же зная, какие есть поля у класс мы можем определить смещение. Делается это с помощью метода Unsafe::objectFieldOffset, а уже на основе смещения можно вычислить и размер объекта. Подробности реализации в классе UnsafeSizeOf

Комментариев нет:

Отправить комментарий