背景
公司最近一个项目,甲方要求使用国产WEB容器,BES,宝蓝得的WebServer,使用也没啥特殊的配置,直接把WAR包放进去就行了。但是问题后边出现了,服务在经常出现java.lang.OutOfMemoryError: PermGen space,永久代内存溢出,MaxMetaspaceSize 放到1024仍然会出现,但是之前用Tomcat的时候只有256也没啥问题。永久代的内存溢出不常见,我们知道永久代主要是一些类的信息,常量之类的,一般不太会溢出。这个就很奇怪了
分析
运维给到了dump文件,用MAT打开后,在Dominator Tree,中可以发现有个名为BESASWebappClassLoader的类加载器出现了多个实例
打开后可以发现每个实例下边都有相同的class信息
这就说明了同一个类信息,被多个类加载器加载了多遍,这就太奇怪了。
我们找个tomcat的分析下,
可以发现tomcat中的大的类加载器只存在一个实例。
猜测
由于无法直接联系宝蓝得的技术人员,也已经发dump文件发给了销售人员进行转交。具体的原因也无从得知,只能猜测,宝蓝得自己提供的发布组件是否存在问题,未能完全销毁之前的应用信息?下次发布时让运维人员杀掉进城后再发布观察下,