开发者社区> 问答> 正文

springmvc + hibernate 集成的时候出现PermGen(永久代)内存泄露问题

我把spring 和hibernate集成,如果我修改后台代码,那么tomcat就会重新发布,然后就出现这个问题了。我查了一下stackoverflow ,有说改永久代的大小的,也有说要停止服务器重启,不要重新发布。请问大家都是怎么搞的,然后PermGen我了解是存放类信息的地方,虽然垃圾收集器一般不清理这块,不过信息这么小怎么会爆掉呢,我现在代码里定义的类也没有超过20个,即时是第三方包也不至于吧,我有试过把PermGen的最大调至512m后还是会出现这个问题。

SEVERE: The web application [/NetMall] appears to have started a thread named [MySQL Statement Cancellation Timer] but has failed to stop it. This is very likely to create a memory leak.
Exception in thread "ContainerBackgroundProcessor[StandardEngine[Catalina]]" 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:2818)
    at org.apache.catalina.loader.WebappClassLoader.findClass(WebappClassLoader.java:1148)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1643)
    at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1521)
    at org.apache.catalina.startup.ContextConfig.checkHandlesTypes(ContextConfig.java:1956)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:1919)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsJar(ContextConfig.java:1806)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsUrl(ContextConfig.java:1765)
    at org.apache.catalina.startup.ContextConfig.processAnnotations(ContextConfig.java:1751)
    at org.apache.catalina.startup.ContextConfig.webConfig(ContextConfig.java:1255)
    at org.apache.catalina.startup.ContextConfig.configureStart(ContextConfig.java:882)
    at org.apache.catalina.startup.ContextConfig.lifecycleEvent(ContextConfig.java:317)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:89)
    at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5081)
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:145)
    at org.apache.catalina.core.StandardContext.reload(StandardContext.java:3832)
    at org.apache.catalina.loader.WebappLoader.backgroundProcess(WebappLoader.java:424)
    at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1205)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1391)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1401)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1401)
    at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1380)
    at java.lang.Thread.run(Thread.java:724)

展开
收起
a123456678 2016-03-17 14:09:14 2833 0
1 条回答
写回答
取消 提交回答
  • 是java虚拟机的问题,java其实并不推荐大量使用反射来构造对象,所以这个问题开源社区向Java官方天天提,Java官方一直不予以理会。

    所以其permGen里面的内容不会被清理。而hibernate里面却大量使用反射调用构造器,占用了大量permGen空间。因为调用反射构造器的时候会生成一个反射代理类,这个会重复生成,这个类的信息会保存在permGen里面。

    由于Spring反射的是业务对象,有时候业务对象也被池化或者单例模式管理,所以影响不大。

    但是hibernate反射的是DTO啊,而且是在list里面海量反射,撑爆permGen不是问题。关于ORM框架反射的问题,其实应该用泛型+继承,或者泛型工厂模式来实现,而不是无脑反射。

    2019-07-17 19:05:18
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云服务器ECS内存增强型实例re6全新发布 立即下载
集成智能接入网关APP:优化企业级移动办公网络 立即下载
云效助力企业集成安全到DevOps中 立即下载