Я хотел бы измерить данные выделения памяти из своего JAVA-приложения, т.е. сумму размера всех объектов, которые были выделены. Так как объектное выделение сделано в молодом поколении, это, кажется, правильное место.
Я знаю jconsole, и я знаю бобы JMX, но я просто не могу найти правильную переменную... Прямо в данный момент мы анализируем выходной файл журнала gc, но это довольно твердо. Идеально мы хотели бы измерить его через JMX...
Как я могу получить это значение?
Дополнительная информация после комментария Chadwick:
Я хочу знать, сколько памяти мое приложение использует. Это - вполне большое программное обеспечение, работающее в JBoss Appserver. Каждые 4 недели существует новый релиз программного обеспечения, и мы должны сравнить потребление памяти между старой и новой версией. Недостаточно сравнить текущее значение старого поколения в определенное время. Очень полезно знать, сколько еще / или меньше памяти выделяется. Так как много объектов становятся собранными в молодом поколении, я должен измерить его там.
Тем временем у меня есть оценка для этого. Я отправлю его как ответ.
Спасибо, Marcel
Профилировщик Yourkit дает хорошее представление об использовании памяти. Ознакомительную версию можно найти по адресу http://www.yourkit.com/download/index.jsp
Вы можете отслеживать молодое поколение, используя MemoryPool MBeans, и более конкретно
http://java.sun.com/j2se/1.5.0/docs/api/java/lang/management/MemoryPoolMXBean.html
Смотрите примеры кода на http://www.javadocexamples.com/java_source/com/sun/enterprise/admin/mbeans/jvm/MemoryReporter.java. html и http://www.java2s.com/Code/Java/Development-Class/ThisVerboseGCclassdemonstratesthecapabilitytogetthegarbagecollectionstatisticsandmemoryusageremotely.htm
Если вы используете Sun JDK, вы можете просто включить Запись GC с помощью -verbose: gc -Xloggc: gc.log
и анализ файла. Или, если вам нужна общая сумма только изредка, возьмите GCViewer от Tagtraum, который вычисляет число, которое вы ищете.
Я не использовал его лично, но пробовали ли вы jmap?
опция -heap
печатает использование кучи с учетом генерации.
это инструмент в комплекте с jdk, поэтому он бесплатный и, вероятно, не требует больших накладных расходов.
Как насчет этого кода, он дает вам сумму байтов, используемых во всех пространствах (eden,Survivor,Old&Perm), что в значительной степени составляет всю память, используемую вашим экземпляром JVM.
public static void main(String[] args) {
for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) {
if (bean instanceof com.sun.management.GarbageCollectorMXBean) {
com.sun.management.GarbageCollectorMXBean internal = (com.sun.management.GarbageCollectorMXBean) bean;
Runtime.getRuntime().gc();
GcInfo gcInfo = internal.getLastGcInfo();
for (Map.Entry<java.lang.String,java.lang.management.MemoryUsage> e : gcInfo.getMemoryUsageBeforeGc().entrySet()) {
System.out.println(e.getKey() + ": " + e.getValue());
}
}
}
}