JVM young GC频繁,内存泄漏

young gc频繁,老年代占用线性上涨

young gc频繁因为产生系统使用log4j1版本在系统中大量使用debug日志输入,导致频繁创建Stringbuilder对象,然后导致年轻代空间不够,执行频繁gc

分析老年代内存泄漏是因为一个对象

image.png

这玩意是个啥呢,是个数据库连接相关的虚引用,每个数据连接对应生产这么一个虚引用对象,这个对象负责在连接对象被回收后通知系统。

在<<深入理解Java虚拟机>>3.2.3中有这么一句话

“为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。”

为啥跑到老年代呢,
一,因为年轻代gc太频繁了,数据库连接对象在短时间内超过15次存活年龄检查。
二,因为数据库连接两个参数
minEvictableIdleTimeMillis=300000 如果连接空闲超过这个时间,就可以被回收。
timeBetweenEvictionRunsMillis=120000 每次检查空闲的时间间隔

就是说数据库连接对象强行被挤到年老代 然后随后可能连接已经释放,但是虚引用一直没有被回收,导致老年代越级越大。

怎么解决
把log4j升级到2版本,然后把日志尽量精细化管理,不要打印无谓的低级别的日志。

你可能感兴趣的:(JVM young GC频繁,内存泄漏)