2012-11-28 170 views
2

當運行我的應用程序時,在java.util.Properties.getProperty處獲得堆棧溢出異常的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) 

我不能從那裏堆棧引發錯誤跟蹤。

回答

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 class。

1

簡單的答案是您的測試用例內存不足。 A 可能的解決方案是增加JVM的內存。 I 認爲JVM的默認內存設置爲256M或512M。 這對於您的測試執行應該足夠了。短期解決方案 將使用-Xmx1700m(假設您有1.7G內存到 備用)。

+0

對我來說內存不應該是問題。因爲我已經爲JVM提供了5GB。以下是我傳遞給JVM的選項。 -XX:ErrorFile = hs_err_pid.log -XX:-HeapDumpOnOutOfMemoryError -Xmx5000m -XX:MaxJavaStackTraceDepth = 1000000 – krdroid