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;
}