如何衡量年轻一代收集的记忆总和?

时间:2010-06-01 09:17:38

标签: java garbage-collection

我想测量我的java应用程序中的内存分配数据,即所分配的所有对象的大小总和。由于对象分配是在年轻一代完成的,因此这似乎是正确的地方。

我知道jconsole并且我知道JMX bean但我找不到正确的变量......目前我们正在解析gc日志输出文件,但这很难。理想情况下,我们想通过JMX测量它......

如何获得此值?

查德威克评论后的其他信息:

我想知道我的应用程序使用了多少内存。这是在JBoss Appserver中运行的相当大的软件。每隔4周就有一个新版本的软件,我们需要比较旧版本和新版本之间的内存消耗。仅仅比较特定时间的老一代的当前价值是不够的。了解分配了多少/更少的内存非常有用。由于许多物体在年轻一代中被收集,我需要在那里测量它。

与此同时,我估计了这一点。我会将其作为答案发布。

谢谢, 烫发

6 个答案:

答案 0 :(得分:3)

答案 1 :(得分:2)

如果您使用的是Sun JDK,则可以使用-verbose:gc -Xloggc:gc.log启用GC日志记录并分析该文件。或者,如果您只是偶尔需要总金额,请通过Tagtraum获取GCViewer,这会计算您要查找的数字。

答案 2 :(得分:1)

Yourkit Profiler提供了有关内存使用情况的详细信息。在http://www.yourkit.com/download/index.jsp

有评估版

答案 3 :(得分:1)

我个人没有使用它,但你试过jmap吗?

-heap选项打印生成明智的堆使用情况。

它是一个与jdk捆绑在一起的工具,所以它是免费的,可能没有很多开销。

答案 4 :(得分:1)

这段代码怎么样,它给出了所有空间(eden,survivor,old& perm)中使用的字节总和,这几乎就是你的JVM实例使用的所有内存。

public static void main(String[] args) {
    for (GarbageCollectorMXBean bean : ManagementFactory.getGarbageCollectorMXBeans()) {
        if (bean instanceof com.sun.management.GarbageCollectorMXBean) {
            com.sun.management.GarbageCollectorMXBean internal = (com.sun.management.GarbageCollectorMXBean) bean;
            Runtime.getRuntime().gc();
            GcInfo gcInfo = internal.getLastGcInfo();
            for (Map.Entry<java.lang.String,java.lang.management.MemoryUsage> e : gcInfo.getMemoryUsageBeforeGc().entrySet()) {
                System.out.println(e.getKey() + ": " + e.getValue());
            }
        }
    }
}

答案 5 :(得分:1)

这是我对估算的看法。它基本上返回“年轻一代的数量x年轻一代的大小”的价值。它并不完美,但对我的用例非常有用。

public long getYoungGenAllocatedMB() {
  long youngMaxMemory;
  long youngUsedMemory;
  long youngCollectionCount;

  List<MemoryPoolMXBean> beans = ManagementFactory.getMemoryPoolMXBeans();
  for (MemoryPoolMXBean bean : beans) {
    if ("Par Eden Space".equals(bean.getName())) {
      MemoryUsage usage = bean.getUsage();
      youngMaxMemory = usage.getMax();
      youngUsedMemory = usage.getUsed();
      break;
    }
  }

  List<GarbageCollectorMXBean> gBeans = ManagementFactory.getGarbageCollectorMXBeans();
  for (GarbageCollectorMXBean bean : gBeans) {
    if ("ParNew".equals(bean.getName())) {
      youngCollectionCount = bean.getCollectionCount();
      break;
    }
  }

  return (youngCollectionCount * youngMaxMemory + youngUsedMemory) / 1024 / 1024;
}

感谢所有其他海报!

马塞尔