基础
内存泄露(Memory Leak)
- java中内存都是由jvm管理,垃圾回收由gc负责,所以一般情况下不会出现内存泄露问题,所以容易被大家忽略。
- 内存泄漏是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成内存空间的浪费称为内存泄漏。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,需要自主观察,比较严重的时候,没有内存可以分配,直接oom。
- 主要和溢出做区分。
内存泄露现象
- heap或者perm/metaspace区不断增长, 没有下降趋势, 最后不断触发FullGC, 甚至crash.
- 如果低频应用,可能不易发现,但是最终情况还是和上述描述一致,内存一致增长
perm/metaspace泄露
- 这里存放class,method相关对象,以及运行时常量对象. 如果一个应用加载了大量的class, 那么Perm区存储的信息一般会比较大.另外大量的intern String对象也会导致该区不断增长。
- 比较常见的一个是Groovy动态编译class造成泄露。这里就不展开了
heap泄露
比较常见的内存泄露
- 静态集合类引起内存泄露
- 监听器:但往往在释放对象的时候却没有记住去删除这些监听器,从而增加了内存泄漏的机会。
- 各种连接,数据库、网络、IO等
- 内部类和外部模块等的引用:内部类的引用是比较容易遗忘的一种,而且一旦没释放可能导致一系列的后继类对象没有释放。非静态内部类的对象会隐式强引用其外围对象,所以在内部类未释放时,外围对象也不会被释放,从而造成内存泄漏
- 单例模式:不正确使用单例模式是引起内存泄露的一个常见问题,单例对象在被初始化后将在JVM的整个生命周期中存在(以静态变量的方式),如果单例对象持有外部对象的引用,那么这个外部对象将不能被jvm正常回收,导致内存泄露
- 其它第三方类
本例(线程泄露)
本例现象
- 内存占用率达80%+左右,并且持续上涨,最高点到94%
- yongGC比较频繁,在内存比较高的时候,伴有FullGC
- 线程个个数比较多,最高点达到2w+(这个比较重要,可惜是后面才去关注这点)
- 日志伴有大量异常,主要是三类
- fastJosn error
- 调用翻译接口识别语种服务错误