Как измерить сумму собранной памяти молодого поколения? - PullRequest
7 голосов
/ 01 июня 2010

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

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

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

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

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

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

Спасибо, Marcel

Ответы [ 6 ]

3 голосов
/ 01 июня 2010
2 голосов
/ 01 июня 2010

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

1 голос
/ 05 сентября 2010

Это моя идея оценки. Это в основном возвращает значение «количество молодых коллекций х размер молодого поколения». Это не идеально, но работает довольно хорошо для моего случая использования.

public long getYoungGenAllocatedMB() {
  long youngMaxMemory;
  long youngUsedMemory;
  long youngCollectionCount;

  List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans();
  for (MemoryPoolMXBean bean : beans) {
    if ("Par Eden Space".equals(bean.getName())) {
      MemoryUsage usage = bean.getUsage();
      youngMaxMemory = usage.getMax();
      youngUsedMemory = usage.getUsed();
      break;
    }
  }

  List<GarbageCollectorMXBean> gBeans = ManagementFactory.getGarbageCollectorMXBeans();
  for (GarbageCollectorMXBean bean : gBeans) {
    if ("ParNew".equals(bean.getName())) {
      youngCollectionCount = bean.getCollectionCount();
      break;
    }
  }

  return (youngCollectionCount * youngMaxMemory + youngUsedMemory) / 1024 / 1024;
}

Спасибо всем остальным постерам!

Marcel

1 голос
/ 30 августа 2010

Что касается этого кода, он дает вам сумму байтов, используемых во всех пробелах (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 голос
/ 25 августа 2010

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

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

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

1 голос
/ 01 июня 2010

Yourkit profiler обеспечивает хорошую разбивку по использованию памяти. Есть оценочная версия на http://www.yourkit.com/download/index.jsp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...