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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jmap -permstat需要很长时间并且挂起相关的知识,希望对你有一定的参考价值。

我们开始看到'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。请稍等..计算活跃度...................线程“Thread-1”中的异常java.lang.OutOfMemoryError:sun.jvm.hotspot超出了GC开销限制。 sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal.access $ 1000(LinuxDebuggerLocal.java:51)sun.jvm.hotspot.debugger.linux.LinuxDebuggerLocal $ 1ReadBytesFromProcessTask.doit(调试器.linux.LinuxDebuggerLocal.readBytesFromProcess0(本地方法) 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

有没有其他替代nmap?这样我就可以快速获得烫发统计数据

答案

有没有其他替代nmap?这样我就可以快速获得烫发统计数据

你可以自己做一个!在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. 您可以设置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);
    }
}

以上是关于jmap -permstat需要很长时间并且挂起的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Java虚拟机——Java内存映像工具(Jmap)

jmap查看内存使用情况与生成heapdump

执行 jmap -heap 选项时 JVM 是不是停止?

问题排查-jmap和MAT工具

jmap 的一次使用经历

jmap命令详解