mongoDB客户端jar占用内存问题(java)

TheJavaMongoDBdriveristhreadsafe.Ifyouareusinginawebservingenvironment,forexample,youshouldcreateasingleMongoinstance,andyoucanuseitineveryrequest.TheMongoobjectmaintainsaninternalpoolofconnectionstothedatabase(defaultpoolsizeof10).

开始每次访问db,都新建一个Mongo对象,结果服务器4g内存很快被占满。

查看了官网资料,建议一个项目用一个mongo单例。

改了程序,内存消耗稳定在2g左右。

mongodb是基于内存映射的,我特意用同一条查询sql查询一个collection的数据。按说内存中存在collection的映射,内存消耗就不应该增加了。但是每次访问都会导致内存增加。

即使我将collection做成单例的,内存消耗也还是上升。

不过将Mongo对象改成单例后,内存消耗会稳定在一个值。

看了有些大侠关于mongodb的评测,内存消耗和mongodb的池的并发量有关。

我觉得mongodb在内存使用上多少有点问题,猜测一个collection在内存中不是一个映射。

mongodb的连接池设置应该是在com.mongodb.Bytes类中设置的。

staticfinalintCONNECTIONS_PER_HOST;

static

{

CONNECTIONS_PER_HOST=Integer.parseInt(System.getProperty("MONGO.POOLSIZE","10"));

COLLECTION_REF_ID=newObjectId(-1,-1,-1);

}

通过这一点,可以在程序中指定mongodb的连接池数量。System.setProperty("MONGO.POOLSIZE","3");

至于是否有效果,能从变量值里看出来。

虽然Bytes.CONNECTIONS_PER_HOST是protect,但是com.mongodb.MongoOptions的变量connectionsPerHost是public,而在方法reset中被设值。

publicvoidreset(){

this.connectionsPerHost=Bytes.CONNECTIONS_PER_HOST;

this.threadsAllowedToBlockForConnectionMultiplier=5;

this.connectTimeout=0;

this.socketTimeout=0;

this.autoConnectRetry=false;

}

相关推荐