- PR -

JSPのメソッド制限

投稿者投稿内容
ymatsu
常連さん
会議室デビュー日: 2002/08/19
投稿数: 22
投稿日時: 2002-10-11 14:33
度々質問にて失礼致します。

現在開発しているアプリケーションのViewをJSPにて開発しているわけですが、
そのView自体が大きなものとなってしまい、実行時に以下のようなエラーが
出てしまいます。

※エラーメッセージはWebSphereのもの
> JSPG0144E: 生成済みサーブレットのエラー:
> (中略)
> : このコードは 64K バイトを超えるサイズのメソッドの生成を必要とします。Virtual Machine は生成されるクラスファイルを拒否します。

JSPからJavaソースに変換され、その先のclassファイルでこういう現象になっているのですが
同様の現象に遭遇された方はいらっしゃいますでしょうか?
また、その際の解決方法がございましたらご教授いただけたらと思います。

以上、よろしくお願いいたします。

未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-10-11 14:40
> : このコードは 64K バイトを超えるサイズのメソッドの生成を
>必要とします。Virtual Machine は生成されるクラスファイルを拒否します。

Code配列の長さが最大で約64KBという,Javaクラスファイル
フォーマットの仕様からくる制約ですね.書かれているとおり,
1メソッドのサイズが64KBを超えた場合に発生するようです.
#この辺の話はJava仮想マシン仕様書に書かれています.

おそらくは,よほど汚らしいコードを書いて様々なコードが
すべて1メソッドに押し込められた結果でしょう.リファクタ
リングをお勧めします.

同じタイプのトラブルは通常のJavaプログラムでも発生しうる
はずですが,多少汚いコードを書いても,1メソッドが64KBを
超えることはまずありえないので,JSP以外でこれが発生した
などとは,見たことも聞いたこともありません.
わらび
ベテラン
会議室デビュー日: 2002/08/30
投稿数: 53
投稿日時: 2002-10-11 15:30
>おそらくは,よほど汚らしいコードを書いて様々なコードが
>すべて1メソッドに押し込められた結果でしょう.リファクタ
>リングをお勧めします.

まあ、お手柔らかに。
JSPの場合、普通に書くと、そのページすべてを、自動的にひとつのメソッドとして
解析されてしまいますし。HTMLの部分も、out.print(...)で処理されますから、多少は
仕方ない部分でもあるとは思いますが。

ですが、対処としては、やはり、構成を考え直して、servletやbeanで処理できる部分
や、すべき部分は、そちらに移されるのが、一番いいと思います。
ymatsu
常連さん
会議室デビュー日: 2002/08/19
投稿数: 22
投稿日時: 2002-10-11 15:44
素早い回答ありがとうございます。

JSP中のJavaロジック部分をBeanに移したりとやってますが、
そーやってJSPをスリム化させるしかないですね。

JSPないしはプリコンパイルしたJavaソースコードの段階で
メソッドサイズオーバー判断の目安みたいなものがあれば、
ありがたいんですが。



未記入
ぬし
会議室デビュー日: 2002/03/28
投稿数: 255
投稿日時: 2002-10-11 17:37
>JSPの場合、普通に書くと、そのページすべてを、自動的にひとつの
>メソッドとして解析されてしまいますし。HTMLの部分も、out.print(...)
>で処理されますから、多少は仕方ない部分でもあるとは思いますが。
うーん.そうはいっても,仮にもJSPを使う以上はある程度動的な
ページを作るのを目的としているわけですよね?それを,何も
考えずに全て1メソッドで実現してしまうと,バグが出たときに
対処するのが困難になります.そうでなくても,JSPは表示と制御
が混在しやすく,複雑になるとデバッグし難いのに.
#リファクタリングを勧めたのにはそういう理由もある.

それに,全部out.print...を使うとしても,そう滅多なことでは
64KBを超えることはありませんでしたよ.もちろん,なんらかの
書き方をするとコードサイズがやたらと大きくなる性質があると
いうのであれば,同じ失敗を未然に防ぐために是非教えて頂きたい
ですが.
yu
ベテラン
会議室デビュー日: 2002/09/29
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2002-10-12 00:20
私は64KBを超えたことはないですが、
ドキュメントのような、巨大なHTMLをJSPで生成したら、64KB超えますよね。
そうしたら、<jsp:include>を使うしかないのですかね。
しょむ
ぬし
会議室デビュー日: 2001/09/06
投稿数: 430
投稿日時: 2002-10-12 22:04
>ドキュメントのような、巨大なHTMLをJSPで生成したら、64KB超えますよね。
>そうしたら、<jsp:include>を使うしかないのですかね。

違うんでは。
あくまで「生成するためのコード部分が 64k」であって、
<% for (int i=0; i<128000; i++) { out.print("a"); } %> なら OK でせう。

もともとが数十キロあるような HTML をベースに JSP を生成するとアウトでしょうけど。

# 私も知りたいな…コード部分が 64k を越えるような JSP ってどんなのか…
# hidden で static な数十キロの文字列を持っている…とか?
yu
ベテラン
会議室デビュー日: 2002/09/29
投稿数: 58
お住まい・勤務地: 東京
投稿日時: 2002-10-13 01:48
引用:

しょむさんの書き込み (2002-10-12 22:04) より:
違うんでは。
あくまで「生成するためのコード部分が 64k」であって、
<% for (int i=0; i<128000; i++) { out.print("a"); } %> なら OK でせう。

もともとが数十キロあるような HTML をベースに JSP を生成するとアウトでしょうけど。



言葉足らずでした。言いたかったのは下のほうです。例えば、
http://www.w3.org/TR/xhtml1/ を単純にJSPにしたら、
エラーが出るのではないでしょうか?

以上の話とは関係ないですが、VMやエミュレーターを作ると、
命令処理で、巨大なswitch分を使うことが多いですが、
これって、結構64KBを超えやすいです。

スキルアップ/キャリアアップ(JOB@IT)