【问题标题】:Why would jmap -permstat report more than MaxPermSize bytes used?为什么 jmap -permstat 会报告超过 MaxPermSize 使用的字节数?
【发布时间】:2015-07-04 17:38:28
【问题描述】:

我获取了 JVM 的 jmap -permstat 输出(报告为版本 24.76-b04),它报告了以下总数:

总计 = 5190 76930 1031431696 N/A 活着=1,死亡=5189 N/A

这应该是条目数、使用此信息的类、用于元数据和活动信息的字节数。

现在,我想知道为什么它会报告 1031431696 bytes,当我使用 -XX:MaxPermSize=256m 启动我的 VM 时,它只差一个 Gigabyte。有人能解释一下这个数字是如何计算的吗?

不知道它是否相关,但这是使用 Rhino,大约 3k 条目为 DefiningClassLoaders。

【问题讨论】:

  • 检查这个工具:{JDK_PATH}\bin\jvisualvm.exe

标签: java jvm-hotspot permgen


【解决方案1】:

我查看了jmap -permstat 实现的代码。 bytes used 值是基于类加载器加载的不同类型数据(方法、字段、接口等)的大小的估计值。

对加载的类进行大小计算的顶级方法是sun.jvm.hotspot.tools.PermStat.computeSize

private long computeSize(InstanceKlass k) {
  long size = 0L;

  // the InstanceKlass object itself
  size += k.getObjectSize();

  // Constant pool
  ConstantPool cp = k.getConstants();
  size += cp.getObjectSize();
  size += objectSize(cp.getCache());
  size += objectSize(cp.getTags());

  // Interfaces
  size += arraySize(k.getLocalInterfaces());
  size += arraySize(k.getTransitiveInterfaces());

  // Inner classes
  size += objectSize(k.getInnerClasses());

  // Fields
  size += objectSize(k.getFields());

  // Methods
  ObjArray methods = k.getMethods();
  int nmethods = (int) methods.getLength();
  if (nmethods != 0L) {
     size += methods.getObjectSize();
     for (int i = 0; i < nmethods; ++i) {
        Method m = (Method) methods.getObjAt(i);
        size += m.getObjectSize();
        size += objectSize(m.getConstMethod());
     }
  }

  // MethodOrdering - an int array that records the original
  // ordering of methods in the class file
  size += arraySize(k.getMethodOrdering());

  return size;
}

我的猜测是,在您的情况下,这种估计非常失败。如果不结合应用程序中加载类的特征,详细检查 JVM 版本的对象大小计算,很难说出失败的原因。

另外,Troubleshooting Guide for Java SE 6 with HotSpot VM 提到该值是一​​个近似值。

底线,对字节使用值持保留态度。

【讨论】:

  • 对我来说已经足够了。由于 Rhino 类加载器只包含少数类(通常是一个类),我可能可以综合运行这些数字并找出哪里出错了。感谢您在代码中找到正确的位置!当我有时间在这里获得一些数字时,我会跟进更详细的解释。
猜你喜欢
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 2017-03-12
  • 2013-06-16
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
相关资源
最近更新 更多