8.2.17 JavaVMのメソッドサイズ制限についての注意事項
JavaVMでは,64KBを超えるメソッドが存在すると,クラスファイル生成時にエラーとなるか,クラスのロード時にjava.lang.LinkageError例外が発生します。そのため,1メソッドのバイトコードは64KB以内のサイズにする必要があります。
また,64KB以内であっても,非常に大きいサイズのメソッドが存在する場合は,次のような弊害が発生するおそれがあります。
-
GC処理の実行に非常に時間が掛かる。
-
JITコンパイルに非常に時間が掛かる。
-
JITコンパイルに非常に多くのメモリを消費する。
-
クラスのロード処理に非常に時間が掛かる。
-
クラスのロード処理で一時的に非常に多くのMetaspace領域を消費する。
Webアプリケーションでは,自動生成されるjavaソースコードによって,1メソッドのバイトコードが64KBを超える場合があります。javaソースコードの自動生成と,メソッドサイズが大きい場合の見直し方法について説明します。
(1) javaソースコードの自動生成
javaソースコードの自動生成について説明します。
-
JSP仕様での自動生成
JSP仕様では,JSPファイル,またはタグファイルに記述した内容から,_jspServiceメソッドまたはdoTagメソッド内にjavaソースコードが自動生成されます。
-
アプリケーションサーバでのカスタムタグ使用時の自動生成
アプリケーションサーバでは,カスタムタグを使用している場合,カスタムタグの処理やボディに記述した内容がメソッド化され,javaソースコードが自動生成されます。
なお,カスタムタグをメソッド化できるのは,カスタムタグの処理またはボディに含まれるすべてのカスタムタグが次の条件を満たす場合です。
-
属性やボディがスクリプトレスである。
-
スクリプト変数を定義していない。
-
(2) メソッドサイズが大きい場合の見直し方法
自動生成されたjavaソースコードのメソッドの行数が,コメントおよび空行を含めて1000行を超える場合,KDJE39231-WおよびKDJE39333-Wのメッセージが出力されます。
メッセージが出力された場合は,JSPファイル,タグファイル,またはカスタムタグのボディの内容を見直してください。
見直す個所ごとに,見直す方法を次に示します。
-
JSPファイルの内容のサイズが大きい場合
動的インクルード(インクルードアクション)でJSPファイルを分割する。
-
タグファイルの内容のサイズが大きい場合
次のどちらかを実施します。
-
JSPファイルから使用するタグファイルを複数のタグファイルに分割する。
-
タグファイルから別のタグファイルを呼び出すように分割する。
-
-
カスタムタグのボディのサイズが大きい場合
動的インクルード(インクルードアクション)でカスタムタグを分割する。