"Tenured Gen"と"PS Old Gen"

以前、JMXで書いたメモリ使用量の監視プログラムが、監視対象サーバを変えた途端、Exception を吐いて死亡。えええ。

JMXServiceURL url = new JMXServiceURL("service:jmx:rmi:///jndi/rmi://myserver:1234/jmxrmi");
JMXConnector conn = JMXConnectorFactory.connect(url);
MBeanServerConnection mbsc = conn.getMBeanServerConnection();

MemoryPoolMXBean mpbean = (MemoryPoolMXBean) ManagementFactory.newPlatformMXBeanProxy(mbsc, "java.lang:type=MemoryPool,name=Tenured Gen", MemoryPoolMXBean.class);

んで、エラー。

Exception in thread "main" java.lang.IllegalArgumentException: java.lang:type=MemoryPool,name=Tenured Gen not found in the connection.
at java.lang.management.ManagementFactory.newPlatformMXBeanProxy(Unknown Source)
...

「そんな ObjectName のMBean はコネクションに無いよ」とか言っちゃっているので、どんなもんがリストされているか確認。

ObjectName oName;
Set names = mbsc.queryNames(null, null);
for (Iterator it = names.iterator(); it.hasNext();) {
    objectName = (ObjectName) it.next();
    System.out.println("ObjectName: " + objectName );
}

そして、暴かれた驚愕の事実。

...
ObjectName: java.lang:type=MemoryPool,name=PS Old Gen
...

Old領域を表す名前が、「Tenured Gen」じゃなくて、「PS Old Gen」になっている。書き直してコンパイルしたら、無事に動作してくれた。ふう。

どうやらJVMが採用するGC方式によって、ここの名前が変わるみたい。JVM1.5系だと、マルチプロセッサ環境では、パラレルGC方式に自動的にスイッチされる。賢い仕様なのだけど、こんなとこにも影響が出るとは。

ということで、環境に応じて適切なプール名称を指定する方法を考えねば…。

ところで、PS Old Gen の 「PS」 って何だろう。

  • Parallel Serial
  • Parallel Switch
  • Parallel Sweep

適当にいくつか思いついたけど、よく分からず。知っている方がいたら、教えてください。ボケてもOKです。(プレイステーション以外で)

このエントリーのトラックバックURL
http://www.deftrash.com/admin/mt4/mt-tb.cgi/423
龍 at 2012年5月21日 14:56

英語サイトを見ると載っています。
http://chaoticjava.com/posts/parallel-and-concurrent-garbage-collectors/

です。