2

アプリケーションを実行すると、40000 件のトランザクションの後、java.util.Properties.getProperty でスタック オーバーフロー例外が発生します。

スタックエラーの下を見つけてください..

    java.lang.StackOverflowError
    at java.util.Hashtable.get(Hashtable.java:334)
    at java.util.Properties.getProperty(Properties.java:932)
    at java.util.Properties.getProperty(Properties.java:934)
    ... 80,0000 times 
    at java.util.Properties.getProperty(Properties.java:934)
    at java.lang.System.getProperty(System.java:653)
    at sun.security.action.GetPropertyAction.run(GetPropertyAction.java:67)
    at sun.security.action.GetPropertyAction.run(GetPropertyAction.java:32)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.io.PrintWriter.<init>(PrintWriter.java:78)
    at java.io.PrintWriter.<init>(PrintWriter.java:62)
    at java.util.logging.SimpleFormatter.format(SimpleFormatter.java:71)
    at org.apache.juli.FileHandler.publish(FileHandler.java:133)
    at java.util.logging.Logger.log(Logger.java:481)
    at java.util.logging.Logger.doLog(Logger.java:503)
    at java.util.logging.Logger.logp(Logger.java:703)
    at org.apache.commons.logging.impl.Jdk14Logger.log(Jdk14Logger.java:101)
    at org.apache.commons.logging.impl.Jdk14Logger.error(Jdk14Logger.java:149)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:253)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:172)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:879)
    at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
    at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
    at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
    at java.lang.Thread.run(Thread.java:662)

スタック エラーがスローされた場所を追跡できません。

4

2 に答える 2

1

簡単な答えは、テスト ケースでメモリが不足しているということです。考えられる解決策は、JVM のメモリを増やすことです。JVM のデフォルトのメモリ設定は 256M または 512M だと思います。テストの実行にはこれで十分です。短期的な解決策は、-Xmx1700m を使用することです (1.7 ギガのメモリに余裕があると仮定します)。

于 2012-11-28T09:40:20.120 に答える
1

明白なことを述べるつもりはありませんが、同じ変数を再利用するのではなく、これらのトランザクションを実行するループ内で変数を作成しているかどうかを確認する必要があります(40.000 回の繰り返し :-))。また、ループ内の制約をチェックすると、不要な負荷が発生する可能性があります。文字列の連結も大量の負荷を生み出す可能性があります。したがって、次のようなものがある場合:

for (i=0; i < getNumberOfTransactions(); i++){      // constraint checking inside the loop 

    int currentValue = myTransaction.getSomeData();  // creating new variable in every 
}

代わりに次のように書く必要があります。

int numberOfTransactions = getNumberOfTransactions();
int currentValue = 0;

for(i=0; i < numberOfTransactions; i++){

    currentValue = myTransaction.getSomeData();
}

この例では 2 つの整数変数しか使用していませんが、ループ内で複数の変数が作成されると (特に文字列連結)、大量のメモリが消費される可能性があります。文字列連結がある場合は、代わりにStringBuilderクラスを使用してください。

于 2012-11-28T09:53:57.707 に答える