Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongo Java连接内存泄漏_Java_Mongodb_Memory Leaks - Fatal编程技术网

Mongo Java连接内存泄漏

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

我正在以以下方式构建MongoClient连接:

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内存分析器有关。这只是在对象图中保留了对类加载器的引用,实际上这不是内存泄漏。只是一个缓冲池,以减少垃圾收集对性能的影响。此处对该条件进行了说明: