运行我的应用程序时,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)
我无法跟踪引发堆栈错误的位置。
答案 0 :(得分:1)
简单的答案是您的测试用例内存不足。一个 可能的解决方案是增加JVM的内存。一世 相信JVM的默认内存设置是256M或512M。 这应该足以进行测试。短期解决方案 是使用-Xmx1700m(假设你有1.7 gig的内存 备用)。
答案 1 :(得分: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 类。