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 削除の主な作業は一段落したのかな。