Как рассчитать пропускную способность с помощью Jconsole

Есть ли способ рассчитать пропускную способность сборки мусора для заданного временного интервала программы Java с использованием интерфейса JConsole? Например, я хочу сравнить различные функции в программе и то, как пропускная способность GC различается между ними.

Я прочитал документы Oracle JConsole, и ближайшая метрика, которую я могу найти, - это время GC, которое составляет:

«Время GC: совокупное время, затраченное на сборку мусора, и общее количество вызовов. Оно может иметь несколько строк, каждая из которых представляет один алгоритм сборщика мусора, используемый в виртуальной машине Java».

Источник: https://docs.oracle.com/javase/8/docs/technotes/guides/management/jconsole.html

Но это не указывает время начала, когда он начинает накапливаться. Если бы я мог определить, когда это начинается, я мог бы рассчитать пропускную способность самостоятельно.

Или, в качестве альтернативы, есть ли другой способ рассчитать пропускную способность JConsole?


person pameile    schedule 19.09.2017    source источник
comment
gcviewer может рассчитать пропускную способность на основе журналов сборщика мусора. в качестве альтернативы вы можете рассчитать его самостоятельно, получив необработанные данные от mxbeans.   -  person the8472    schedule 19.09.2017
comment
Отлично, спасибо, я не знал об этом инструменте! Похоже, как раз то, что мне нужно. @the8472   -  person pameile    schedule 19.09.2017


Ответы (1)


Я обычно использую два:

  1. GCViewer
  2. gceasy

одновременно, потому что разные инструменты могут показывать разные результаты.

На ваш вопрос ответ - журналы GC включены с момента запуска приложения. Поэтому, когда вы видите время GC, вы можете получить пропускную способность = сумма (время GC)/общее время.

Под включенными журналами GC вы подразумеваете использование -verbose:gc или -Xloggc: ?

Нет, я имею в виду внутренние счетчики. Хорошо уточнить.

Кроме того: знаете ли вы, что представляет собой время GC: время с момента запуска приложения или время за заданный период времени?

С момента запуска приложения. Другой подход к просмотру времени GC с использованием jstat . Пусть у нас будет такая программа:

public class JStatTest {

    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10; ++i) {
            System.gc();
            System.out.println("Wait...");
            Thread.sleep(1000);
        }
        Thread.sleep(100_000);
    }

}

Мы можем подключиться к jstat (с самого начала) и jconsole (ближе к концу, после цикла) и увидеть это:

введите здесь описание изображения

Это без включенного подробного ведения журнала GC.

Чтобы увидеть общее время:

введите здесь описание изображения

person egorlitvinenko    schedule 20.09.2017
comment
Под включенными журналами GC вы подразумеваете использование -verbose:gc или -Xloggc:‹filename› ? Если да, то нужно ли вам агрегировать полученные журналы, напечатанные в командной строке или в файле? Кроме того: знаете ли вы, что представляет собой время GC: время с момента запуска приложения или время за заданный период времени? - person pameile; 20.09.2017
comment
Спасибо @egorlitvinenko Это действительно полезно! Жаль, что в JConsole нет сведений об общем времени работы приложения, но я могу получить его из вывода командной строки. - person pameile; 20.09.2017
comment
О гениально! Еще раз спасибо, это супер полезно! - person pameile; 20.09.2017