周梦康 发表于 2016-11-22 2087 次浏览 标签 : 转载tomcat

http://mp.weixin.qq.com/s?__biz=MzA5Nzc4OTA1Mw==&mid=2659598530&idx=1&sn=b3e52c3f9b78454b680e8874d8b51990&chksm=8be995d0bc9e1cc61faa722dea85e70888ec3395821f40cd4c3b5f6e28ce5891ebc831084f4a#rd

Tomcat对webapp有一套自己的WebappClassLoader,它在启动的过程中会打开应用依赖的jar包来加载class信息,但是过一段时间就会把打开的jar包全部关闭从而释放资源。

然而如果后面需要加载某个新的class的时候,会把之前所有的jar包全部重新打开一遍,然后再从中找到对应的jar来加载。加载完后过一段时间会再一次全部释放掉。所以应用依赖的jar包越多,同时打开的文件句柄数也会越多。打开的文件数太多则会导致JVM无法从文件系统读取jar包,从而导致NoClassDefFoundError

监控方式lsof -p pid

原作者他们的最多打开的文件数为默认的4096,这个就比较容易出问题了,一般大家都会调整为65535。

查看进程的Max Open Filescat /proc/pid/limits

[root@VM_132_97_centos ~]# cat /proc/23931/limits
Limit                     Soft Limit           Hard Limit           Units     
Max cpu time              unlimited            unlimited            seconds   
Max file size             unlimited            unlimited            bytes     
Max data size             unlimited            unlimited            bytes     
Max stack size            10485760             unlimited            bytes     
Max core file size        0                    unlimited            bytes     
Max resident set          unlimited            unlimited            bytes     
Max processes             65535                65535                processes 
Max open files            65535                65535                files     
Max locked memory         65536                65536                bytes     
Max address space         unlimited            unlimited            bytes     
Max file locks            unlimited            unlimited            locks     
Max pending signals       30487                30487                signals   
Max msgqueue size         819200               819200               bytes     
Max nice priority         0                    0                    
Max realtime priority     0                    0                    
Max realtime timeout      unlimited            unlimited            us



👇 下面是我的公众号,高质量的博文我会第一时间同步到公众号,给个关注吧!

评论列表