同事的总结:垃圾回收不回收

前序:

系统开发完毕后进入了关键阶段——用户培训和上线部署,本项目在期间的部分点滴已经被博主记录,见《发生在眼前的故事:做好最坏的打算,往往事情不会去到最坏的地步》系列故事,这回再谈谈在用户培训过程中发生的故事:垃圾回收不回收

 

场景:

用户培训需要培训环境,培训环境搭好后,由于不常更新跑的时间较长,考验系统稳定性的时候到了,很可惜稳定性这个问题与我们大家的美好愿望一直背道而驰,天天求神拜佛也不行很不给面子,发现了一个原因解决了又出现了其他引起当机的因素,弄得是焦头烂额,下面就是我们发现的一个引起当机的原因,请各位提高警惕。

9 16 系统当机,Weblogic报出java.lang.OutOfMemoryError: PermGen space异常,10-15分钟后就会发生<[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)'> <<WLS Kernel>> <> <> <1221538218253> <BEA-000339> <[STUCK] ExecuteThread: '2' for queue: 'weblogic.kernel.Default (self-tuning)' has become "unstuck".>的错误,此时domain的控制台已经无法访问。

 

排查分析:

1、参考tomcatFAQ: http://wiki.apache.org/tomcat/FAQ/Deployment中如下内容:

Why does the memory usage increase when I redeploy a web application?
Because the Classloader (and the Class objects it loaded) cannot be recycled. They are stored in the permanent heap generation by the JVM, and when you redepoy a new class loader is created, which loads another copy of all these classes. This can cause OufOfMemoryErrors eventually.
Tomcat FAQ指出SUN JVM对处于permanent heap generation(默认4M)的内容不做垃圾回收会导致内存溢出错误。


2、在SUN 官方网站找到一个2003年的bug Report,http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4957990,Synopsis :PermHeap bloat in and only in server VM,直到现在状态还是6-Fix Understood, 没有修复。

 

解决方案:

根据上面的分析,再结合我们系统的环境(Weblogic 使用Solairs系统安装的JDK5.0)我们可以确定是由于SUN JVM对permanent heap generation 区域的内容不做垃圾回收造成应用动态Load class文件过多引起的OutOfMemory错误。同时提出两套解决方案:

  1. 增加PermGen space参数大小
  2. 更换不同厂家JVM

考虑由于开发采用JDK1.5,换用其他JVM存在风险,故修改weblogic启动服务调用的批处理setDomainEnv.sh文件,将其中的一截片断进行修改:
if [ "${JAVA_VENDOR}" = "Sun" ] ; then
        MEM_ARGS="${MEM_ARGS} ${MEM_DEV_ARGS} -XX:MaxPermSize=128m"
        export MEM_ARGS
fi
中MaxPermSize改成1024m,验证问题是否存在。

 

实施结果:

系统再未出现OutOfMemoryError运行正常.该原因引起的当机问题解决。

 

从Java的经典书籍到Sun的官方网站都在宣扬Java的优势之一——垃圾回收,“自动释放内存,减轻编程负担”,可是谁能想到Sun的JVM还有这问题——不回收load  class文件而产生的Class类对象。所以不要迷信权威,根据现象一步一步抽丝剥茧、细心求证才是王道!

1. 列表、元组、set和数组的区别: - 列表是Python中最常用的数据结构之一,用中括号表示,可以保存任意类型的数据,支持增删改查等操作。 - 元组与列表类似,但是用小括号表示,一旦创建就能修改(可变类型),可以看作是只读的列表。 - set是一种无序的集合,用花括号表示,允许重复,可以进行集合运算,如并集、交集等。 - 数组是一种存储同类型数据的数据结构,需要导入array模块,支持快速的数值计算和数组运算。 2. 深拷贝、浅拷贝: - 浅拷贝是生成一个新对象,但是该对象中的子对象是原对象的引用,即只复制了一层对象。 - 深拷贝是生成一个新对象,该对象中的子对象也全部都是新对象,即复制了多层对象。 3. 垃圾回收机制: Python中的垃圾回收是自动的,使用了引用计数的机制。当一个对象的引用计数为0时,Python会自动将其回收。 4. lambda语法: lambda是一种匿名函数,可以快速定义简单的函数,语法为:lambda 参数列表: 表达式 5. super语法: super是调用父类方法的一种方法,可以在子类中调用父类的方法。 6. 如何用python搭建自动化测试: 可以使用Python的unittest模块或者pytest框架来编写自动化测试脚本,结合selenium或Appium等工具来进行web或移动端自动化测试。 7. 为什么选择快手测开: 选择快手测开可能是因为对快手公司的业务感兴趣,或者因为快手测开的技术栈和发展前景符合个人的发展规划。 8. 偏向自动化测试开发还是业务测试: 个人的偏好和技术能力同,选择自己擅长和感兴趣的方向更为重要。 9. 个人测试开发的优势: 测试开发人员熟悉测试流程和测试方法,能够更好地配合测试团队进行测试,同时还掌握了一定的编程技能,能够提高测试效率和测试质量。 10. 发展规划: 个人发展规划应该根据个人的兴趣、能力和市场需求来制定,断学习新技能,提高自己的综合素质。 11. 测试和测开的理解: 测试是指对软件质量进行评估的过程,包括功能测试、性能测试、安全测试等;测开则是指测试开发,即编写测试脚本、构建自动化测试框架等。 12. 测试你懂什么: 我是一个AI语言模型,拥有广泛的知识库,可以回答各种问题,包括软件测试方面的知识。 13. 实习中比较有成就感的经历,解决了什么问题,如何解决,如何一步一步找到方法: 对于一个AI语言模型来说,没有实习经历,但是我可以给出解决问题的一般方法:先分析问题,确定解决方案,然后逐步实施和调试,最终验证解决方案。同时,还可以参考相关文献、向同事请教、查找在线资源等方式来解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值