若是只关心具体过程,可直接回归正途的处理逻辑
原文连接:http://www.javashuo.com/article/p-plzezhmt-cv.htmlhtml
内存占用率达80%+左右,而且持续上涨,最高点到94%
java
yongGC比较频繁,在内存比较高的时候,伴有FullGC
算法
线程个个数比较多,最高点达到2w+(这个比较重要,惋惜是后面才去关注这点)
数据库
fastJosn error
安全
调用翻译接口识别语种服务错误
网络
对接算法提供的二方包请求错误
多线程
在start启动的时候,启动了一批定时任务
并发
定时任务中启动了调整线程的定时任务
异步
启动调整任务
jvm
top,观察内存占用率(这里图是重启以后一段时间的)可是cpu占用率比较高,很快就降下去了,这里耽误了一下时间,top -Hp pid,确认那个线程占用率高,jstack看了下对应的线程在做甚
确认线程是否指定大小,未发现指定,使用的默认值大小
cat /proc/{pid}/status (线程数居然这么多)
因为线程数比较多,而依然能够建立,查看Linux普通用户所容许建立的进程数,使用命令:cat /etc/security/limits.d/90-nproc.conf ,值比较到,远超当前的个数
线程信息
线程状态
若是每次都new线程而不结束,gc中线程是root节点,若是线程没有结束,不会被回收,因此若是建立大量运行的线程,会致使内存占用量上升,可是线上到底能建立多少线程呢?
方法开始(每次都初始化一个新的客户端,底层封装使用httpAsyncClient,httpAsyncClient使用NIO模型,初始化包含一个boss,10个work线程)
方法结束(方法结束都调用了shutdow)
根据现象和对应线程堆栈信息,能肯定线程就是在这边溢出,客户端的shutDown方法关闭线程池失效,致使因为初始的线程都是NIO模式,没有被结束,因此线程一直积压增长,可修改成单例模式,限制系统使用一个线程池,上线后解决问题