weblogic会莫名的宕机,宕机日志跟以往的不同:
Caused By: java.lang.VirtualMachineError: out of space in CodeCache for adapters
at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:141)at net.sf.jasperreports.engine.fill.JREvaluator.init(JREvaluator.java:88)
at net.sf.jasperreports.engine.fill.JRCalculator.init(JRCalculator.java:111)
at net.sf.jasperreports.engine.fill.JRFillDataset.initCalculator(JRFillDataset.java:469)
at net.sf.jasperreports.engine.fill.JRBaseFiller.<init>(JRBaseFiller.java:529)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:88)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:103)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.<init>(JRVerticalFiller.java:61)
at net.sf.jasperreports.engine.fill.JRFiller.createFiller(JRFiller.java:153)
at net.sf.jasperreports.engine.fill.JRFiller.fill(JRFiller.java:55)
at net.sf.jasperreports.engine.JasperFillManager.fill(JasperFillManager.java:446)
at net.sf.jasperreports.engine.JasperFillManager.fillReport(JasperFillManager.java:849)
at com.gg.datareport.reportform.appservice.impl.JRService.getJasperPrint(JRService.java:1017)
at com.gg.datareport.reportform.appservice.impl.JRService.reportHTMLByTemplToResp(JRService.java:1123)
代码缓存区满,原因是第三方报表工具用到了groovy,动态生成了很多类,网络上解释为:
Code Cache用满一方面是因为空间可能不够用,另一方面是Code Cache是不会回收的,所以会累积的越来越多(其实在不采用groovy这种动态更新/装载class的情况下的话,是不会太多的),所以解法一可以是增大code cache的size,可通过在启动参数上增加-XX:ReservedCodeCacheSize=256m(Oracle JVM Team那边也是推荐把code cache调大的),二是启用code cache的回收机制,可通过在启动参数上增加:-XX:+UseCodeCacheFlushing来启用。
调整1:将现场的weblogic启动参数调整为:-XX:ReservedCodeCacheSize=1024m,宕机的频率下降,不过还是有宕机。
调整2:再加上参数-XX:+UseCodeCacheFlushing ,到目前为止很稳定。
总结:不过要解决根上的问题,还是要看下代码,检查哪里没有内存泄露的问题。这个第三方的报表工具是新加入的组件,新的东西会带来新的问题,所以问题诊断也要与时俱进。