竹形誠司 ブログ
ご質問    »トピック一覧
掲示板へのスパムが多いため、「ご質問」のコーナーはユーザー登録制とさせていただきました。お手数ですが、上の「新規ユーザーの登録」メニューより登録をお願いします。
帳票Web
アプリケーション

受注開発始めました
詳しくは こちら
竹形 誠司 著/ラトルズ刊
JSP帳票アプリケーション実践開発入門
JSP帳票アプリケーション
実践開発入門

JSP業務アプリケーション短期開発入門
JSP業務アプリケーション
短期開発入門

Java+MySQL+Tomcatで始めるWebアプリケーション構築入門
Java+MySQL+Tomcatで始めるWebアプリケーション構築入門

Java+MySQL+Tomcatで作る掲示板とブログ
Java+MySQL+Tomcatで作る
掲示板とブログ
ファイルアップロードのエラーについてご教示ください。
by スワジランド[swajiland]
竹形様

ご無沙汰しております。
半年ぶりに投稿させていただきます。
その節はいろいろとお世話になりました。
先生のおかげでとても有益な資料整理ができるようになりました。
しばらくプログラミングから遠ざかっていまして最近また思いついたように少し始め出しました。
ファイルをアップロードしてMySQLに保存するシステムで個人的に資料整理に十分役立つまでに完成しましたが、最近WAVファイルをアップロードしたところエラーで落ちまして、アップロードするプログラムを
upload.setSizeMax(50000 * 1024);
に変更して50MBまでのファイルをアップロードできるように変更し、
my.iniを
max_allowed_packet=100M
まで変更したのですが、
どうもjavaのほうでエラーが出てしまいます。このエラーの意味を教えていただけますでしょうか。
もし何か良い対処法がありましたら教えていただけますでしょうか?
エラーリストを掲載させていただきます。
よろしくお願いします。
type 例外レポート

メッセージ

説明 The server encountered an internal error () that prevented it from fulfilling this request.

例外

org.apache.jasper.JasperException: An exception occurred processing JSP page /FileUploadProcess3.jsp at line 32

29:            strTitle = item.getString("Windows-31J");
30:        }
31:    } else {    //ファイル転送
32:        if(item.getString().equals("")){    //ファイル添付なし
33:           
34:           


Stacktrace:
    org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:505)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:398)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


原因

javax.servlet.ServletException: java.lang.OutOfMemoryError: Java heap space
    org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:852)
    org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:781)
    org.apache.jsp.FileUploadProcess3_jsp._jspService(FileUploadProcess3_jsp.java:160)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


原因

java.lang.OutOfMemoryError: Java heap space
    java.lang.StringCoding$StringDecoder.decode(Unknown Source)
    java.lang.StringCoding.decode(Unknown Source)
    java.lang.String.<init>(Unknown Source)
    java.lang.String.<init>(Unknown Source)
    org.apache.commons.fileupload.disk.DiskFileItem.getString(DiskFileItem.java:385)
    org.apache.jsp.FileUploadProcess3_jsp._jspService(FileUploadProcess3_jsp.java:91)
    org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
    org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
    org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)


投稿:スワジランド[swajiland]/2009年 09月 25日 08時 34分 /更新:2009年 09月 25日 08時 41分
RE:ファイルアップロードのエラーについてご教示ください。
by 竹形 誠司[takegata]
竹形です。こんにちは。お久しぶりです。

ご質問のエラーですが、これはTomcatが使うメモリが足りなくなってしまった場合に発生します。私の書いたコードでは、アップロードされたデータを一度メモリ上にバッファしてSQL文を発行しているので、大きなサイズのデータをアップロードするには大きなサイズのバッファが必要になります。

大きなデータを扱う場合は、バッファをメモリ上ではなく一時ファイルに作成するように変更すれば良いのですが、複数のユーザが同時にファイルをアップロードすることも考えられるので、排他処理をうまくやらなければなりません。

応急措置としては、Tomcatの使うメモリ(ヒープ)のサイズを大きくするという方法があります。設定の方法はOSなどの環境によって異なるので、「Tomcat メモリ 設定」などで検索してみてください。
投稿:竹形 誠司[takegata]/2009年 09月 25日 09時 47分 /更新:2009年 09月 25日 09時 53分
RE:ファイルアップロードのエラーについてご教示ください。
by スワジランド[swajiland]
竹形様

ありがとうございました。
Config TomcatというユーティリティでHeapメモリのMAXサイズを256MBに変更して、さらにMySQLのファイル保存先のカラムのデータ属性をMEDIUNBLOBからLONGBLOBへ変更しましたところ、時間はかかりますが41MBのWAVファイルのアップロードに成功しました。ところが一度40MB程度のファイルをアップロードするとTomcatのメモリ使用値が200MB程度で高止まりしてしまいPCの負荷が高まってしまい他に支障をきたしてしまいました。
このTomcatのメモリ使用値が200MB程度で高止まりしてしまう現象はなぜおこるのでしょうか?
対策はありますでしょうか?
ご教示お願いします。
投稿:スワジランド[swajiland]/2009年 09月 26日 18時 59分 /更新:2009年 09月 26日 18時 59分
RE:ファイルアップロードのエラーについてご教示ください。
by 竹形 誠司[takegata]
うーむ、それはTomcatが使ったメモリが開放されていない可能性がありますね。
streamを明示的にcloseしたり、大きくなりそうなオブジェクトが使い終わったときにnullを代入したりしてみると何か状況が変わるかもしれません。

通常はメソッドの中で宣言したオブジェクトはメソッドが終了したときに自動的に消滅するのですが、そのオブジェクトを他のオブジェクトが参照している場合は、その参照が無くなるまでメモリ上に残っています。

コネクションプーリングを使うとPreparedStatementなどが自動的には消滅せず、メモリリークの原因になることがあるようです。

参考:
http://endosnipe.smg.co.jp/past-result_memoryleak_case_dbcp.html
投稿:竹形 誠司[takegata]/2009年 09月 26日 21時 40分 /更新:2009年 09月 26日 21時 44分