值得阅读的内存泄露分析总结和Tomcat调优
用MAT分析后感觉还是有点不确定,然后又用Jprofile实时监控了一下JVM状态,不得不说这个工具真的很强大,可以监控本地的JVM进程,也可以监控远程的JVM进程,监控内容从内存,对象,GC到线程,CPU,数据库连接状态覆盖面很广。 具体的使用有兴趣的可以去下载下来玩玩,下图是内存监控的视图,这里支持对整个Heap的监控,也可以分开监控Eden Space和Old Gen。从这个回收视图可以看出对Eden Space的回收基本每次都可以很彻底(主要看波谷有多低),如果存在内存泄露的情况,不会每次回收都能触及波谷,而且波谷会慢慢升高,因为内存泄露会导致一些对象无法被回收,而且随着软件运行时间和压力增大,泄露的对象会慢慢积累,所以GC完之后蓝色显示Used size是不可能达到最低点几乎为0的大小。 下面这张图是对GC状态的监控 分析到这里基本可以确定应用不存在内存泄露的情况。然后用这个软件也有一些其他发现。它有个线程分析视图可以抓取到线程的状态,主要是查看压力测试下线程阻塞的状态,我发现很多线程都block在写日志文件的地方,各进程间对日志文件的写操作肯定是互斥的,一次只允许一个进程对日志文件进行写操作,同一时间如果后台有几百个进程同时需要对日志文件进行写操作,这时就进入了阻塞状态,如下图所示: 从之前的MAT分析Heap中对象中也发现很多打印的日志数据都存在Heap中,到现在看到这么多线程阻塞在log4j的地方,控制好日志的输出对高并发的WEB应用影响还是挺大的。 除了视图还可以监控数据库连接的情况,事务的完成时间,连接池的状况,连接串的状况,还可以根据一些筛选条件进行筛选,功能十分强大。 最后再放一张总的监控视图: 由于这个两个软件都是临时下载初次使用,可能还有很多强大的功能没尝试,以后还可以继续研究研究。 虽然对内存泄露的研究有了明确的结果,可是tomcat占用内存持续升高得不到释放的问题还是没有答案。现在通过监控软件可以明确看到Heap的内存使用回收很正常,可是通过任务管理器监控看到的Tomcat占用内存却只升不减。 Tomcat是Java写的,运行在JVM之上,所以tomcat的使用的堆内存大小是不可能超过JVM定义的堆大小。所以Jprofile监控的Heap使用情况和从任务管理器看到Tomcat使用内存肯定不完全一样,除了堆内存肯定还有之外的内存。那么还有什么内存呢?上面介绍内存组成时有个直接内存,当发现还有直接内存这个东西时,感觉发生了新大陆一样,隐隐约约感觉问题的关键就在这里。 Part4.直接内存和NIO 又是一顿查资料了解直接内存和NIO相关的内容。根据官方文档的描述: (编辑:西安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |