Как измерить сумму собранной памяти Молодого Поколения?

Я хотел бы измерить данные выделения памяти из своего JAVA-приложения, т.е. сумму размера всех объектов, которые были выделены. Так как объектное выделение сделано в молодом поколении, это, кажется, правильное место.

Я знаю jconsole, и я знаю бобы JMX, но я просто не могу найти правильную переменную... Прямо в данный момент мы анализируем выходной файл журнала gc, но это довольно твердо. Идеально мы хотели бы измерить его через JMX...

Как я могу получить это значение?

Дополнительная информация после комментария Chadwick:

Я хочу знать, сколько памяти мое приложение использует. Это - вполне большое программное обеспечение, работающее в JBoss Appserver. Каждые 4 недели существует новый релиз программного обеспечения, и мы должны сравнить потребление памяти между старой и новой версией. Недостаточно сравнить текущее значение старого поколения в определенное время. Очень полезно знать, сколько еще / или меньше памяти выделяется. Так как много объектов становятся собранными в молодом поколении, я должен измерить его там.

Тем временем у меня есть оценка для этого. Я отправлю его как ответ.

Спасибо, Marcel

7
задан Marcel 5 September 2010 в 16:26
поделиться

5 ответов

Профилировщик Yourkit дает хорошее представление об использовании памяти. Ознакомительную версию можно найти по адресу http://www.yourkit.com/download/index.jsp

1
ответ дан 7 December 2019 в 03:12
поделиться

Если вы используете Sun JDK, вы можете просто включить Запись GC с помощью -verbose: gc -Xloggc: gc.log и анализ файла. Или, если вам нужна общая сумма только изредка, возьмите GCViewer от Tagtraum, который вычисляет число, которое вы ищете.

2
ответ дан 7 December 2019 в 03:12
поделиться

Я не использовал его лично, но пробовали ли вы jmap?

опция -heap печатает использование кучи с учетом генерации.

это инструмент в комплекте с jdk, поэтому он бесплатный и, вероятно, не требует больших накладных расходов.

1
ответ дан 7 December 2019 в 03:12
поделиться

Как насчет этого кода, он дает вам сумму байтов, используемых во всех пространствах (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());
            }
        }
    }
}
1
ответ дан 7 December 2019 в 03:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: