onlyliuxin / coding2017

218 stars 643 forks source link

关于线上服务器jetty占用内存猛涨的问题 #498

Open hashRui opened 7 years ago

hashRui commented 7 years ago

现在我们有个项目(JDK1.8)通过jetty发布到测试环境服务器上时 jetty占用的内存是700M左右;没人使用该服务,jetty占用的内存也一个小时就飙升到1.5G左右;我所了解的jetty服务器占用了内存应该就是JVM占用的内存;

通过jmap -heap 查看JVM的堆使用情况,GC日志,好像一切都正常;

整个堆大概占了380M左右,新生代120M左右 老生代 260M左右 GC日志显示GC的频率并不高, 但是只是项目刚发布的时候(jvm启动到50S以内)进行了几次Full GC ,其它时候都是新生代的gc, 没人访问的时候有时100S 1000S 甚至1个小时才发生一次新生代gc;通过eclipse的 MAT 分析好像也不是内存泄漏 或者内存溢出的问题,然后感觉jetty 占用内存彪升应该不是堆引起的,因为启动设置了

然后我怀疑是直接内存占用了内存,因为没有触发Full GC 导致直接内存的垃圾没有被回收掉,所以他一直在吃,然后我又通过 -XX:MaxDirectMemorySize=200M 设置了直接内存的最大值为200M,想如果jetty内存的彪升是因为直接内存的话,那么直接内存的占用超过了200M就会触发Full GC,但是经过一晚上 jetty占的内存还是上来了 GC 日志却显示没有发生Full GC,然后我感觉好像也不是直接内存这一块吃的内存;

然后通过jmap -heap 看到元空间的 最大值是512M 不知道是不是元空间吃了内存,然后我又将元空间的最大值设置成100M 然后jetty占的内存还是往上涨, 但是服务器也没什么异常,期间还是没有发生Full gc

服务器的内存是4G 然后现在jetty最多的时候占用到了2G 但是我查看或判断jvm运行时区各个区域占用的大小,感觉并没有什么问题,堆最多最多400M,直接内存200M 元空间最多100 方法区、程序计数器,两个栈,应该也吃不了多少内存吧。 我纳闷2G-400M-200M 剩下的1G多内存哪儿去了呢... 如果控制不住的话,线上环境这服务器内存爆了怎么办...

wayss000 commented 7 years ago

不知道这个是否可以帮助你 http://www.cnblogs.com/ibook360/p/3171647.html https://blog.chou.it/2014/03/java-consume-huge-memory-on-64bit-linux/

hashRui commented 7 years ago

项目里没有太多涉及NIO 的操作代码,而且是没什么访问量的情况下就飙升了,很是疑惑