0

How i can prevent this?

This is happen when i update profile details using ajax. I call updateprofile servlet in ajax call..heap memory is 605487104

Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" java.lang.OutOfMemoryError: Java heap space
    at java.util.concurrent.ConcurrentHashMap$Values.iterator(Unknown Source)
    at java.util.AbstractCollection.toArray(Unknown Source)
    at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1427)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:301)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:90)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1374)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1530)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1540)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1519)
    at java.lang.Thread.run(Unknown Source)
Exception in thread "http-bio-8080-exec-8" java.lang.OutOfMemoryError: Java heap space
    at com.mysql.jdbc.Buffer.getBytes(Buffer.java:198)
    at com.mysql.jdbc.Buffer.readLenByteArray(Buffer.java:318)
    at com.mysql.jdbc.MysqlIO.nextRow(MysqlIO.java:1366)
    at com.mysql.jdbc.MysqlIO.readSingleRowSet(MysqlIO.java:2333)
    at com.mysql.jdbc.MysqlIO.getResultSet(MysqlIO.java:435)
    at com.mysql.jdbc.MysqlIO.readResultsForQueryOrUpdate(MysqlIO.java:2040)
    at com.mysql.jdbc.MysqlIO.readAllResults(MysqlIO.java:1443)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1777)
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3249)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1268)
    at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1403)
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76)
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208)
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1953)
    at org.hibernate.loader.Loader.doQuery(Loader.java:802)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2037)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:86)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:76)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3293)
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:496)
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:477)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090)
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:1005)
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:998)
    at com.dao.StudentService.updateEducationStudentProfile(StudentService.java:469)
    at com.controller.Student.UpdateStudentProfileServlet.service(UpdateStudentProfileServlet.java:76)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)

my updateprofile.jsp which calls updateprofile function from DAO..

        if(request.getParameter("educationdetail").equals("yes"))
        {

         String school10= request.getParameter("school10");
         String board10= request.getParameter("board10");        
         double mark10= Double.parseDouble(request.getParameter("mark10"));

         String school12= request.getParameter("schoool12");
         String board12= request.getParameter("board12");
         double mark12= Double.parseDouble(request.getParameter("mark12"));

         String ugname= request.getParameter("ugname");
         String uguniversity= request.getParameter("uguniversity");     
         double ugmark= Double.parseDouble(request.getParameter("ugmark"));

         String pgname = null,pguniversity=null;
         double pgmark = 0;
         long heapsize=Runtime.getRuntime().totalMemory();


        Runtime runtime = Runtime.getRuntime();
        // Run the garbage collector
        runtime.gc();

        StudentService objStudentService = new StudentService();
          objStudentService.updateEducationStudentProfile(request.getSession(false).getAttribute("student_studentid").toString(), school10, board10, mark10, school12, board12, mark12, ugname, uguniversity, ugmark, pgname, pguniversity, pgmark);

1 Answers1

1

You need to take a look at the JVM memory parameters. actually you can set the as much memory as you want to your JVM, not this may not prevent memory leak but its important to know:

-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

so in your case you can set the much memory as in the another machine. so you machine will not take more RAM than the Xmx value

and you may want to check this parameters also, this will prevent the Premature object. and speed up your GC activity

-XX:MaxNewSize=  
-XX:NewSize=614m// 614 is an example value, it good to set it by 30% of your xmx value.

also you may tell you JVM what type of GC to use like :

-XX:+UseConcMarkSweepGC
Salah
  • 8,567
  • 3
  • 26
  • 43