2

I'm using Netbeans and Java 1.7 and trying to develop a web application with Struts2, Hibernate and JasperReport. I'm using these simple coding and database which is only have less than 10 records, but after I'm redeploying and running the application many times in my NetBeans, I get java.lang.OutOfMemoryError PermGen space. Everything back to normal after I reset Tomcat, but it's happen again after I redeploy and run it.

I've tried many solution in SO and other website including increase PremGen memory, but it won't help.

Is there something wrong in my code below ?

Admin.java (for getting data from database and show it into JSP file)

public class Admin extends ActionSupport {

    @Override
    public String execute() throws Exception {
    try {
            Session s = HibUtil.getSessionFactory().openSession();
            s.beginTransaction();

            this.setClient(s.createQuery("FROM Client").list());

            s.getTransaction().commit();
            s.close();
            return super.SUCCESS;
        }
        catch(HibernateException he) {
            he.printStackTrace();
            return super.ERROR;
        }
    }
// Some setter and getter method
}

Admin.java (Try to use plain JDBC because using Hibernate is getting OOM error)

public class Admin extends ActionSupport {

    @Override
    public String execute() throws Exception {
        Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
        try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","USER", "user")) {
            PreparedStatement ps = conn.prepareStatement("SELECT * FROM USER.CLIENT");
            ResultSet rs = ps.executeQuery();
            client = new ArrayList<>();
            while(rs.next()) {
                Client c = new Client();
                c.setIndex(rs.getBigDecimal("INDEX"));
                c.setUserName(rs.getString("USER_NAME"));
                c.setClientName(rs.getString("CLIENT_NAME"));
                client.add(c);
            }
            return super.SUCCESS;
        }
    }
// Some setter and getter method
}

PrintReport.java (To Print report using JasperReport)

public class PrintReport extends ActionSupport {

    public PrintReport() {
    }

    public String printUser() throws Exception {
        String reportSourceFile = "/report/userclient_report.jasper"; 

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("WHERE_QUERY_SYNTAX", " WHERE USER_NAME='rico'");

        Class.forName("oracle.jdbc.driver.OracleDriver").newInstance();
        byte[] bytes;
        try (Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl","USER", "user");
                InputStream template = this.getClass().getResourceAsStream(reportSourceFile)) {
            bytes = JasperRunManager.runReportToPdf(template, parameters, conn);
        }

        istream = new ByteArrayInputStream(bytes);

        return super.SUCCESS;
    }

     // Setter and Getter method
}

And here's the error message after it occurs when I use plain JDBC

java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)
    at org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:138)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:239)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:191)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:73)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:91)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:252)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:100)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:141)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:145)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:171)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:161)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:193)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:189)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at control.intercept.AdminPageAuthentication.intercept(AdminPageAuthentication.java:38)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.interceptor.CreateSessionInterceptor.intercept(CreateSessionInterceptor.java:101)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:54)
    at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:563)
    at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
    at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:724)
Caused by: java.lang.OutOfMemoryError: PermGen space
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(ClassLoader.java:792)
    at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
    at org.apache.catalina.loader.WebappClassLoader.findClassInternal(WebappClassLoader.java:2957)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1210)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1690)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1571)
    at oracle.net.resolver.AddrResolution.resolveAndExecute(AddrResolution.java:384)
    at oracle.net.ns.NSProtocol.establishConnection(NSProtocol.java:594)
    at oracle.net.ns.NSProtocol.connect(NSProtocol.java:229)
    at oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1360)
    at oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:486)
    at oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:715)
    at oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:385)
    at oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:30)
    at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:564)
    at java.sql.DriverManager.getConnection(DriverManager.java:571)
    at java.sql.DriverManager.getConnection(DriverManager.java:215)
    at control.action.PrintReport.printUser(PrintReport.java:38)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:450)
    at com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:289)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:252)
    at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:256)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:167)
    at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:98)
    at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:246)
    at com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:265)

=====EDIT=====

As Michael suggest inside comment, I found out something. I test sequentially and repeatedly for each code below. It looks like the Hibernate 4 code makes the used PermGen memory goes piled-up every time I redeploy and access that action class. The rest code (Plain JDBC & Report action class) didn't get piled-up every time I redeploy the project. They're relatively stable.

So, is there something wrong in that Hibernate code which is the only action class who make this trouble ?

Aleksandr M
  • 23,647
  • 12
  • 63
  • 129
poring91
  • 345
  • 7
  • 20
  • Try increasing permgen space. Xmx and Xms parameter read about them here... http://stackoverflow.com/questions/14763079/what-are-the-xms-and-xmx-parameters-when-starting-jvms – Bilbo Baggins Jul 01 '14 at 09:08
  • 1
    Looks like you are not closing the connection when connecting via plain JDBC. – Anshu Kunal Jul 01 '14 at 09:27
  • 1
    Constants are static fields and should be accessed in the static way and if you extend an `ActionSupport` it has already implemented those constants. – Roman C Jul 01 '14 at 10:09
  • Anshu Kunal, I'm using "try with resource". It will be closed when the *try* block will end. Roman C, are those constants the source of the problem ? – poring91 Jul 01 '14 at 14:14
  • 1
    You should add the PreparedStament and Resulset object to the try. Also is a good practice to have a connection pool in your server to get the jdbc connection more faster – neo_lestat Jul 01 '14 at 14:27
  • Does it happen immediatly, or after some iterations? You might check the memory with VisualVM or another profiler, to find possible memory leaks. – Michael Jul 02 '14 at 04:48
  • Michael, It doesn't happen when the first time I deploy this application. But after modify a few code (even just comment & uncomment code), and save (and redeploy automatically of course) plus run the project again to see the result many times, This error is occured and I didn't know which was the source of this leak. After I use VisualVM (as you suggest), I found out something. So I update my question. – poring91 Jul 02 '14 at 06:35
  • there is one web application available probe.war. deploy it in your tomcat so you can see graph of memory usage and you can find what is the root cause – Avinash Perla May 15 '15 at 04:25

0 Answers0