Как я могу проверить использование памяти в объекте в java

ОБНОВИТЬ

Я попробовал ответить

В Java, каков наилучший способ определить размер объекта?

Но когда я попробовал код ниже, он дал мне 16 для кода ниже

public class MemoryTest { public static void main(String[] args) { System.out.println(ObjectSizeFetcher.getObjectSize(new ArrayList<>().add(new DummyObject()))); } } 

И 16 не то, что я ищу, поэтому я снова задал этот вопрос. Этот вопрос еще дублирует вопрос?


Я хочу проверить использование памяти в объекте, и вот что я пробовал. (Java 8)

 // Dummy Object class public class DummyObject { int dummy; } // Separate class to check memory public class MemoryTest { public static void main(String[] args) { Runtime runtime = Runtime.getRuntime(); long before = runtime.totalMemory() - runtime.freeMemory(); DummyObject obj = new DummyObject(); long after = runtime.totalMemory() - runtime.freeMemory(); System.out.println(after - before); } } 

И результат равен "0"

Может ли кто-нибудь сказать мне
1. Почему результат равен 0
2. Каков правильный способ измерения использования памяти объектом

заранее спасибо


ОБНОВИТЬ

Когда я попробовал тот же код в Android-проекте, как показано ниже (версия SDK 23)

 public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Runtime runtime = Runtime.getRuntime(); long before = runtime.totalMemory() - runtime.freeMemory(); DummyObject obj = new DummyObject(); long after = runtime.totalMemory() - runtime.freeMemory(); System.out.println("test memory: " + (after - before)); } } 

В результате получилось "680"

Что делает это различие и почему?

Instrumentation Interface Instrumentation предоставляет метод, называемый getObjectSize()

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

Возвращает специфическое для реализации приближение объема хранения, потребляемого указанным объектом

Может быть, это может вам помочь.

Документация интерфейсного прибора

Как указано в javadoc, метод возвращает

«Приближение к общему количеству памяти, доступной в настоящее время для будущих выделенных объектов, измеренных в байтах».

См. Также: Java – Runtime.freeMemory ()

Поскольку методы возвращают аппроксимации, трудно определить небольшие различия. Чтобы получить больше информации о памяти, используемой приложением, вы можете больше узнать о памяти с помощью инструмента профилирования. Например, проверьте анализатор памяти Eclipse https://eclipse.org/mat/

Обновление: ответьте на обновление. Методы реализуются в JVM, что означает реализацию, и, возможно, точность приближения может варьироваться в зависимости от разных JVM, то есть возврат результатов на JVM, работающий в Windows или Linux, и андроид может возвращать разные значения.

Также totalMemory() на основе javadoc: http://docs.oracle.com/javase/7/docs/api/java/lang/Runtime.html#totalMemory%28%29

Возвращает общий объем памяти в виртуальной машине Java. Значение, возвращаемое этим методом, может меняться со временем, в зависимости от среды хоста.

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

Таким образом, вы также используете другое приближение, которое также меняется со временем. Использование только freeMemory() для вычисления сокращения свободной памяти может быть, пожалуй, лучше.

Intereting Posts