有段时间线上出现Full GC时间过长导致系统响应慢,这里先粗略的记录下相关信息:
jvm参数配置:
Xms与Xmx相同:4096m
Xmn:1576m
非堆:512
垃圾回收器使用的是CMS
基本上两天老年代会增长近2G未回收的对象,dump出来的文件里存在大量的数据库连接对象:connectionPhantomRefs,后来换成公司自研的数据库连接池观察两天后老年代使用量基本上维持在256M,下面是dump文件有关内容:
点击CurrentHashMap,右键后List objects > with incoming references查看是哪些对象引用了该对象
可以明显看到是connectionPhantomRefs
这里有几个疑问还需要搞明白:
1,连接池配置了连接数量的上下限和存活时间,为什么还会产生这么多的连接对象
2,这么多的连接对象为什么没被及时回收
贴几个相关的连接:
https://blog.csdn.net/yl_hahh...
里面有分析引用list objects :
with incoming references 将列出哪些类引入该类;
with outgoing references 列出该类引用了哪些类
https://blog.csdn.net/u010657...
这里有提到mysql-connector-java 5.1.46启用线程去不断地清理被 GC 的数据库连接
https://zhuanlan.zhihu.com/p/...
这里有提到DirectByteBuffer的堆外内存的回收,就是依赖PhantomReference实现
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。