2012-03-27 6 views
9

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

Как распечатать наиболее релевантные фрагменты информации об использовании памяти с помощью java?

ответ

10

Вот отрывок из куска кода мы имеем, что периодически регистрирует использование памяти нашего приложения:

import java.lang.management.GarbageCollectorMXBean 
import java.lang.management.ManagementFactory 
import java.lang.management.MemoryPoolMXBean 
import java.lang.management.MemoryUsage 

ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); 
log("Heap", ManagementFactory.getMemoryMXBean().getHeapMemoryUsage()); 
log("NonHeap", ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage()); 
List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans(); 
for (MemoryPoolMXBean bean: beans) { 
    log(bean.getName(), bean.getUsage()); 
} 

for (GarbageCollectorMXBean bean: ManagementFactory.getGarbageCollectorMXBeans()) { 
    log(bean.getName(), bean.getCollectionCount(), bean.getCollectionTime()); 
} 
1

Вы можете попробовать VisualVM, профайлер Java, который идет с каждым JDK. Вы найдете его в папке «bin».

+0

Я знаю VisualVM и использовал его, когда я активно отлаживаю проблему, как это происходит. Но некоторые проблемы возникают во время ночных прогонов, что означает, что мне нужно занести их куда-нибудь, чтобы обработать их позже. Я мог бы, конечно, оставить приложение VisualVM открытым на ночь, но это не совсем долгое решение, которое я ищу, поскольку журналы являются постоянными и доступны всем пользователям системы и не привязаны к моему компьютеру :) –

Смежные вопросы