jmap -permstat需要很长时间并且挂起

时间:2014-08-20 07:00:07

标签: jvm out-of-memory

我们开始看到' 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还有其他替代品吗?这样我就可以快速获得烫发统计数据

2 个答案:

答案 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)

  1. 您可以设置JVM args:-XX:+HeapDumpOnOutOfMemoryError,以在oom出现时获取.hprof文件,然后使用mat分析重复的加载类。

  2. 我已经用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);
    }
}