Профилирование кучи Java между двумя событиями - PullRequest
4 голосов
/ 06 декабря 2010

Я хочу собрать кучу использования программы. В частности, от конкретного начального события до конечного события и с установленным интервалом, например, каждые 10 мс. Я сам пытался реализовать что-то подобное, а именно следующий код. Он работает для медленных интервалов, таких как 1 секунда, но для более низких интервалов, таких как 100 мс, он глючит Блокирует ли метод System.gc () все потоки до его завершения? В настоящее время я так предполагаю.

public void startAsync()
{
    running = true;
    Thread thread = new Thread(new Runnable()
    {
        @Override
        public void run()
        {
            while (running)
            {
                measure();
                try
                {
                    Thread.sleep(wait);
                } catch (InterruptedException e)
                {
                    throw new RuntimeException();
                }
            }
        }
    });
    thread.start();
}

public void measure()
{
    MemoryMXBean memoryBean = ManagementFactory.getMemoryMXBean();
    memoryBean.gc();
    long currentTime = System.currentTimeMillis();
    MemoryUsage memoryUsage = memoryBean.getHeapMemoryUsage();
    writer.exec(currentTime - startTime, memoryUsage.getUsed());
}

Ответы [ 5 ]

2 голосов
/ 06 декабря 2010

YourKit превосходно (нет соединения, кроме как в качестве довольного клиента.)

2 голосов
/ 06 декабря 2010

Числа, возвращаемые java.lang.Runtime, ничего не стоят - игнорируйте их.

Вы получите лучшие результаты от API управления, например,

MemoryUsage memoryUsage = ManagementFactory.getMemoryMXBean().getMemoryUsage();

... и связанные методы, которые, вероятно, дадут вам гораздо больше информации, чем вы когда-либо хотели знать.

1 голос
/ 17 января 2013

Вместо того, чтобы тратить время в командной строке, я предлагаю вам выполнить точные измерения, предоставленные IDE NetBeans.

0 голосов
/ 17 января 2013

JProfiler - лучший инструмент для мониторинга таких проблем.

0 голосов
/ 06 декабря 2010

Вы можете сделать это из командной строки с помощью jmap -heap

http://download.oracle.com/javase/1.5.0/docs/tooldocs/share/jmap.html

1 строчный сценарий, чтобы повторять это каждые x секунд.

...