Mongo Java连接内存泄漏
我正在以以下方式构建MongoClient连接:Mongo Java连接内存泄漏,java,mongodb,memory-leaks,Java,Mongodb,Memory Leaks,我正在以以下方式构建MongoClient连接: public static synchronized MongoClient getInstance(String mongoDbUri) { try { // Standard URI format: mongodb://[dbuser:dbpassword@]host:port/dbname if( mongoClient == null ){ m
public static synchronized MongoClient getInstance(String mongoDbUri) {
try {
// Standard URI format: mongodb://[dbuser:dbpassword@]host:port/dbname
if( mongoClient == null ){
mongoClient = new MongoClient(
new MongoClientURI(mongoDbUri));
}
} catch (Exception e) {
log.error(
"Error mongo connection : ",
e.getCause());
}
return mongoClient;
}
在运行多个事务的一段时间内,我看到一些内存被应用程序占用,而应用程序并没有被释放
当分析堆转储时,发现类的内存消耗最大
com.mongodb.internal.connection.PowerOfTwoBufferPool
mongo客户端正在尝试连接到mongos实例。应用程序在3个碎片上有3个副本集,一个配置服务器保存元数据
为了增加更多细节,我有一个spring托管bean,用@Component注释。对于调用上述方法的bean,有一个@PostConstruct注释。在spring类中,我们使用Mongo客户端执行插入/更新/创建
谢谢。实际上是一个缓存,因此乍看起来可能像是内存泄漏
有关详细信息,请参见:
。。。这
由于PowerOfTwoBufferPool是一个缓存,因此需要行为。因此
可能看起来像个漏洞
简言之,PowerOfTwoBufferPool拥有许多
ByteBuffer实例,每个池包含一组大小相等的
缓冲区。最小尺寸为1K,最大尺寸为16MB,
两种尺寸的功率从1K增加到16MB。每个的大小
大小相等的缓冲池不受限制,由
应用程序使用情况。一旦缓冲区缓存到池中,它就会保留
合并(或正在使用)直到MongoClient关闭。因此,它是
完全期望在JVM状态的反省过程中,内容
所有的池都会显示为泄漏嫌疑犯,就像任何缓存一样
PowerOfTwoBufferPool的存在是为了减少GC负载。它是
众所周知,JVM中的现代垃圾收集器
大型分配与小型分配不同,因此如果应用程序
如果我们不做任何大型对象池(比如这些缓冲区)的话
将产生增加GC负载的效果,因为垃圾
收集器收集这些大对象所做的工作比它所做的要多
做小的。这样做的代价是司机坚持下去
可由应用程序的其他部分使用的内存。在里面
特别是,它拥有足够的内存来处理最大的峰值
应用程序到目前为止看到的负载
请为该连接创建代码显示更多上下文。正如@RobertMoskal所说的,这个“小片段”绝对不足以诊断“内存泄漏”。我还想说,这根本不是“泄密”。但事实上,您正在一次又一次地调用您的“实例”,而它应该是一个依赖项调用。你解决问题了吗?我面临着和你一样的情况。这个问题可能与指向这个强大的缓冲池的Eclipse内存分析器有关。这只是在对象图中保留了对类加载器的引用,实际上这不是内存泄漏。只是一个缓冲池,以减少垃圾收集对性能的影响。此处对该条件进行了说明: