Servlet:OutOfMemory错误

时间:2014-02-20 12:20:45

标签: java jsp servlets netbeans out-of-memory

我正在写一个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堆大小呢?

3 个答案:

答案 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个收藏

  • completeHashList
  • hashStr
  • lineCollector

所有这些集合都会加载相同的数据并对其进行缓存。

答案 2 :(得分:0)

我正在阅读的文件大小为77MB,Java可以轻松地将这种文件存储在内存中。我也使用此应用程序的桌面Java版本。但在这里,它崩溃!!

查看容器(服务器)配置。我想你应该增加最大堆大小。

Servlet应运行此代码并等待doGet()和doPost()请求。我该怎么做?

Here is how to get work done on initialization

您可以将数据保存在内存或磁盘中的某个位置,然后通过servlet返回(在do ...方法中)。