2

Why do I keep getting this error in JSP?

GC overhead limit exceeded and sometimes Heap Size

I am building Railway ticketing web application using Netbeans IDE. I am stuck at this error. I tried fixing it using a JVM setting of glassfish XX:MaxPermSize and Xmx. This page is creating a lot of objects and this page is for generating a random 10 digit ticket no. and confirming a booking.

<table border="0" cellspacing="0" cellpadding="0" width="440">
<tr>
<td class="pageHeader"></td>
</tr>
<tr>
    <td class="bodyText" style="font-size:10pt"><p>  You have successfully booked your ticket !!
    <%@ page language="java" import="java.sql.*, java.io.*, java.lang.*,java.util.*,java.math.*" %>
    <%
        String bookinfo = request.getParameter("info");
        String args[] = bookinfo.split(",");
        int Trainno = Integer.parseInt(args[0]);
        String Trainname = args[1];
        java.sql.Date Dat = java.sql.Date.valueOf(args[2]);
        String tclass = args[3];
        String From = args[4];
        String To = args[5];
        int Distance = Integer.parseInt(args[6]);
        int Fare = Integer.parseInt(args[7]);
        int seats = Integer.parseInt(args[8]);
        String pname = request.getParameter("pname");
        int age = Integer.parseInt(request.getParameter("age"));
        String sex = request.getParameter("sex");
        int coach = 0, seatno = 0;
        String coachno = new String();
        double range = 10000000000.0;
        Random ran = new Random();
        int PNRno = 0;
        String PNR;
        int flag = 0, flag2 = 0;

   try 
    {
       Class.forName("oracle.jdbc.driver.OracleDriver"); // Oracle Driver
    } 
   catch (java.lang.ClassNotFoundException e) 
   {
       System.out.println("ClassNotFoundException: " + e.getMessage());
   }
       Connection con;
       PreparedStatement ps;
       PreparedStatement ps2;
       ResultSet rs, rs2;
       con = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521/XE", "system", "hr");
       String insertStmt2 = "SELECT PNRno,COACH,SEATNO FROM BOOKING WHERE STATUS = ? AND CLASS = ? AND COACH NOT LIKE ?";
       ps2 = con.prepareStatement(insertStmt2);
       ps2.setString(1, "CANCEL");
       ps2.setString(2, tclass);
       ps2.setString(3, "WL%");
       rs2 = ps2.executeQuery();
       if (rs2.next()) 
       {
               PNR = rs2.getString(1);
               coachno = rs2.getString(2);
               seatno = rs2.getInt(3);
               insertStmt2 = "DELETE FROM BOOKING WHERE PNRno = ?";
               ps2 = con.prepareStatement(insertStmt2);
               ps2.setString(1, PNR);
               rs2 = ps2.executeQuery();
               if (rs2.next()) 
               {
                   flag2 = 1;
               }
       }
           String insertStmt = "INSERT INTO BOOKING VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
           do 
           {
               ps = con.prepareStatement(insertStmt);
               PNRno = (int) ((ran.nextDouble()) * range);
               ps.setString(1, String.valueOf(PNRno));
               ps.setInt(2, Trainno);
               ps.setString(3, Trainname);
               ps.setDate(4, Dat);
               ps.setString(5, tclass);
               ps.setString(6, From);
               ps.setString(7, To);
               ps.setInt(8, Distance);
               ps.setInt(9, Fare);
               ps.setString(10, pname);
               ps.setInt(11, age);
               ps.setString(12, sex);
               if (seats > 0 && flag2 == 0) 
               {
                   coach = (seats - 1) / 60 + 1;
                   seatno = ((seats - 1) % 60) + 1;
                   ps.setInt(16, 0);
                   if (tclass.equals("SL")) {
                       coachno = String.valueOf("S" + coach);
                   } 
                   else if (tclass.equals("2A")) {
                       coachno = String.valueOf("A" + coach);
                   } 
                   else if (tclass.equals("3A")) {
                       coachno = String.valueOf("B" + coach);
                   } 
                   else {
                       coachno = String.valueOf("AC" + coach);
                   }
                   ps.setString(13, coachno);
                   ps.setInt(14, seatno);
                   ps.setString(15, "CONFIRM");
               } 
               else if (flag2 == 0) {
                   ps.setInt(16, (Math.abs(seats) + 1));
                   ps.setString(13, "WL" + String.valueOf((Math.abs(seats) + 1)));
                   ps.setInt(14, 0);
                   ps.setString(15, "WAITING");
               } 
               else {
                   ps.setString(13, coachno);
                   ps.setInt(14, seatno);
                   ps.setString(15, "CONFIRM");
                   ps.setInt(16, 0);
                }
               try {
                   flag = 0;
                   rs = ps.executeQuery();
               } 
               catch (SQLException e) {
                   flag = 1;
               }
           } 
           while (flag == 1);
               if (tclass.equals("SL")) {
                   insertStmt = "UPDATE SEATS SET \"SL\" = ? WHERE dat = ? AND trainno = ?";
               } else if (tclass.equals("1A")) {
                   insertStmt = "UPDATE SEATS SET \"1A\" = ? WHERE dat = ? AND trainno = ?";
               } else if (tclass.equals("2A")) {
                   insertStmt = "UPDATE SEATS SET \"2A\" = ? WHERE dat = ? AND trainno = ?";
               } else if (tclass.equals("3A")) {
                   insertStmt = "UPDATE SEATS SET \"3A\" = ? WHERE dat = ? AND trainno = ?";
               } else {
                   insertStmt = "UPDATE SEATS SET \"1C\" = ? WHERE dat = ? AND trainno = ?";
               }
           seats--;
           ps = con.prepareStatement(insertStmt);
           ps.setInt(1, seats);
           ps.setDate(2, Dat);
           ps.setInt(3, Trainno);
           try 
           {
               rs = ps.executeQuery();
               rs.close();
           } 
           catch (SQLException e) 
           {
           }
           finally
           {
                /*try
                {
                    rs.close();
                }
                catch(SQLException e){}*/
                try
                {
                    ps.close();   
                } 
                catch(SQLException e){}
                    con.close();                         
            }                          
    %>
        <form action="PNRHandler.jsp" method="get">

            <input type="hidden" name="PNR" value="<%=PNRno%>" size="20" />               
            <br>
            <input type="submit" name="Get Status" value="Get e-ticket">
        </form>                           
        </p>
        <br />      </td>
        <tr>
    </table>

