PermGen での過剰なメモリ割り当てに関する問題があります。
このメモリ空間のサイズを監視する小さなコードを書いたところ、ほとんどのメソッドを実行するたびに、割り当てられたメモリのサイズが大きくなることに気付きました。私のアプリケーションにはグローバルオブジェクトがたくさんあるのではないでしょうか? PermGen でどのオブジェクトが割り当てられているかを知る方法はありますか? 現在、使用されているメモリのサイズしかわかりません。
これは私が書いたコードで、各メソッド呼び出しの後に実行されるアドバイスとして定義されています。
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.AfterReturning;
import java.util.Iterator;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryPoolMXBean;
@Aspect
public class PermGenStat {
static Long bytesPrecedenti = getUsedPermGenBytes();
private static Long getUsedPermGenBytes() {
Long bytes = 0L;
Iterator<MemoryPoolMXBean> iter = ManagementFactory.getMemoryPoolMXBeans().iterator();
while (iter.hasNext()) {
MemoryPoolMXBean item = (MemoryPoolMXBean) iter.next();
if (item.getName().equals("PS Perm Gen"))
bytes = item.getUsage().getUsed();
}
return bytes;
}
@AfterReturning (pointcut = "execution(* it.xxx.yyy.*.*.*.*(..))",
returning = "result")
public void afterReturning (JoinPoint joinPoint, Object result) {
if (joinPoint != null &&
joinPoint.getTarget() != null &&
joinPoint.getTarget().getClass() != null &&
joinPoint.getSignature() != null &&
joinPoint.getSignature().getName() != null) {
try {
Long bytes = getUsedPermGenBytes();
Long diff = bytes - bytesPrecedenti;
if (diff >= 1) {
System.out.println("Metodo: " + joinPoint.getTarget().getClass().toString().substring(6) + "." + joinPoint.getSignature().getName().toString());
System.out.println("PermGen (KB): " + Math.round((double)bytesPrecedenti / 1024) + " -> " +
Math.round((double)bytes / 1024) +
" [" + Math.round((double)diff / 1024) + "]");
}
bytesPrecedenti = bytes;
}
catch (Exception e) {
System.out.println("******************** Eccezione ********************");
System.out.println("Classe: PermGenStat - Metodo: afterReturning");
e.printStackTrace();
}
}
}
}
ありがとう