1

私は、Tomcat6をWebサーバーとして使用するJavaベースのWebアプリに取り組んでいます。通常、MySQLバックエンドがありますが、いくつかのインスタンスでは、クライアントにサービスを提供するためにMSSQLを使用する必要があります。これらのMSSQLインスタンスの1つに最新のアップグレードを実行すると、Webアプリの特定のページにアクセスするときにJavaのメモリ不足エラーが発生し始めました。通常、より大きな結果セットを返すときに発生しますが、常に発生するとは限りません。

PCのローカルインスタンスと同じWebアプリのセットアップでこのエラーが発生しないため、これは環境の問題であると思われます。私はTomcat6構成でさまざまなJava設定を試しましたが、問題を修正することはできませんでした。

環境は、4GBのRAMを搭載した32ビットマシンです。次のようにTomcat6を構成しました。-XX:MaxPermSize = 512m -Xnoclassgc初期メモリプール:1024最大メモリプール:1024

MaxPermSizeも増やしてみましたが、Tomcatを起動できなくなります。

また、-Xms -Xmxをそれぞれ256m、512mなどに設定してみました。

私のローカルマシンは64ビットで4GBのRAMです。次のようにTomcat6を構成しました。-XX:MaxPermSize = 512m -Xnoclassgc初期メモリプール:1024最大メモリプール:1024

これは、新しいアップグレードのSQLステートメントの問題でしょうか?ローカルインスタンスでエラーが発生しないため、これが当てはまるとは思いません。環境に関係していると思いますが、問題がわかりません。

誰かアドバイスはありますか?

ログに記録されたエラーは次のとおりです。

2012-09-19 11:44:54,745 [ http-80-7] ERROR org.apache.jsp.siteManager.util.error_jsp: javax.servlet.ServletException: java.lang.OutOfMemoryError: unable to create new native thread
at org.apache.jasper.runtime.PageContextImpl.doHandlePageException(PageContextImpl.java:862)
at org.apache.jasper.runtime.PageContextImpl.handlePageException(PageContextImpl.java:791)
at org.apache.jsp.doc.doc.index_jsp._jspService(index_jsp.java:1106)
at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:646)
at org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:436)
at org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:374)
at org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:302)
at com.djinnsoft.jade.sitetree.Sitetree.forward(Sitetree.java:405)
at com.djinnsoft.jade.sitetree.Sitetree.forward(Sitetree.java:344)
at com.djinnsoft.jade.sitetree.RootServlet.service(RootServlet.java:124)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.springboard.ram.report.ReportSecurityFilter.doFilter(ReportSecurityFilter.java:70)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:861)
at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:579)
at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1584)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.OutOfMemoryError: unable to create new native thread
at java.lang.Thread.start0(Native Method)
at java.lang.Thread.start(Unknown Source)
at com.microsoft.sqlserver.jdbc.TimeoutTimer.start(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.startResponse(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.doExecuteStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement$StmtExecCmd.doExecute(Unknown Source)
at com.microsoft.sqlserver.jdbc.TDSCommand.execute(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(Unknown Source)
at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeQuery(Unknown Source)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at com.djinnsoft.jade.data.record.SQLUtil.ExecuteQuery(SQLUtil.java:236)
at com.djinnsoft.jade.data.record.SQLUtil.ExecuteQuery(SQLUtil.java:207)
at com.djinnsoft.jade.data.record.RecordSource.find(RecordSource.java:184)
at com.djinnsoft.jade.data.record.RecordSource.find(RecordSource.java:148)
at com.djinnsoft.jade.content.data.DatabaseContentSource.createVersions(DatabaseContentSource.java:804)
at com.djinnsoft.jade.content.data.DatabaseContentSource.access$2900(DatabaseContentSource.java:42)
at com.djinnsoft.jade.content.data.DatabaseContentSource$8.process(DatabaseContentSource.java:747)
at com.djinnsoft.jade.data.record.SQLEnvironment.execute(SQLEnvironment.java:70)
at com.djinnsoft.jade.content.data.DatabaseContentSource.findImpl(DatabaseContentSource.java:672)
at com.djinnsoft.jade.content.GenericContentSource.findImpl(GenericContentSource.java:1077)
at com.djinnsoft.jade.content.GenericContentSource.find(GenericContentSource.java:1186)
at com.djinnsoft.jade.content.GenericContentSource.find(GenericContentSource.java:1200)
at com.djinnsoft.jade.content.GenericContentSource.find(GenericContentSource.java:1025)
at com.djinnsoft.jade.content.taglib.ContentBaseTag.findItem(ContentBaseTag.java:166)
at com.djinnsoft.jade.content.taglib.ContentTag.doStartTag(ContentTag.java:500)
at org.apache.jsp.doc.doc.index_jsp._jspx_meth_content_005faction_005f12(index_jsp.java:7637)
at org.apache.jsp.doc.doc.index_jsp._jspx_meth_c_005fforEach_005f6(index_jsp.java:6299)
at org.apache.jsp.doc.doc.index_jsp._jspx_meth_c_005fotherwise_005f3(index_jsp.java:4816)
at org.apache.jsp.doc.doc.index_jsp._jspx_meth_c_005fchoose_005f3(index_jsp.java:4395)
at org.apache.jsp.doc.doc.index_jsp._jspx_meth_c_005fotherwise_005f2(index_jsp.java:4363)
at org.apache.jsp.doc.doc.index_jsp._jspx_meth_c_005fchoose_005f2(index_jsp.java:4278)
at org.apache.jsp.doc.doc.index_jsp._jspx_meth_forms_005fpopulateResult_005f0(index_jsp.java:4244)
at org.apache.jsp.doc.doc.index_jsp._jspService(index_jsp.java:961)
... 32 more
4

2 に答える 2

0

OK、問題の解決策を見つけました。新しいバージョンの Web アプリには、結果セットの表示サイズを制限し、その制限でページ付けするコンテキスト パラメーターがあります。前述したように、この問題はより大きな結果セットでのみ発生しているように見えました。MySQL バックエンドのデフォルト設定は 500 ですが、MS SQL バックエンドではこれをもっと低く設定する必要があるようです。20 に設定すると、メモリ不足エラーがなくなりました。アドバイスを提供してくれたすべての人に感謝します。大変ありがたかったです。

于 2012-09-19T18:12:08.693 に答える
0

2012-09-19 11:44:54,745 [ http-80-7] エラー org.apache.jsp.siteManager.util.error_jsp: javax.servlet.ServletException: java.lang.OutOfMemoryError: 新しいネイティブ スレッドを作成できません

これは通常、Java ヒープではなく、ネイティブ メモリに OOM があることを示しています。これは、OS がスレッドを割り当てることができなかったことを意味します。
これは、次のいずれかを意味します。

  • 実行中のスレッドが多すぎて、OS の制限を超えた (32 ビット マシンとは異なるスレッド制限を持つ 64 ビット マシンを使用している)、または

  • あなたのスレッドの 1 つが、初期化時に大量のメモリを使用してクラッシュしました (これを正確に説明することはできません)。

あなたはこれを再現できないと言っていますが、ローカルで再現できるようにするために持っていないのは Web サーバーの負荷である可能性がありますか? おそらく、デプロイされたサーバー インスタンスの負荷が重すぎて、同時要求が多すぎて (アプリケーションスレッドが多すぎますか?)、これが原因でクラッシュしたのでしょうか?

于 2012-09-19T17:26:05.600 に答える