OpenJDK build on CentOS6 and perm gen removal

ちょっと前に入れた CentOS で OpenJDK のビルドを確認。
mercurial 1.4-3.el6 と cups development environment のパッケージを加えただけで行けた。

(cd to work dir)
$ hg clone http://hg.openjdk.java.net/jdk7u/jdk7u-dev
$ cd jdk7u-dev/

get_source.sh を使えば fclone 拡張は必要ない。

$ sh get_source.sh 
 # Repos:  corba jaxp jaxws langtools jdk hotspot 
 Starting on corba
 Starting on jaxp
 :

あとは LANG=C にして、make するだけ。

$ LANG=C
$ make ALLOW_DOWNLOADS=true ALT_BOOTDIR=/usr/java/jdk1.7.0_04 

build 中に使用する bootstrap JVM には /usr/java/jdk1.7.0_04 に Oracle/Sun JDK がインストールしてあったので、そこを ALT_BOOTDIE にセットしておく。ALLOW_DOWNLOADS は jaxp などビルド中にダウンロードが必要なときは自動的にやっていいよという指定。

PermGen をなくして、native heap を使うようにする 6964458 で最近(といっても9月1日か)大きな変更があった。これで Perm はなくなったらしい。

Changeset: da91efe96a93
Author:    coleenp
Date:      2012-09-01 13:25 -0400
URL:       http://hg.openjdk.java.net/hsx/hsx25/hotspot/rev/da91efe96a93

6964458: Reimplement class meta-data storage to use native memory
Summary: Remove PermGen, allocate meta-data in metaspace linked to class loaders, rewrite GC walking, rewrite and rename metadata to be C++ classes
...

! agent/doc/clhsdb.html
! agent/src/os/bsd/ps_core.c
! agent/src/os/linux/ps_core.c
! agent/src/os/solaris/proc/saproc.cpp
! agent/src/share/classes/sun/jvm/hotspot/CommandProcessor.java
! agent/src/share/classes/sun/jvm/hotspot/HSDB.java
! agent/src/share/classes/sun/jvm/hotspot/HotSpotTypeDataBase.java
 - agent/src/share/classes/sun/jvm/hotspot/ci/ciArrayKlassKlass.java
 + agent/src/share/classes/sun/jvm/hotspot/ci/ciBaseObject.java
:

JDK8 は既にそうなってるかと推測してやってみたが、まだのようだった。9/17 日の時点で jdk8 のブランチの hotspot のバージョンは hs24 だった。

$ hg clone http://hg.openjdk.java.net/jdk8/jdk8

6964458 のチェックインログから hsx25 に入っているので、hsx25 をビルドしてみる。

$ hg clone http://hg.openjdk.java.net/hsx/hsx25/hotspot/
$ cd hotspot/make
$ make ALLOW_DOWNLOADS=true ALT_BOOTDIR=/usr/java/jdk1.7.0_04 LP64=1

hotspot/make でビルドすると 32/64, product/fastdebug 両方を作ろうとする。使用した環境では 32-bit 様のヘッダが不十分なようなので、LP64=1 で 64-bit に限定。

なお、clone もとを http://hg.openjdk.java.net/hsx/hsx25 にすると、tool & libraries も落ちてきて、なおかつビルドできなかった。

出来上がった libjvm.so を上で作っておいた jdk8 の jdk-image の中にあるものと置き換える。
そうして、heap generation の一覧を出すような操作 (-XX:+PringGCDetails をつけておいて Ctrl-\) すると generation の部分の出力は次のようになっていた。

Heap
 def new generation   total 7488K, used 407K [0x00000000e7600000, 0x00000000e7e20000, 0x00000000ef8a0000)
  eden space 6656K,   6% used [0x00000000e7600000, 0x00000000e7665df8, 0x00000000e7c80000)
  from space 832K,   0% used [0x00000000e7c80000, 0x00000000e7c80000, 0x00000000e7d50000)
  to   space 832K,   0% used [0x00000000e7d50000, 0x00000000e7d50000, 0x00000000e7e20000)
 tenured generation   total 16704K, used 0K [0x00000000ef8a0000, 0x00000000f08f0000, 0x00000000ffe00000)
   the space 16704K,   0% used [0x00000000ef8a0000, 0x00000000ef8a0000, 0x00000000ef8a0200, 0x00000000f08f0000)
 Metaspace total 3400K, used 2851K, reserved 8192K
  data space     3076K, used 2588K, reserved 6144K
  class space    324K, used 263K, reserved 2048K

Perm の代わりに Metaspace として表示されている。不具合はそれなりに出るかもしれないけど、これで Perm Gen 削除の主な作業は一段落したのかな。