0

スレッド「HSQLDB Connection @3c50507」で例外が発生します

java.lang.OutOfMemoryError: Java heap space, when running a JSP.

記憶にないものは何ですか?日食、HSQLDBまたはTomcat?? 私はMac OS X 10.7.4でそれをすべて使用しています

HSQLDB を起動すると、コンソールで次の例外が発生します。

[Server@122ce908]: From command line, use [Ctrl]+[C] to abort abruptly
Exception in thread "HSQLDB Connection @2e716cb7" java.lang.OutOfMemoryError: Java heap space
    at org.hsqldb.lib.HsqlByteArrayOutputStream.ensureRoom(Unknown Source)
    at org.hsqldb.rowio.RowOutputBinary.ensureRoom(Unknown Source)
    at org.hsqldb.lib.HsqlByteArrayOutputStream.write(Unknown Source)
    at org.hsqldb.rowio.RowOutputBinary.writeByteArray(Unknown Source)
    at org.hsqldb.rowio.RowOutputBinary.writeBinary(Unknown Source)
    at org.hsqldb.rowio.RowOutputBase.writeData(Unknown Source)
    at org.hsqldb.Result.write(Unknown Source)
    at org.hsqldb.Result.write(Unknown Source)
    at org.hsqldb.ServerConnection.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:680)

これはどういう意味ですか?

4

3 に答える 3

2

Eclipseではありません。「アプリケーション」はEclipseと同じJVMで実行されておらず、投稿した最小限のエラーメッセージは、これがアプリケーションで発生していることを明確にしています...広い意味で。

質問に貼り付けた最小限のエラーメッセージから、それがTomcatであるかHSQLDBであるかは明らかではありません。Tomcatである可能性が高いと思います...そして、データベースから大きな結果セットをプルしているときに問題が発生していると思います。ただし、完全なスタックトレースがない場合は、推測しているだけです。

それが私が疑うものである場合、2つのオプションがあります。

  • Tomcatを実行しているJVMのJVMヒープサイズを増やすことができます。

  • アプリケーションがヒープを埋めるきっかけとなった原因を把握できます。

    • アプリケーションの設計では、データベースから大量のデータを取得してメモリに保持する必要があるだけかもしれません。その場合、ヒープサイズを増やすか、(何らかの方法で)「問題のサイズ」に何らかの制限を適用する以外に選択肢はありません。

    • アプリケーションが実際にそのすべてのデータをプルする必要がない可能性があります。たとえば、SQLクエリを変更して、プルする必要のあるデータを減らすことができます。

    • すべてのデータを同時にメモリに保持する必要がない可能性があります。

    • アプリケーションで根本的なメモリリークが発生している可能性があり、それがすべてのメモリを消費している原因です。その場合、ヒープサイズを増やすことは、自動車事故の犠牲者にバンドエイドを貼り付けるようなものです。あなたが本当の問題を解決しない限り、患者は死ぬでしょう。


遅れたスタックトレースに基づく更新

データベースからイメージをフェッチしているときに問題が発生している場合、その例外はデータベース側から発生しています。メソッド名は、それがWRITINGであることを示しています。スタックトレースがHSQLDBコンソールにあるという事実は、これが正しい診断であることを確認します。(この時点でメモリリークが発生する可能性はほとんどありません。ヒープサイズを増やす必要があります...またはデータベースに巨大な画像を保存しないでください!)

一方、データベースに画像を保存しているときに発生している場合は、Tomcat側にあります。他の回答の1つには、それに対処する方法に関するリンクがあります。

いずれにせよ、データベースに大きな画像を保存することは、効率の観点からは良くありません。そうすると、データベース/ウェブサーバーのインフラストラクチャにストレスがかかる可能性があります...あなたが見ているように。


HSQLDBのスタックサイズの増加に関する更新。

HSQLDBのヒープサイズを増やすための簡単な「方法」を見つけることができませんでした。組み込みエンジンとして使用しているか、独自のJVMでHSQLDBを起動しているかによって異なります。(私の推測では、後者を実行していると思います。)前者の場合、それを埋め込むアプリケーション(Tomcatなど)のヒープサイズを増やすことで問題を処理します。それ以外の場合、コマンドラインから起動する場合は、マニュアルページ の説明javaに従って、-Xmxおよび-Xmsパラメータをコマンドラインに追加します。java

于 2012-06-21T02:32:09.770 に答える
0

hsqldb または Tomcat のいずれかです。アプリの実行時に別の JVM をスピンオフするため、Eclipse である可能性は低いです。これをデバッグする正しい方法は、スタック トレースを調べて、手掛かりが得られるかどうかを確認することです。そうでない場合は、プロファイラーを使用してください。

于 2012-06-21T02:20:42.043 に答える
0

Stringsこのエラーは通常、ヒープに作成するオブジェクトが多すぎる場合に発生します。DB から読み取るときに作成しすぎる可能性があると思われます。いずれにせよ、問題は VM に関連しており、解決策の 1 つ (コードが改善されると思わない場合) は、JVM の permgen を増やすことです。

Eclipse で開発している場合は、Eclipseで permgen を増やしてみてください。

Tomcat にデプロイしたときにエラーが発生した場合は、 tomcat で増やしてみてください

于 2012-06-21T02:21:34.210 に答える