值得阅读的内存泄漏说明总结和Tomcat调优
固然对内存泄漏的研究有了明晰的功效,然则tomcat占用内存一连升高得不到开释的题目照旧没有谜底。此刻通过监控软件可以明晰看到Heap的内存行使接纳很正常,然则通过使命打点器监控看到的Tomcat占用内存却只升不减。 Tomcat是Java写的,运行在JVM之上,以是tomcat的行使的堆内存巨细是不行能高出JVM界说的堆巨细。以是Jprofile监控的Heap行使环境和从使命打点器看到Tomcat行使内存必定不完全一样,除了堆内存必定尚有之外的内存。那么尚有什么内存呢?上面先容内存构成时有个直接内存,当发明尚有直接内存这个对象时,感受产生了新大陆一样,隐约约约感受题目的要害就在这里。 Part4.直接内存和NIO 又是一顿查资料相识直接内存和NIO相干的内容。按照官方文档的描写: A byte buffer is either direct ornon-direct. Given a direct byte buffer, the Java virtual machine will make abest effort to perform native I/O operations directly upon it. That is, it willattempt to avoid copying the buffer's content to (or from) an intermediatebuffer before (or after) each invocation of one of the underlying operatingsystem's native I/O operations. byte byffer可所以两种范例,一种是基于直接内存(也就长短堆内存);另一种长短直接内存(也就是堆内存)。 对付直接内存来说,JVM将会在IO操纵上具有更高的机能,由于它直接浸染于当地体系的IO操纵。而非直接内存,也就是堆内存中的数据,假如要作IO操纵,,会先复制到直接内存,再操作当地IO处理赏罚。 从数据流的角度,非直接内存是下面这样的数据链: 当地IO-->直接内存-->非直接内存-->直接内存-->当地IO 而直接内存是: 当地IO-->直接内存-->当地IO 很明明,再做IO处理赏罚时,好比收集发送大量数据时,直接内存会具有更高的服从。 NIO(New IO)是基于基于通道(Channel)缓和冲区(Buffer)举办操纵,数据老是从通道读取到缓冲区,可能从缓冲区写到通道中。详细信息有乐趣可以自行上网查。 这个时辰溘然看到一个帖子里的回覆说Tomcat8默认通讯方法就是回收NIO方法,这个时辰感受看到但愿之光了,立马就去看那边用到了了NIO。其后在tomcat-coyote.jar中找到了,这个coyote是用来处理赏罚Tomcat底层的socket,并将http哀求、相应等字节约层面的对象,包装成Request和Response两个类,供容器行使。以是意味着每一个前端哀求城市颠末这个处理赏罚了。下图源码中被圈中的代码就是分派直接内存的代码。 我们再点进去可以看到在jdk的源码平分派直接内存有个reserveMemory的函数,在每次分派直接内存的时辰城市执行这个整理函数,然后再点进去有个大发明,在这个整理内存函数内里居然有手动挪用gc的代码。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |