竹形様
ご無沙汰しております。
半年ぶりに投稿させていただきます。
その節はいろいろとお世話になりました。
先生のおかげでとても有益な資料整理ができるようになりました。
しばらくプログラミングから遠ざかっていまして最近また思いついたように少し始め出しました。
ファイルをアップロードしてMySQLに保存するシステムで個人的に資料整理に十分役立つまでに完成しましたが、最近WAVファイルをアップロードしたところエラーで落ちまして、アップロードするプログラムを
upload.setSizeMax(50000 * 1024);
に変更して50MBまでのファイルをアップロードできるように変更し、
my.iniを
max_allowed_packet=100M
まで変更したのですが、
どうもjavaのほうでエラーが出てしまいます。このエラーの意味を教えていただけますでしょうか。
もし何か良い対処法がありましたら教えていただけますでしょうか?
エラーリストを掲載させていただきます。
よろしくお願いします。
ご無沙汰しております。
半年ぶりに投稿させていただきます。
その節はいろいろとお世話になりました。
先生のおかげでとても有益な資料整理ができるようになりました。
しばらくプログラミングから遠ざかっていまして最近また思いついたように少し始め出しました。
ファイルをアップロードして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)
メッセージ
説明 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 メモリ 設定」などで検索してみてください。
ご質問のエラーですが、これはTomcatが使うメモリが足りなくなってしまった場合に発生します。私の書いたコードでは、アップロードされたデータを一度メモリ上にバッファしてSQL文を発行しているので、大きなサイズのデータをアップロードするには大きなサイズのバッファが必要になります。
大きなデータを扱う場合は、バッファをメモリ上ではなく一時ファイルに作成するように変更すれば良いのですが、複数のユーザが同時にファイルをアップロードすることも考えられるので、排他処理をうまくやらなければなりません。
応急措置としては、Tomcatの使うメモリ(ヒープ)のサイズを大きくするという方法があります。設定の方法はOSなどの環境によって異なるので、「Tomcat メモリ 設定」などで検索してみてください。
投稿:竹形 誠司[takegata]/2009年 09月 25日 09時 47分
/更新:2009年 09月 25日 09時 53分
竹形様
ありがとうございました。
Config TomcatというユーティリティでHeapメモリのMAXサイズを256MBに変更して、さらにMySQLのファイル保存先のカラムのデータ属性をMEDIUNBLOBからLONGBLOBへ変更しましたところ、時間はかかりますが41MBのWAVファイルのアップロードに成功しました。ところが一度40MB程度のファイルをアップロードするとTomcatのメモリ使用値が200MB程度で高止まりしてしまいPCの負荷が高まってしまい他に支障をきたしてしまいました。
このTomcatのメモリ使用値が200MB程度で高止まりしてしまう現象はなぜおこるのでしょうか?
対策はありますでしょうか?
ご教示お願いします。
ありがとうございました。
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分
うーむ、それはTomcatが使ったメモリが開放されていない可能性がありますね。
streamを明示的にcloseしたり、大きくなりそうなオブジェクトが使い終わったときにnullを代入したりしてみると何か状況が変わるかもしれません。
通常はメソッドの中で宣言したオブジェクトはメソッドが終了したときに自動的に消滅するのですが、そのオブジェクトを他のオブジェクトが参照している場合は、その参照が無くなるまでメモリ上に残っています。
コネクションプーリングを使うとPreparedStatementなどが自動的には消滅せず、メモリリークの原因になることがあるようです。
参考:
http://endosnipe.smg.co.jp/past-result_memoryleak_case_dbcp.html
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分