我正在写一个Servlet。这是我的代码:
private LinkedList <HashSet> completeHashList;
private LinkedList<String>hashStr;
@Override
public void init(ServletConfig config)
{
completeHashList = new LinkedList<HashSet>();
hashStr = new LinkedList<String>();
System.out.println("Hash Loading started");
try
{
//Read the Hash File
String str = "";
File inputFile = new File("E:/Amazon HashFile/Hash.txt");
BufferedReader br = new BufferedReader(new FileReader(inputFile));
int hashNumber=1;
while((str=br.readLine())!=null)
{
HashSet<String>lineCollector = new HashSet<String>();
int lastIndex = 0;
hashStr.add(str);
for(int i=0;i<=str.length();i=i+3)
{
lastIndex = i;
try
{
String stringPiece = str.substring(i, i+3);
// pw.println(stringPiece);
lineCollector.add(stringPiece);
}
catch(Exception arr)
{
String stringPiece = str.substring(lastIndex, str.length());
// pw.println(stringPiece);
lineCollector.add(stringPiece);
}
}
completeHashList.add(lineCollector);
System.out.println(hashNumber);
hashNumber++;
}
System.out.println("Hash Loading Done");
}
catch(Exception e)
{
e.printStackTrace();
}
}
这里我收到以下错误。
Exception in thread "http-apr-8080-exec-2" Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: Java heap space
at java.lang.String.substring(String.java:1960)
at analyzer.SiteAnalizer.init(SiteAnalizer.java:74)
at org.apache.catalina.core.StandardWrapper.initServlet(StandardWrapper.java:1228)
at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1147)
at org.apache.catalina.core.StandardWrapper.allocate(StandardWrapper.java:836)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:135)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:964)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:1824)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
java.lang.OutOfMemoryError: Java heap space
at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:116)
at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1242)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1400)
at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1389)
at java.lang.Thread.run(Thread.java:722)
我正在阅读的文件大小为77MB,Java可以轻松地将这种文件存储在内存中。我也使用此应用程序的桌面Java版本。但在这里,它崩溃!!
目标是代码
如果错了怎么办?
除此之外,我需要在加载Servlet
后立即运行此代码。但是,一旦从Servlet
页面调用JSP
,就会运行此功能。这不是我需要的,Servlet
应该运行此代码并等待doGet()
和doPost()
请求。
更新
我在Netbeans中运行它。那么如何调整Tomcat的VM堆大小呢?
答案 0 :(得分:0)
可能只是增加JVM的Xmx选项。
我在开发Web应用程序时将此设置用于JVM:
-XX:MaxPermSize=384m -Xms768m -Xmx1536m -XX:MaxNewSize=384m -XX:NewSize=384m
当然这取决于项目规模。
答案 1 :(得分:0)
在查看代码之后,它非常简单,不应该引发那种错误,它可能会发生。所以我建议你看一下JVM memory arguments
。
你需要看看这个。实际上,您可以根据需要为JVM设置尽可能多的内存:
-Xmx2048m -> this param to set the max memory that the JVM can allocate
-Xms1024m -> the init memory that JVM will allocate on the start up
-XX:MaxPermSize=512M -> this for the max Permanent Generation memory
-XX:MaxNewSize= -> this need to be 40% from your Xmx value
-XX:NewSize=614m -> this need to be 40% from your Xmx value
此外,不是将77MB
加载到内存中,您的代码中有3个收藏
所有这些集合都会加载相同的数据并对其进行缓存。
答案 2 :(得分:0)
我正在阅读的文件大小为77MB,Java可以轻松地将这种文件存储在内存中。我也使用此应用程序的桌面Java版本。但在这里,它崩溃!!
查看容器(服务器)配置。我想你应该增加最大堆大小。
Servlet应运行此代码并等待doGet()和doPost()请求。我该怎么做?
Here is how to get work done on initialization
您可以将数据保存在内存或磁盘中的某个位置,然后通过servlet返回(在do ...方法中)。