Ошибка PermGen Space во время функции fillReport - PullRequest
0 голосов
/ 20 марта 2012

Я получаю следующую ошибку пространства PermGen при выполнении

    JasperFillManager.fillReport(reportFile.getPath(), parameters, conn);

в следующем блоке кода:

    compileFileName = parameters.get("reportName").toString();
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();

    ServletContext context = (ServletContext) externalContext.getContext();
    HttpServletRequest request = (HttpServletRequest) externalContext.getRequest();
    HttpServletResponse response = (HttpServletResponse) externalContext.getResponse();

    ReportConfigUtil.compileReport(context, getCompileDir(), getCompileFileName());

    File reportFile = new File(ReportConfigUtil.getJasperFilePath(context, getCompileDir(), getCompileFileName()+".jasper"));


    Class.forName(ReportsConstants.DRIVER);
    Connection conn = DriverManager.getConnection(ReportsConstants.DB_ACCESS_URL, ReportsConstants.DB_ACCESS_USER_NAME, ReportsConstants.DB_ACCESS_PASSWORD);

    parameters.put("BaseDir", reportFile.getParentFile());

    JasperPrint jasperPrint =  JasperFillManager.fillReport(reportFile.getPath(), parameters, conn);

Я получаю следующую ошибку:

    Caused by: javax.faces.el.EvaluationException: java.lang.OutOfMemoryError: PermGen space
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
... 19 more
    Caused by: java.lang.OutOfMemoryError: PermGen space
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:141)

Моя среда разработки выглядит следующим образом: JSF, PrimeFaces, Hibernate, JasperReports, Sybase.

Что вы, друзья, предлагаете мне сделать для решения проблемы?

1 Ответ

1 голос
/ 20 марта 2012

Увеличение разрешенного пространства может решить эту проблему. Добавление следующего параметра увеличит его до 128 м

-XX:MaxPermSize=128m

Я не уверен, что вы можете многое сделать в своем коде, чтобы уменьшить количество потребляемого пространства perm gen, поэтому я думаю, что любое решение будет связано с изменением параметров времени выполнения JVM.

Вы также можете попробовать

-XX:+CMSClassUnloadingEnabled -XX:+CMSPermGenSweepingEnabled

также.

...