加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

值得阅读的内存泄漏说明总结和Tomcat调优

发布时间:2019-03-02 14:30:09 所属栏目:业界 来源:今日头条
导读:写在最前面,运行情形:tomcat8,jdk1.8,windows server 2008内存16G,软件LoadRunner11,MAT和JProfile9.1。 题目描写:前段时刻碰着一个很稀疏的题目,开拓的WEB应用,常常会毫无症状的宕掉,然后抓了线程栈看下,发明之前写的数据库链接池呈现了阻塞的

这个看名字就知道是用来检测是否存在内存泄漏的,后头看到Tomcat打点页面自带一个Find Leaks的成果,不知道是不是和这个有相关。然后我进这个类看了下就有了新发明,在这个类内里我看到GC日记内里执行system.gc的谁人类名!看下图:

这里这个gcDaemonProtection的参数在这个类的上面已经界说了,默认是true。这就意味着假如不手动修改设置文件,必定会进这个判定。内里用反射挪用了sun.misc.GC的requestLatency要领。我点进这个sun.misc.GC类内里,看到了GC日记内里谁人run的处所,看下图:

看名字这是一个保卫历程,内里挪用了system.gc(),这下可以必定的是GC日记里频仍呈现的Full GC操纵就是这里引起的(后头我又抓了许多次线程栈发明挪用GC的只有这一个类)。到这里我终于可以确定为什么GC日记内里那么多Full GC了,都是由于Tomcat设置内里加载这个内存检测的Class导致的。那有什么步伐可以停止这个呢,其后网上查了下,有这么几种要领:

① 直接去掉这个设置

② 将上面谁人默认设置true的参数改成false,将Server.xml内里的对应那条设置中增进下面的一段:

  1. gcDaemonProtection=”false” 

③ 增进-XX:+ExplicitGCInvokesConcurrent设置,这个参数不会像DisableExplicitGC一样强行忽略手动挪用system.gc,而是在碰着挪用system.gc时挪用CMS垃圾接纳要领。由于上面提过CMS是搁浅最短的GC要领,这样就可以停止由full

GC带来的长GC pause引起的机能题目。

颠末测试我是回收的第三个要领,到最后内存增添的题目获得了办理。最后我们看一下GC日记中CMS的耗时,看下图:

值得阅读的内存泄漏说明总结和Tomcat调优

这里被我用红线划得就是mark和remark的两个阶段,由于这有这两个阶段是Stop-the-world的,可以看到耗时和Full GC比起来要短许多。

最后Tomcat的JVM设置参数被我修改为下图:

值得阅读的内存泄漏说明总结和Tomcat调优

这内里有几个较量重要好用的我或许说一下:

-Xloggc:gc.log -XX:+PrintGCDetails,这个参数会配置打印GC日记,这次题目,靠GC日记说明出了许多有效的对象。

-XX:+UseConcMarkSweepGC ,选用CMS作为垃圾接纳要领

-XX:+ ExplicitGCInvokesConcurrent,用这个替代了DisableExplicitGC,每次碰着system.gc时挪用一次CMS接纳,并不是直接Stop-the-world。

-XX:+UseCMSCompactAtFullCollection,在每次CMS网络器在完成垃圾接纳之后做一次内存碎片清算。

Tomcat的线程池也是可以本身设置的,包罗可接管的毗连数之类的,这里我就不睁开说了,码字也不轻松…

其他尚有许多有乐趣的可以自行相识。

总结

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读