我们开始看到' java.lang.OutOfMemoryError:PermGen space'。为了找到烫发空间中的内容,尝试运行
' /usr/j2sdk1.6.0_13/bin/jmap-permstat 20476 -J-mx1280m> /tmp/permstats20476.txt&'
这个命令需要花费很长时间.....在它之间给出了以下异常:
查找类加载器实例..252829实习生字符串占用30781792字节。 使用Printezis位查找对象大小并跳过... 使用Printezis位查找对象大小并跳过... 使用Printezis位查找对象大小并跳过... 使用Printezis位查找对象大小并跳过...
完成。 计算每个装载机stat ..done。 请稍等..计算活跃度...................线程中的异常"线程-1" java.lang.OutOfMemoryError:超出了GC开销限制 at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.readBytesFromProcess0(Native Method) at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access $ 1000(LinuxDebuggerLocal.java:51) at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal $ 1ReadBytesFromProcessTask.doit(LinuxDebuggerLocal.java:558) at sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal $ LinuxDebuggerLocalWorkerThread.run(LinuxDebuggerLocal.java:127)
但它没有完成......
[svcmig2 @ app430~] $ uname -a Linux app430 ... 2.6.18-194.el5#1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU / Linux
jmap还有其他替代品吗?这样我就可以快速获得烫发统计数据
答案 0 :(得分:2)
jmap还有其他替代品吗?这样我就可以快速获得烫发统计数据
你可以自己制作一个!借助Serviceability Agent,这非常容易。
以下是您案例的示例:
import sun.jvm.hotspot.memory.*;
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.tools.Tool;
public class PermTool extends Tool {
@Override
public void run() {
// Show PermGen object histogram
ObjectHistogram histo = new ObjectHistogram();
VM.getVM().getObjectHeap().iteratePerm(histo);
histo.print();
// List all classes in PermGen with their ClassLoaders
VM.getVM().getObjectHeap().iteratePerm(new DefaultHeapVisitor() {
@Override
public boolean doObj(Oop obj) {
if (obj instanceof InstanceKlass) {
obj.printValue();
Oop loader = ((InstanceKlass) obj).getClassLoader();
if (loader == null) {
System.out.println(" -- loaded by Bootstrap ClassLoader");
} else {
System.out.print(" -- loaded by ");
loader.printValue();
System.out.println();
}
}
return false;
}
});
}
public static void main(String[] args) {
new PermTool().start(args);
}
}
使用与目标进程相同的JDK编译并运行它
确保jdk/lib/sa-jdi.jar
在CLASSPATH上。
答案 1 :(得分:1)
您可以设置JVM args:-XX:+HeapDumpOnOutOfMemoryError
,以在oom出现时获取.hprof文件,然后使用mat分析重复的加载类。
我已经用SA编写了一个工具类来回答您的问题。我的JDK版本是1.8.0_151。
这里是源代码:
import sun.jvm.hotspot.oops.*;
import sun.jvm.hotspot.runtime.*;
import sun.jvm.hotspot.tools.Tool;
/**
* @author duqi
* @createTime 2018/9/1 下午11:55
**/
public class PermTool extends Tool {
@Override
public void run() {
// Show PermGen object histogram
ObjectHistogram histo = new ObjectHistogram();
VM.getVM().getObjectHeap().iterate(histo);
histo.print();
// List all classes in PermGen with their ClassLoaders
VM.getVM().getObjectHeap().iterate(new DefaultHeapVisitor() {
@Override
public boolean doObj(Oop obj) {
if (obj.getKlass() instanceof InstanceKlass) {
obj.printValue();
Oop loader = ((InstanceKlass) obj.getKlass()).getClassLoader();
if (loader == null) {
System.out.println(" -- loaded by Bootstrap ClassLoader");
} else {
System.out.print(" -- loaded by ");
loader.printValue();
System.out.println();
}
}
return false;
}
});
}
public static void main(String[] args) {
new PermTool().execute(args);
}
}