加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (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的JVM设置参数内里仿佛有一个是忽略代码内里挪用system.gc()的设置参数。由于这个tomcat容器是被其他单元下发的已经做过优化的,以是内里有一堆的设置参数。个中被我标绿的这个-XX:DisableExplicitGC的浸染就是不相应代码内里手动挪用system.gc(),看下图:

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

上面我们可以看到一堆的设置,内里设置寄义我们后头再讲。这个时辰我觉得我已经找到了题目的本质,因为direct Memory在堆外,以是对young gen 的gc进程中是不会接纳的。JVM只会在old gen GC(full GC/major GC可能concurrent GC都算)的时辰才会对old gen中的工具做reference processing,而在young GC时只会对young gen里的工具做reference processing。也就是说,做full GC的话会对old gen做reference processing,进而能触发Cleaner对已死的DirectByteBuffer工具做整理事变。而假如很长一段时刻里没做过GC可能只做了young GC的话则不会在old gen触发Cleaner的事变,那么就也许让原来已经死了的、但已经提拔到old gen的DirectByteBuffer关联的direct Memory得不到实时开释,这么说明看来这里就是题目的基础了。。。

那我们直接把谁人参数删掉不就好了吗,我想了想本身的代码内里也没写过system.gc以是应该影响不大,然后就坚决去掉了谁人参数随手也配置了个直接内存巨细,设置参数是-XX:MaxDirectMemorySize。这个直接内存不配置时,默认巨细是最大堆巨细,看下图源码。

这么修改完之后又开始做压力测试,这次看到内存很不变,测试二十多个小时,内存根基增添到两个多G就没再涨了,神色相等开心。然后我再去搜查GC日记发明公然呈现了许多system.gc的日记,这个之前都是没见过的,看下图:

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

本觉得这次说明到这就竣事了,然则没想到后头尚有新发明,把我本觉得下了定论的谜底又颠覆了。。。有点本身打本身脸的感受‍♂️

Part5.Tomca设置和调优

在说明GC日记的时辰,我看到压力测试中GC日记中Full gc的次数有点频仍,并且这种Full gc是Stop-the-world的,很影相应用的相应时刻,从GC日记中可以看到根基一次Full GC耗时要一秒多,频率高的话很影响机能。然后我又开始搜资料,搜资料的进程中发明Tomcat8默认用NIO是指在linux处事器下,而我是在Windows的处事器上跑的。。。然后我发明Tomcat支持三种吸取哀求的模式,别离是:BIO,NIO,APR,个中NIO就是我们上面提到的在linux处事器上默认的模式。网上有人对这三种模式别离作了机能测试,发明APR模式是三种模式内里机能最好的,这种方法是从操纵体系级别办理异步IO题目,也是Tomcat运行高并发应用的首选。可是开启较量贫困,必要一些特另外jar包,有乐趣的也可以自行查资料相识一下。我上面也提到了我这里用的Tomcat是颠末优化的,然后我打开server.xml看了一眼,功效两眼一黑,我用的Tomcat疑似回收的就是APR这种模式,由于我看到Server.xml中包括这么一句设置:

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

(编辑:湖南网)

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

热点阅读