GlassFish Server Output Log

Severe:   An exception or error occurred in the container during the request processing
java.lang.OutOfMemoryError: Java heap space
    at java.util.LinkedList.listIterator(LinkedList.java:868)
    at java.util.AbstractList.listIterator(AbstractList.java:299)
    at java.util.AbstractSequentialList.iterator(AbstractSequentialList.java:239)
    at org.apache.catalina.connector.CoyoteAdapter.enteringServletContainer(CoyoteAdapter.java:295)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:394)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
    at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:745)

Severe:   doSelect exception
java.lang.OutOfMemoryError: Java heap space
    at java.util.ArrayList.iterator(ArrayList.java:834)
    at sun.nio.ch.WindowsSelectorImpl.updateSelectedKeys(WindowsSelectorImpl.java:496)
    at sun.nio.ch.WindowsSelectorImpl.doSelect(WindowsSelectorImpl.java:172)
    at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:86)
    at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:97)
    at org.glassfish.grizzly.nio.DefaultSelectorHandler.select(DefaultSelectorHandler.java:113)
    at org.glassfish.grizzly.nio.SelectorRunner.doSelect(SelectorRunner.java:339)
    at org.glassfish.grizzly.nio.SelectorRunner.run(SelectorRunner.java:279)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
    at java.lang.Thread.run(Thread.java:745)

Warning:   StandardWrapperValve[jsp]: Servlet.service() for servlet jsp threw exception
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:137)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:121)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:421)
    at java.lang.StringBuffer.append(StringBuffer.java:272)
    at oracle.jdbc.driver.OracleSql.handleODBC(OracleSql.java:1249)
    at oracle.jdbc.driver.OracleSql.parse(OracleSql.java:1192)
    at oracle.jdbc.driver.OracleSql.getSql(OracleSql.java:326)
    at oracle.jdbc.driver.OracleSql.getSqlBytes(OracleSql.java:661)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:215)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:58)
    at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:943)
    at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1075)
    at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3820)
    at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3867)
    at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1502)
    at org.apache.jsp.BookHandler2_jsp._jspService(BookHandler2_jsp.java:205)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:111)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:411)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:473)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:377)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
Himanshu Ray
  • 38
  • 1
  • 12
  • At what line are you getting that error? – Rabbit Guy Jul 19 '17 at 20:09
  • @rabbitguy I have just posted the ouput log please check it and help me out :). Thanks in advance. – Himanshu Ray Jul 19 '17 at 20:17
  • Because you are (almost) out of memory. When memory is extremely low, and short-lived garbage is created, each garbage run will free a very small amount of memory, but it is so small that a new GC run is needed almost immediately, which means that GC will start consuming all CPU power. Java detects that and throws `OutOfMemoryError`, even though it's not technically at 0% yet, rather than wasting time doing (almost) nothing but GC for the next X hours, until is truly runs out of memory. --- **To fix, add more memory or fix your memory leak.** Or ask for fewer records from database. – Andreas Jul 19 '17 at 20:32
  • @Andreas I am new to this can you please tell me how will i find the memory leaks ? – Himanshu Ray Jul 19 '17 at 20:36
  • Start by using [try-with-resources](https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html), so that your resources (`Connection`, `PreparedStatement`, `ResultSet`, ...) are closed correctly. – Andreas Jul 19 '17 at 21:25
  • Thanks @Andreas i will trying closing it and will update you if it helps. – Himanshu Ray Jul 20 '17 at 07:28
  • What is your current Xmx setting? – Mike Jul 20 '17 at 09:20
  • @Mike i have changed Xmx settings allocated more memory. My pc is freezing now when i am running the web app. Because of more allocated memory java is using above 3gb of memory sometimes. – Himanshu Ray Jul 31 '17 at 18:14

1 Answers1

0

GC overhead limit exceeded will come, if your application is spending too much of time on GC.

This error means that the GC tried to free memory but was pretty much unable to get anything done. By default it happens when the JVM spends more than 98% of the total time in GC and when after GC less than 2% of the heap is recovered. 

You neeed to examine your application and close the resources so that they can be freed by GC

Fairoz
  • 1,616
  • 13
  • 16
  • can you please help me out by pointing out in the code. I tried putting every statement in finally block i have updated and edited the please go through it once. – Himanshu Ray Jul 21 '17 at 13:37
  • Stack trace suggest that, you are iterating over loop, "java.util.LinkedList.listIterator(LinkedList.java:868)" I am not sure for how many iterations you are iterating on. in finally block try to close ps2, rs2 and con objects as well. – Fairoz Jul 21 '17 at 14:12
  • I tried closing all resources but it is not helping. i have changed Xmx settings allocated more memory. My pc is freezing now when i am running the web app. Because of more allocated memory java is using above 3gb of memory sometimes. – Himanshu Ray Jul 31 '17 at 18:15