Просмотреть мой любимый проект, MemoryMeasurer. Крошечный пример:
long memory = MemoryMeasurer.measureBytes(new HashMap());
Вы также можете получить более качественное расстройство памяти:
Footprint footprint = ObjectGraphMeasurer.measure(new HashMap());
Например, я использовал последний для получения per entry cost of various data structures, где накладные расходы измеряются в количестве объектов, созданных, ссылки и примитивы, а не просто байты (что также можно сделать). Итак, в следующий раз, когда вы используете (по умолчанию) HashSet
, вы можете сообщить, что каждый элемент в нем стоит 1 новый объект (не ваш элемент), 5 ссылок и int, что является одинаковой стоимостью для записи в HashMap
(не является неожиданным, поскольку любой элемент HashSet
попадает в HashMap
) и так далее.
Вы можете использовать его на любом графике объекта. Если ваш графический объект содержит ссылки других структур, которые вы хотите игнорировать, вы должны использовать предикат, чтобы не исследовать их.
РедактироватьInstrumentation
не доступен для Java 1.4 (вау, люди до сих пор используют это ?!), поэтому memoryBytes
вызов выше, не будет работать для вас. Но второй будет. Тогда вы можете написать что-то вроде этого (если вы находитесь на 32-битной машине):
long memory = footprint.getObjects() * 8 + footprint.getReferences() * 4 +
footprint.getPrimitives().count(int.class) * 4 +
footprint.getPrimitives().count(long.class) * 8 + ...;
Это дает вам приблизительно. Лучше ответ будет CEIL это до ближайшего кратного 16:
long alignedMemory = (x + 15) & (~0xF); //the last part zeros the lowest 4 bits
Но ответ все еще может быть выключен, так как если вы найдете, скажем, 16 булевы, это одна вещь, если они находятся в том же объект, и совсем другое, если они распространены в нескольких объектах (и вызывают чрезмерное использование пространства из-за выравнивания). Эта логика может быть реализована как другая visitor (аналогично тому, как реализованы MemoryMeasurer и ObjectGraphMeasurer), но я не беспокоился, так как это то, что делает Instrumentation
, так что это будет иметь смысл только для версий Java ниже 1.5 ,
Возможный дубликат http://stackoverflow.com/questions/390449/determining-java-memory-usage – nc3b
@ nc3b Эта ссылка рассматривает больше о 1.5. Хотя стоит отметить, что URL: http://www.javamex.com/tutorials/memory/instrumentation.shtml. Хотелось бы иметь это в моей java:/ – Gadolin