この章では、Oracle JRockit JDK R28で解決済の問題を示します。
この章の内容は次のとおりです。
Oracle JRockit JDK R28.3.6で修正された問題を次に示します。
javac
を使用してコンパイルしたJavaアプリケーションを("-g
"オプションを使用して)デバッグ・モードで実行すると、JVMがクラッシュすることがあります。これは、JVMの起動時に-Xdebug
または-XX:+JavaDebug
オプションを指定した場合に発生します。Oracle javac
によって生成された一部のクラス・ファイル内の不正なデバッグ情報がこの問題の原因です。
この問題はOracle JRockit JDK R28.3.6で修正されました。アップグレード後、修正版のjavac
を使用してクラスを再コンパイルしてください。
以前のバージョンのJRockitは、JVM Tool Interface (JVM TI)またはjava.lang.instrument
インタフェース(-javaagent
起動パラメータ)を使用して実行時にクラスを再定義した後、クラッシュしたり、その他の安定性の問題が発生したりすることがあります。
この問題は解決されました。
Oracle JRockit JDK R28.3.5で修正された問題を次に示します。
以前のバージョンのJRockit R28は、総称型を使用するJavaメソッドを正しくインストゥルメントできませんでした。このため、JMXMAPIプロファイリングAPIまたはJRockit Mission Controlコンソールのプロファイラでそのようなメソッドをプロファイリングできませんでした。
この問題は解決されました。
StringBuffer/StringBuilderをループで使用する際に不正なコード最適化によりJRockitがクラッシュするという問題が修正されました。この問題は、圧縮参照を使用して実行する場合にのみ発生していました。
Oracle JRockit JDK R28.3.4で修正された問題を次に示します。
各種コマンドライン・ツール(jps
、jrcmd
、jstat
など)の呼出し中にJRockit JVMに渡されるデフォルト・オプションが変更され、必要なネイティブ・メモリーの量が減少しました。
非常に大きな配列をコピーする際、一部のコピーについて要素数単位の配列サイズ(オフセット)がバイト数単位の配列サイズに変換されることがあり、その結果として32ビット整数のサイズがオーバーフローし、コピーが正しく終了しなかったり、まれにJVMがクラッシュするなどの状況を引き起こしていました。
この問題は解決されました。
Oracle JRockit JDK R28.3.2で修正された問題を次に示します。
以前のバージョンのJRockit R28では、デフォルト記録またはディスクへのバッファリング(あるいはその両方)を、-XX:FlightRecorderOptions
コマンドライン・オプションを使用して有効にした場合に、-XX:StartFlightRecording
オプションを使用して新規記録を開始すると、JRockitが起動時に無期限にハングすることがありました。コマンドライン・オプションおよびパラメータの詳細は、Oracle JRockitコマンドライン・リファレンスを参照してください。
この問題は解決されました。
以前のバージョンのJRockitでは、SPARCプラットフォームで-XX:+|-CheckStacksオプションの値が無視されていました。
この問題は解決されました。JRockit R28.3.2では、-XX:+|-CheckStacksオプションは正しく実装されています。
特定の状況で、暗黙的または明示的なボックス化操作がメソッドによって呼び出されると、そのメソッドからNullPointerExceptionがスローされていました。コードの最適化に問題があり、それがこの例外の原因になっていました。
この問題は解決されました。
Oracle JRockit JDK R28.3.1で修正された問題を次に示します。
Oracle JRockit JDK R28.2.9で修正された問題を次に示します。
JVMフラグ-XX:+HeapDumpOnOutOfMemoryError
を使用している場合、OutOfMemoryErrorのhprofダンプを作成する際にJVMでデッドロックが発生することがありました。
この問題は解決されました。
以前のバージョンのJRockit R28では、失敗した割当てのサイズとしてネイティブOutOfMemoryErrorメッセージに示される値が正しくないことがあります。
この問題は解決されました。
Oracle JRockit JDK R28.2.8で修正された問題を次に示します。
JRockitリリースR28.2.6およびR28.2.7では、Package.getPackages
を呼び出すと、まれにPackage.defineSystemPackage
でNullPointerExceptionが発生するという既知の問題があります。この問題は解決されました。
VMの起動時にクラスのロードとクラスのシリアライズとの間で競合が発生し、java.lang
パッケージのClass.isAssignable
からNullPointerExceptionがスローされることがありました。この問題は解決されました。
特定の状況で、cgGetColorForVarInBlock
メソッドでのコードの最適化中にJRockitがクラッシュすることがあります。この問題は解決されました。
Oracle JRockit JDK R28.2.6で修正された問題を次に示します。
カスタム.jfsファイルで特定の設定を使用する際、maxsize
設定で制限されている場合でも、状況によってはOracle JRockitフライト・レコーダのリポジトリが無限に増大することがありました。これは修正済です。
(JAXBを使用するなどの方法で)クラスを動的に作成するアプリケーションが、内部参照のカウントの問題により、ネイティブ・メモリー不足、クラッシュまたはその他の予期しない動作を示すことがありました。この問題は最終的にメモリーの破損や、使用されていないクラス名文字列が参照元クラスのアンロード後も蓄積される原因となります。これは修正済です。
以前のバージョンのJMXMAPIプロファイリングAPIでは、同じ名前を持つクラスの単一インスタンスしかプロファイリングできませんでした。複数のクラス・ローダーが同じクラスをロードした場合、そのクラスの一方のバージョンのみがインストゥルメントされました。現在では、1つのクラスのすべてのバージョン(同じ完全修飾クラス名を持つ)がインストゥルメントされます。この変更は、JRockit Mission Controlコンソールのプロファイリング機能にも影響を与えます(JFRプロファイリングへの影響はありません)。
Oracle JRockit JDK R28.2.5で修正された問題を次に示します。
複数のスレッドから共有リソースを操作中にJRockitがクラッシュすることがまれにありました。主に、Java文字列を複数のスレッドから同時にインターンする場合です。この問題は修正されました。
optfileでコンパイラ・ディレクティブを使用する場合、JRockit JVMがクラッシュすることがまれにありました。この問題は修正されました。
JRockitの以前のバージョン(R28.0.0からR28.2.4まで)では、標準入力ストリームがパイプで、それがアプリケーションによってクローズされた場合、続けて他のFileInputStreamを読み取ろうとすると、誤ってFileNotFoundException
エラーが発生することがありました。この問題は修正されました。
特定の状況で、NIOソケットのクローズ中にJRockitがハングしていました。この問題は修正されました。
WindowsでSecurityManagerを使用する場合、AccessControlException
が発生し、特定のNIO操作が失敗していました。この問題は修正されました。
以前のバージョンのJRockitでは、フライト・レコーダが無効になっているJRockitインスタンスでの実行中にアプリケーションがフライト・レコーダAPIを使用しようとすると、java.lang.Error
がスローされていました。この動作は、かわりにjava.lang.IllegalStateException
がスローされるように変更されました。例外に新しい説明テキストも追加されています。
com.sun.management
拡張の実装が不完全なため、long [] com.sun.management.getThreadCpuTime(long[] ids)
メソッドで不正なメモリー・アクセスが発生し、JRockitがクラッシュします。
Oracle JRockit R28.2.5では、ThreadMXBean.getThreadCpuTime()
の配列版が実装されています。この問題は解決されました。
Oracle JRockit JDK R28.2.4で修正された問題を次に示します。
JRockit R28.2.3で、"stop"文がjrcmdコマンドで無視されるというリグレッションが生じていました。この問題は修正されました。
以前のバージョンのJRockitでは、1GBを超えるページ・サイズを使用する際に、誤った圧縮参照サイズを選択してSolarisでの起動に失敗することがありました。この問題は修正されました。
print_memusage
コマンドのlevel
引数の値が無効な場合に、アサーション・エラーが発生してターゲットJVMが終了することがありました。
この問題はR28.2.4で修正されました。エラー・メッセージが表示され、ターゲットJVMには影響を与えません。
Oracle JRockit JDK R28.2.3で修正された問題を次に示します。
以前のバージョンのJRockitでは、jrcmd
コマンドが、set_filename
診断コマンドで指定されたファイルに出力をリダイレクトしていませんでした。JRockit R28.2.3では、set_filename
コマンドで出力ファイルが指定されている場合、jrcmd
によって呼び出された診断コマンドの出力は、コントロール・ブレーク・ハンドラ(SIGQUIT
)で実行する診断コマンドによって出力がリダイレクトされる場合と同様にファイルにリダイレクトされます。
デフォルトでは、jrcmd
によって呼び出された診断コマンドの出力は、jrcmd
プロセスのSTDOUT
出力ストリームに送られます。set_filename
コマンドのデフォルト動作をリセットするには、filename
引数の値を指定せずにコマンドを実行します。詳細は、Oracle JRockitコマンドライン・リファレンスの診断コマンドに関する項を参照してください。
以前のリリースのJRockitでは、jrcmd
コマンドに、-f
オプションを使用して渡されるファイルのサイズは最大256バイトという制限がありました。JRockit 28.2.3以降では、ファイル・サイズは無制限ですが、ファイルの各行が256バイトに制限されます。
JRockit R28.2.0で生じたリグレッションにより、特定のプラットフォームでvmsiReserve
メソッドの実行中にJRockitがクラッシュすることがありました。この問題は修正されました。
JRockitが特定の状況でスタック・オーバーフロー時にクラッシュし、独自のシグナル・ハンドラを実行する領域が不足しているために、StackOverflowErrorがスローされるのではなくプロセスが中断されることがありました。この問題は修正されました。
メソッド(java/util/regex
パッケージのメソッドであることが多い)を最適化する際に、JRockitがクラッシュすることがまれにありました。この問題は修正されました。
JRockitの実行中にハード・ドライブからフライト・レコーダのリポジトリが削除されると、プロセスが無期限にハングしていました。この問題は修正されました。
Oracle JRockit JDK R28.2.2で修正された問題を次に示します。
Java SE 6 Update 29でのリグレッションにより、TLS_DH_anon_WITH_AES_128_CBC_SHA
暗号スイートの使用中にSSL接続が失敗していました。この問題は修正されました。
文字列追加の最適化におけるバグにより、特にガベージ・コレクション中にJRockit JVMがクラッシュすることがありました。この問題は修正されました。
バージョンR28.0.0からR28.2.1までのJRockitでは、一部のファイナライザがまったく呼び出されないことがあります。JRockitではファイナライザを内部的に使用してクラスの定数プール・データを管理しているため、これが原因でデータが破損し、JVMのクラッシュやその他の予期しない動作を引き起こす場合がありました。この問題は修正されました。
Oracle JRockit JDK R28.1.5で修正された問題を次に示します。
64-bitプラットフォームでは、JRockitでJavaヒープの低アドレス空間(4GB)の領域が不足し、クラスの割当て時にOutofMemory
エラーが発生することがあります。
このエラーを回避するには、次のように-XX:InitialClassBlockMemory
オプションを使用して、JVM起動中に4GBの低ヒープでメモリーを確保します。
-XX:+UnlockDiagnosticVMOptions -XX:InitialClassBlockMemory=100M
-XXgcThreads
オプションで指定するガベージ コレクション・スレッドのデフォルト値は、マシンのコアおよびハードウェア・スレッドの数に基づいていました。
ガベージ・コレクションのヒューリスティックが改善され、ガベージ・コレクション・スレッドの数が動的に選択されるようになりました。大きなマルチコア・マシンでは、オーバーヘッドを減らすために、より保守的なガベージ・コレクション・スレッド数が動的に選択されるようになります。
Javaライブラリに対してSUIDまたはSGIDを設定しない場合、有効なユーザーが実際のユーザーと同じになりませんでした。また、JRockit JVMを起動できませんでした。
この問題は修正されました。
Oracle JRockit JDK R28.1.4で修正された問題を次に示します。
WindowsでJava関連のシンボリック・リンクを起動すると、Oracle JRockitで次のような警告が出力されることがありました。
[WARN ][osal ] Could not add counter \Virtual Bytes for query [WARN ][osal ] Failed to init virtual size counter.
これは修正済です。
Oracle JRockitがOutOfMemoryErrorでHPROFをダンプするように構成されている場合、複数のスレッド内で複数の同時OutOfMemoryErrorを受信すると、結果のHPROFファイルが破損していることがありました。これは修正済です。
Oracle JRockit JDK R28.1.3で修正された問題を次に示します。
カスタム・ファイル・プロトコル・ハンドラが設定されている場合、クラス・ローダーでデッドロックが発生することがありました。これは修正されました。この修正により、Sunバグ7001933が解決されます。
例外javax.net.ssl.SSLPeerUnverifiedException: peer not authenticated
が予期せずスローされていました。これは修正されました。この修正により、Sunバグ6924489が解決されます。
Solaris 11では、カーネル・パラメータが変更された場合、SO_RCVBUF/SO_SNDBUF
をtcp_max_buf
よりも大きい値に設定すると成功しませんでした。これは修正されました。この修正により、Sunバグ6984182が解決されます。
読取り専用のbytebufferをチャネル書込みメソッドに渡すと、java.nio.ReadOnlyByteBufferException
がスローされることがありました。これは修正済です。
JNI API Get<PrimitiveType>ArrayElements
ルーチンでは、コピーを返すときにisCopy
パラメータが正しくJNI_TRUE
に設定されませんでした。これは修正済です。
32-bit JRockitのインスタンスで、メソッドが不適切に最適化されて、0になるはずのlong値が非常に大きくなることがまれにありました。これは修正済です。
Oracle JRockit JDK R28.1.1で修正された問題を次に示します。
以前は、ナーサリなしでコンカレント・スイープを実行中に、Oracle JRockitがJNIから最小スレッドのローカル・エリア・サイズと一致するサイズのオブジェクトを割り当てようとしてクラッシュすることがありました。これは修正済です。
R28.0.0以降のバージョンで、たとえば、コマンドライン・オプションを「-X:MaximumNurseryPercentage=80
」のように(XX
とすべきところをX
に)スペルミスすると、何のメッセージもなく終了します。これはR28.1.1で修正済です。
まれに、Oracle JRockitは、ソース配列をターゲット配列として再び使用するように、arraycopy
を誤って最適化することがあります。その結果、arraycopy
の後でソース配列から誤った値が読み出されます。これは修正済です。
SecureRandom.generateSeed
が呼び出されると、JDKはエントロピー・プールから常に8192バイトを読み出していました。JDKはリクエストされたバイト数のみを読み出すように変更されています。詳細は、次を参照してください。
オプティマイザによりinstanceof opcode
の動作が誤って変更され、instanceof
チェックが失敗する場合がありました。これは修正済です。
Oracle JRockit JDK R28.1.0で修正された問題を次に示します。
CA Wily Introscopeなどのアプリケーション管理ソリューションを使用してOracle WebLogic Serverを起動した場合、Oracle JRockitが起動時にハングしていました。
この問題はJRockit R28.1.0で修正されました。
JDK 6のJMX実装で、メモリー・リークが発生していました。この問題は、JDK 6 Update 22でSunにより修正されました。
この修正は、JRockit R28.1.0に含まれています。
-XX:+|-ExitOnOutOfMemoryError
オプションが有効な場合、コンパイラ・メモリーの制限のために最適化が中断されると、JRockitが終了していました。
この問題はJRockit R28.1.0で修正されました。
ヒープ・サイズが2GB以上のとき、Eclipse Memory Analyzer (MAT)では解析できないセグメント化されたヒープ・ダンプが作成されていました。
この問題はJRockit R28.1.0で修正されました。
クラス・リフレクション機能を使用してメソッドを呼び出すと、Method.invoke()
メソッドのシグネチャとは異なる例外タイプがスローされる場合がありました。
この問題はJRockit R28.1.0で修正されました。リフレクションを使用してメソッドを呼び出したとき、適切なInvocationTargetException
タイプがスローされます。
Oracle JRockit JDK R28.0.2で修正された問題を次に示します。
一部のSolarisマシンで、Oracle JRockitが警告を出力して起動に時間がかかりました。例:
[WARN ][osal ] Failed to initialize kstat for CPU 0, ignoring
この問題はリリースR28.0.2で修正されました。
java/lang/IOException
クラスを検索しようとすると、epollのソケットの多重監視からのIO例外によりNoClassDefFoundErrorがスローされることがありました。この問題はリリースR28.0.2で修正されました。
廃止されたコードへの参照のプルーニング中に、Oracle JRockitがCode_and_classgc_background_task
でクラッシュすることがありました。この問題はリリースR28.0.2で修正されました。
以前のOracle JRockitリリースでは、2GBを超えるJARまたはZIPファイルを開くことができませんでした。この問題はリリースR28.0.2で修正されました。
JDK 1.6.0_18で検出された機能後退を修正するためにXalanおよびXercesバージョンが更新されました。この修正は、Oracle JRockit R28.0.2 JVMに含まれています。
Oracle JRockit JDK R28.0.1で修正された問題を次に示します。
コンパイラ制御ディレクティブ・ファイルでUTF8以外の文字が検出されると、JVMがクラッシュします。
この問題はR28.0.1で修正されました。
try-catch句を含む特定のケースで、NULLチェックが不適切に最適化または常に失敗とみなされます。
この問題はR28.0.1で修正されました。
Linuxシステムで、LD_PRELOAD=libjsig.so
環境変数を使用してlibjsig.so
(シグナル・チェーン・ライブラリ)のプリロードを設定すると、JVMが起動時にクラッシュします。このため、一部のサードパーティJNIライブラリをOracle JRockit R28で使用できません。この問題のパッチをダウンロードする場合は、JDK 6ではパッチID 9586671、JDK 5ではパッチID 9672120を参照してください。
この問題はR28.0.1で修正されました。
特定のケースで、net.dll
をロードした後にnio.dll
をロードしないと、NIOセレクタ機能が失敗します。これはJAVA_HOME\jre\bin\java
ではなく、JAVA_HOME\bin\java
を使用した場合にのみ発生します。この問題のパッチをダウンロードする場合は、JDK 6ではパッチID 9586671、JDK 5ではパッチID 9672120を参照してください。
この問題はR28.0.1で修正されました。
非推奨のコマンドライン・オプション-XXexternalCompactRatio
を使用すると、次のような不適切な警告が表示されます。
[WARN ] -XXexternalCompactRatio is a deprecated option. Please use -XXcompaction:internalPercentage instead.
この問題はR28.0.1で修正されました。
非圧縮エントリ(メソッドSTORED)のために作成されたjava.util.zip.ZipEntry
を初期化すると、非圧縮フィールドと圧縮フィールドは同じ値で初期化されません。これによって、java.util.zip.ZipException
が生じることがあります。
この問題はR28.0.1で修正されました。
java.lang.util.zip.Deflater.end()
を呼び出した後にjava.lang.util.zip.Deflater.deflateBytes()
を呼び出すと、JVMがクラッシュすることがあります。
この問題はR28.0.1で修正され、NullPointerException
がスローされるようになりました。
x86_64マシンで、11個を超える引数を指定してメソッドを呼び出すと、Javaアプリケーションの動作が不確定になる場合があります。
この問題はR28.0.1で修正されました。
無限ループを含むJavaFXクラスをコンパイルすると、JRockit JVMが永続的にスピンします。
この問題はR28.0.1で修正されました。
GcCompaction
JFRイベントの一部の記述が直感的ではありません。
この問題はR28.0.1で修正されました。
Windowsで実行中のWebLogic ServerでNIOSocketMuxer
を使用すると、ソケットが消失することがあります。
この問題はR28.0.1で修正されました。
Oracle JRockit JDK R28.0.0で修正された問題を次に示します。
最適化コードで、配列の内部型チェックが誤った型を示すことがありました。この問題は解決されました。
このリリースでは、共有ライブラリ(DLL)のロード中に、標準ストリーム(stdin
、stdout
stderr
/System.in
、System.out
、System.err
)でスレッドがI/O操作をブロックした場合、Windowsプラットフォームでのデッドロックを回避するための対策が追加されました。デッドロックは、次のような状況でプロセスが起動されたときに起こります: 呼び出しがブロックされたストリームは、リダイレクトされたパイプで、通常、Process.exec
などによって生成されたプロセスであるか、パイプを通じてデータの受渡しをするシェルで起動されたプロセスです。バグが生じるのは、呼出しを処理する間、このようなパイプでのI/O操作がカーネル・ロックを保持するためであり、このロックはWinAPI関数GetFileType()
でも必要です。この関数は、新しいCRT DLLまたはCRT関数が静的にリンクされたDLLをロードするとき、Microsoft CRTの起動コードから呼び出されます。
このバグは、Windows Vistaより前のWindowsリリースでのみ起こります。
回避策
stdin
をパイプにリダイレクトして起動されるすべてのJVMプロセスを検出します。プロセスに対するすべてのFileInputStream.read()
呼出しをインターセプトし、本質的にはポーリングI/Oにより、ブロックを防止します。この回避策によって、スレッドがSystem.in
から読み取る際にSystem.loadLibrary
呼出しはブロックされません。System.in
からの読取りに遅延が生じる可能性がありますが、ほとんどのアプリケーションで目立った遅れは生じません。
この回避策は、次の診断オプションで制御できます(-XX:+UnlockDiagnosticVMOptions
を使用してロックを解除):
-XX:+|-UseStdinPipeReadWorkaround
: 回避策を有効化します(デフォルトは有効です)。
-XX:StdinPipeReadWorkaroundPollPeriod=<
millis
>
: stdin
からの読取りの期間をポーリングします(デフォルトは1です)。
注意:
この修正は、System.in
からのNIO読取りを処理しません。これらを使用すると、JVMのデッドロックが生じる可能性があります。
この修正は、標準入力のリダイレクトが検出された場合にのみアクティブになります。
このリリースは、Oracle JRockit R27.xで非デフォルト・フラグ、-XXcallProfiling
を使用したときに発生する次の問題を解決します。
コンパイラとコードのガベージ・コレクション間のデッドロック。
無効なメソッドからの呼出しプロファイリング・データのメモリー・リーク。
このリリースでは、PDHヘッダーの処理でアクセスが必要なときに、同じ名前の多数の(40を超える)プロセスを実行しているWindowsマシンでのパフォーマンスの低下に関する問題、またはJRockitフライト・レコーダを実行する場合に起動時間が長くなる問題を修正します。
Oracle JRockit最適化コンパイラは、まれに、プリミティブ型の縮小変換を含む演算で、誤った結果が生じていました。この問題は修正されました。
WindowsでのJRockit 6の機能しないJavaランチャjava-rmi.exeは、出荷時に製品に含まれていません。次のサイトでSun Bug 6512052も参照してください: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6512052
Oracle JRockit R27.6.0では、非推奨のメソッド・コードをアンロードする際に、JVMTI_EVENT_COMPILED_METHOD_UNLOAD
イベントがポストされませんでした。この問題は修正されました。