2010-12-06 2 views
4

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

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()); 
} 
+0

Ваши измерения сами измеряют :) – khachik 2010-12-06 15:26:29

ответ

2

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

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

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

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

2

YourKit превосходен (нет связи, кроме как удовлетворенный клиент.)

+0

Лицензия на оценку может быть все, что вам нужно для диагностики проблемы. ;) – 2010-12-06 16:13:44

0

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