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版本,然后把日志尽量精细化管理,不要打印无谓的低级别的日志。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文阅读 前言 这段时间懈怠了,罪过! 最近看到有同事也开始用上了微信公众号写博客了,挺好的~给他们点赞,这博客我...
    码农戏码阅读 6,030评论 2 31
  • 转载blog.csdn.net/ning109314/article/details/10411495/ JVM工...
    forever_smile阅读 5,408评论 1 56
  • JVM架构 当一个程序启动之前,它的class会被类装载器装入方法区(Permanent区),执行引擎读取方法区的...
    cocohaifang阅读 1,708评论 0 7
  • 在 Java 中,内存的分配是由程序完成的,而内存的释放则是由 Garbage Collecation(GC) 完...
    Shawn_Dut阅读 5,976评论 3 28
  • 这篇文章是我之前翻阅了不少的书籍以及从网络上收集的一些资料的整理,因此不免有一些不准确的地方,同时不同JDK版本的...
    高广超阅读 15,758评论 3 83