Java自学者论坛

 找回密码
 立即注册

手机号码,快捷登录

恭喜Java自学者论坛(https://www.javazxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,会员资料板块,购买链接:点击进入购买VIP会员

JAVA高级面试进阶训练营视频教程

Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程Go语言视频零基础入门到精通Java架构师3期(课件+源码)
Java开发全终端实战租房项目视频教程SpringBoot2.X入门到高级使用教程大数据培训第六期全套视频教程深度学习(CNN RNN GAN)算法原理Java亿级流量电商系统视频教程
互联网架构师视频教程年薪50万Spark2.0从入门到精通年薪50万!人工智能学习路线教程年薪50万大数据入门到精通学习路线年薪50万机器学习入门到精通教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程MySQL入门到精通教程
查看: 316|回复: 0

java.lang.OutOfMemoryError: PermGen space的问题解决

[复制链接]
  • TA的每日心情
    奋斗
    2024-4-6 11:05
  • 签到天数: 748 天

    [LV.9]以坛为家II

    2034

    主题

    2092

    帖子

    70万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    705612
    发表于 2021-5-10 07:08:21 | 显示全部楼层 |阅读模式

    一、问题环境

      最近在部署一个web项目时,遇见前台一个发送请求后台tomcat服务器什么都不响应的问题,看了下tomcat的控制台,发现一直在打印以下异常:

    1 Exception in thread "http-apr-8080-exec-2" java.lang.OutOfMemoryError: PermGen space          
    Exception in thread "http-apr-8080-exec-10"
    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)
            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 freemarker.template.Template.<init>(Template.java:166)
            at freemarker.cache.TemplateCache.loadTemplate(TemplateCache.java:447)
            at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:360)
            at freemarker.cache.TemplateCache.getTemplate(TemplateCache.java:235)
            at freemarker.template.Configuration.getTemplate(Configuration.java:578)
            at freemarker.template.Configuration.getTemplate(Configuration.java:543)
            at org.apache.struts2.dispatcher.Dispatcher.sendError(Dispatcher.java:859)
            at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:586)
            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:170)
            at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
            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.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
            at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
    View Code

    上网搜索了下问题原因,网上说PermGen space区域的内存溢出,一般都是因为Tomcat中的部署项目过多导致,tomcat启动时需要加载每个项目的第三方jar,当第三方jar包过多,超过jvm的默认内存(4M)时,就会抛这个异常。我想了下,这个项目我以前在其他机器上也部署过没有内存溢出的问题,现在由于新部署的机器是64位的jre,导致程序有很多修改,尤其是底层和硬件通信模块变动较大,且添加了第三方jar包,不知是否是因为这个原因导致的内存溢出。先试下增大tomcat的jvm内存,试试能否解决该问题。网上还有一人也是遇见这个异常,但是他的原因是因为jasper配置sql的有问题(源网址由于博客园判定非法故无法贴出),我虽然要用到过jasper但是一直没改过应该不是这个原因。

    二、问题解决

      1、按照网上的方法修改tomcat的tomcat/bin/catalina.bat(linux为catalina.sh),在setlocal(第一行)添加如下JAVA_OPTS初始配置(512m后面含有一个空格):

    1 setlocal
    2 JAVA_OPTS="-server -XX:PermSize=256M -XX:MaxPermSize=512m "

      结果修改内存成功了,如果语法有错误,可能会导致tomcat起不来,建议先备份整个tomcat文件夹。但问题原因还是没有解决,而且仔细尝试发现只在调用底层模块时才会出现内存溢出,在未调用底层模块之前是可以正常处理数据库查询请求的。

      2、还有一种tomcat是简化版的,直接运行tomcat.exe就可以启动,没有catalina文件,可以运行tomcatw.exe在java界面配置jvm参数。截图如下(没有尝试):

     

    三、最终结果

      待续。

      

    哎...今天够累的,签到来了1...
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|小黑屋|Java自学者论坛 ( 声明:本站文章及资料整理自互联网,用于Java自学者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 03:30 , Processed in 0.059422 second(s), 30 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表