Oracleが最近リリースした Java 6 update 21 には、 java.dll
を作成する際に、小さな,しかし無害な変更 があった。不幸にも、この変更は、 Eclipseの起動に影響を及ぼし、かつてSunの元で開発された NetBeansではなく、 Eclipseに問題をもたらした。
変更は、dll
の作成の際に、COMPANY_NAME=Sun Microsystems, Inc.
をCOMPANY_NAME=Oracle Corporation
に置き換えたのである。不幸にも、 Eclipseは、DLLの名前を使って、非標準の-XX:MaxPermSize
を追加するのが安全かどうかを判定している。そのフラッグが存在して、サポートされていないと、あるJVMは、Eclipse のスタートアップ ファイル (eclipse.ini)に、-XX:MaxPermSize
を書かないで、起動に失敗するので、新しい引数、 --launcher.XXMaxPermSize 256m
が許され、そしてもし、 Windowsで実行可能なランチャーがSunのVMを検知したら、-XX:MaxPermSize=256m
を自動的に追加する。
この自動検知は、VMではなく、Cで書かれたランチャー部分(eclipse.exe
) で行っている-VMは、一旦走れば、そのプロパティを変更することはできない。これを早い(そして臆せず言えば、汚い)方法でやるために、eclipse.exe
ランチャーは、そのフラッグを追加できるか,判断するのに 文字列 Sun Microsystems
を探す。
こうして、この変更が Eclipseランチャーのプロセスを破綻させた;そしてOutOfMemoryError
を起動時に起こす。これは、即座に Eclipseに報告され 、更に、Oracleにエスカレートされ 、修正された。
このブランドの変更は、Oracleの権利だが(リリースノートに載せるにも値しないものだったろう)、それがEclipse に影響した-現行のバージョン3.6ばかりでなく、 3.5, 3.4 あるいは 3.3をベースにしたIDEやRCPにもである。( Eclipse側で)これを修正するには、修正の順序を調整する必要がある;最新版に当てるEclipseランチャー用のパッチ がある。しかし互換性を保証するためには、最低でもEclipse 3.5 そしてたぶん3.4にも適用できるように、作り直す必要があるかもしれない。
Oracleが、この問題に早く対処したことは、誉められていい。彼らはこの問題を解決する必要はなかったが、数日で直した。その後、次のJavaのビルドにも修正が入る。( 6u21 が再ビルドされるのか 6u22になるのかは、わからない。)それまでは、 Eclipse で問題を経験し、最近 Java 6u21をインストールした(あるいは,自動的にアップデートした)なら、 Java 6u20にダウングレードするか FAQに従って、PermGenサイズを再有効化すればよい。