2010-08-11 3 views
3

Я пишу код Java, и я хочу выполнить некоторые тесты производительности. Я хочу получить память кучи, используемую только одним из методов моего класса.получить кучную память, используемую методом в классе java

public AccessControl { 

    public boolean Allowed() { 
     code 
     } 
    public void print() { 
    code } 
} 

я хочу, чтобы память кучи, используемой в Java каждый метод разрешены называется во время выполнения. Я читаю, что могу сделать это с помощью HPROf, но я заметил, что HPROf не обеспечивает вычисления памяти для методов, но только для классов есть код, который я могу написать внутри метода, чтобы получить доступную память, а затем использованную память? спасибо

ответ

1

Нет такой вещи, как «память кучи, используемая методом». Способы не занимают память кучи, объекты делают.

Если вы заинтересованы в объектах, созданных в рамках определенного метода (и, конечно же, методов, которые он вызывает прямо и косвенно), вы можете сравнить снимки кучи, созданные до и после вызова метода (выполняемые при запуске в отладчик и установка контрольных точек).

Но какова проблема, которую вы пытаетесь решить? Утечки памяти обычно диагностируются, сначала обнаруживая корни GC для явно ненужных объектов и используя отладчик, чтобы выяснить, где и почему установлены эти ссылки.

+0

да я заинтересован в объектах, созданных в метод. У меня нет проблемы, я просто хочу оценить производительность моих методов (оценивая время и память) Я не могу отлаживать, потому что метод вызывается много раз, и я хочу, чтобы память, используемая объектами этого класса для вычисления и отправки в файл, который я могу просмотреть после завершения прогона. –

+0

@ Сара: точка памяти кучи состоит в том, что она используется всем приложением. Методы создают объекты, которые затем используются множеством других методов. Вот почему нет способа собрать эту сомнительную метрику. –

+0

ОК спасибо за пояснение. я увижу, что делать. Дело в том, что я создал один компонент приложения, и я должен проверить его производительность, и поэтому я смущен. –

0

Я бы рекомендовал, чтобы при профилировании вы не уклонялись от своих результатов, введя новый код. Если HPROF не решит вашу проблему, вы можете использовать отладчик и применять точки останова, где вы хотите анализировать. Вы также можете попробовать JProfiler. Я бы рекомендовал, чтобы вместо того, чтобы сосредоточиться на одном конкретном месте в вашем коде, сначала взглянуть на картину. В противном случае вы рискуете premature optimization.

1

InMemProfiler может использоваться для распределения памяти памяти. В режиме трассировки этот инструмент можно использовать для identify the source of memory allocations.

Вы можете использовать опцию # tracetarget-org.yourcode.YourClass, чтобы получить вывод «Выделение классов», чтобы отобразить выделение памяти для каждого метода в YourClass.

Однако вы сможете распределять память памяти только для каждого выделенного класса отдельно. В настоящее время нет кратких данных по всем выделенным классам. Если бы вы были очень заинтересованы, вы могли бы использовать fork InMemProfiler и попробовать и добавить эту функциональность.

0

Если вы используете oracle jvm, вы можете это сделать!

ThreadMXBean threadmx = ManagementFactory.getThreadMXBean(); 
long startbyte = ((com.sun.management.ThreadMXBean)threadmx) 
    .getThreadAllocatedBytes(Thread.currentThread().getId()); 
//call method 
int usedbyte = ((com.sun.management.ThreadMXBean)threadmx) 
    .getThreadAllocatedBytes(Thread.currentThread().getId())-startbyte; 
0

Один из способов заключается в использовании профилировщика памяти как jprofiler, но если вы просто хотите, чтобы увидеть память, используемую в наборе операторов использовать ниже код

Runtime runtime = Runtime.getRuntime(); 
long memoryUsedBefore = runtime.totalMemory() - runtime.freeMemory(); 
System.out.println("Memory used before: " + memoryUsedBefore); 
    // set of memory consumption statements here 
long memoryUsedAfter = runtime.totalMemory() - runtime.freeMemory(); 
System.out.println("Total Memory increased:" + (memoryUsedAfter - memoryUsedBefore)); 
Смежные вопросы