[讨论] MemoryPoolStat中的疑问

caoxudong818 2012-05-04

最近看在openjdk的中jconsole的源代码时,有处疑问,望各位指点。版本是openjdk-7-fcs-src-b147-27_jun_2011。

 

类MemoryPoolStat中有2个成员变量,beforeGcUsage和afterGcUsage,用来表示GC前后内存使用,但在其getter方法中,返回的却都是beforeGcUsage。

/**
     * Returns the memory usage before the most recent GC started.
     * null if no GC occurs.
     */
    public MemoryUsage getBeforeGcUsage() {
        return beforeGcUsage;
    }

    /**
     * Returns the memory usage after the most recent GC finished.
     * null if no GC occurs.
     */
    public MemoryUsage getAfterGcUsage() {
        return beforeGcUsage;
    }

 

但搜索MemoryPoolStat的话,与其相关的代码只有:

public MemoryPoolStat getStat() throws java.io.IOException {
        long usageThreshold = (pool.isUsageThresholdSupported()
                                  ? pool.getUsageThreshold()
                                  : -1);
        long collectThreshold = (pool.isCollectionUsageThresholdSupported()
                                  ? pool.getCollectionUsageThreshold()
                                  : -1);
        long lastGcStartTime = 0;
        long lastGcEndTime = 0;
        MemoryUsage beforeGcUsage = null;
        MemoryUsage afterGcUsage = null;
        long gcId = 0;
        if (lastGcInfo != null) {
            gcId = lastGcInfo.getId();
            lastGcStartTime = lastGcInfo.getStartTime();
            lastGcEndTime = lastGcInfo.getEndTime();
            beforeGcUsage = lastGcInfo.getMemoryUsageBeforeGc().get(poolName);
            afterGcUsage = lastGcInfo.getMemoryUsageAfterGc().get(poolName);
        }

        Set<Map.Entry<ObjectName,Long>> set = gcMBeans.entrySet();
        for (Map.Entry<ObjectName,Long> e : set) {
            GarbageCollectorMXBean gc =
                client.getMXBean(e.getKey(),
                                 com.sun.management.GarbageCollectorMXBean.class);
            Long gcCount = e.getValue();
            Long newCount = gc.getCollectionCount();
            if (newCount > gcCount) {
                gcMBeans.put(e.getKey(), new Long(newCount));
                lastGcInfo = gc.getLastGcInfo();
                if (lastGcInfo.getEndTime() > lastGcEndTime) {
                    gcId = lastGcInfo.getId();
                    lastGcStartTime = lastGcInfo.getStartTime();
                    lastGcEndTime = lastGcInfo.getEndTime();
                    beforeGcUsage = lastGcInfo.getMemoryUsageBeforeGc().get(poolName);
                    afterGcUsage = lastGcInfo.getMemoryUsageAfterGc().get(poolName);
                    assert(beforeGcUsage != null);
                    assert(afterGcUsage != null);
                }
            }
        }

        MemoryUsage usage = pool.getUsage();
        return new MemoryPoolStat(poolName,
                                  usageThreshold,
                                  usage,
                                  gcId,
                                  lastGcStartTime,
                                  lastGcEndTime,
                                  collectThreshold,
                                  beforeGcUsage,
                                  afterGcUsage);
    }

 

而却没有找到调用这个getStat方法的地方。

 

请问,MemoryPoolStat类和getStat方法是本来就没用么?还是说会在其他的jdk包中使用?

 

3q。

RednaxelaFX 2012-05-05
感觉是个bug。我也不太了解JConsole里的各proxy到底实际上有没有被用到。
刚看了下JDK8的最新版代码里也还是这样的。

请问你能先订阅这个邮件列表:http://mail.openjdk.java.net/mailman/listinfo/serviceability-dev
然后发邮件去提交这个补丁么?我去提交当然也可以,但毕竟这不是我发现的,还是本人去提交会比较合适一些。

diff -r 9e82ac15ab80 src/share/classes/sun/tools/jconsole/MemoryPoolStat.java
--- a/src/share/classes/sun/tools/jconsole/MemoryPoolStat.java	Thu Apr 26 14:07:12 2012 -0700
+++ b/src/share/classes/sun/tools/jconsole/MemoryPoolStat.java	Sat May 05 16:33:46 2012 +0800
@@ -129,6 +129,6 @@
      * null if no GC occurs.
      */
     public MemoryUsage getAfterGcUsage() {
-        return beforeGcUsage;
+        return afterGcUsage;
     }
 }
caoxudong818 2012-05-05
感谢R大的回复。

订阅了邮件列表,但不知该如何提交这个patch。好吧,我是很挫。

烦请R大提交一下,我也顺便学习一下该如何整。

3q。
RednaxelaFX 2012-05-05
就发一封邮件到那个邮件列表的地址,标题“typo in JConsole's MemoryPoolStat.getAfterGcUsage()”,内容大致上先打问候语,然后“I've found a typo in JConsole's MemoryPoolStat.getAfterGcUsage(), which is returning the wrong field. Here's a patch to fix it:”然后直接带上上面那个diff文件,最后结束的问候语和名字,完成。

这个程度的patch不签署OCA也应该可以提交。就这样就OK了。
caoxudong818 2012-05-05
3q,感谢R大提醒。
RednaxelaFX 2012-05-05
caoxudong818 写道
3q,感谢R大提醒。

不用谢~ 看到你发的邮件了。等吧,这种东西等一两周没人理都是正常的。我有一个隔了三个月才有人管
caoxudong818 2012-05-05
RednaxelaFX 写道
caoxudong818 写道
3q,感谢R大提醒。

不用谢~ 看到你发的邮件了。等吧,这种东西等一两周没人理都是正常的。我有一个隔了三个月才有人管



,可以理解,本来也不是什么重要的问题。
Global site tag (gtag.js) - Google Analytics