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

Mar*_*cel 7 java garbage-collection

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

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

我怎样才能获得这个价值?

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

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

与此同时,我对此有一个估计.我会发布它作为答案.

谢谢,马塞尔

Mar*_*cel 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;
}
Run Code Online (Sandbox Code Playgroud)

感谢所有其他海报!

马塞尔