mongoDB客户端jar占用内存问题(java)
The Java MongoDB driver is thread safe. If you are using in a web serving environment, for example, you should create a single Mongo instance, and you can use it in every request.The Mongo object maintains an internal pool of connections to the database (default pool size of 10).开始每次访问db,都新建一个Mongo对象,结果服务器4g内存很快被占满。
查看了官网资料,建议一个项目用一个mongo单例。
改了程序,内存消耗稳定在2g左右。
mongodb是基于内存映射的,我特意用同一条查询sql查询一个collection的数据。按说内存中存在collection的映射,内存消耗就不应该增加了。但是每次访问都会导致内存增加。
即使我将collection做成单例的,内存消耗也还是上升。
不过将Mongo对象改成单例后,内存消耗会稳定在一个值。
看了有些大侠关于mongodb的评测,内存消耗和mongodb的池的并发量有关。
我觉得mongodb在内存使用上多少有点问题,猜测一个collection在内存中不是一个映射。
mongodb的连接池设置应该是在com.mongodb.Bytes类中设置的。
static final int CONNECTIONS_PER_HOST;
static
{
CONNECTIONS_PER_HOST = Integer.parseInt(System.getProperty("MONGO.POOLSIZE", "10"));
COLLECTION_REF_ID = new ObjectId(-1, -1, -1);
}
通过这一点,可以在程序中指定mongodb的连接池数量。System.setProperty("MONGO.POOLSIZE", "3");
至于是否有效果,能从变量值里看出来。
虽然Bytes.CONNECTIONS_PER_HOST是protect,但是com.mongodb.MongoOptions的变量connectionsPerHost是public,而在方法reset中被设值。
public void reset() {
this.connectionsPerHost = Bytes.CONNECTIONS_PER_HOST;
this.threadsAllowedToBlockForConnectionMultiplier = 5;
this.connectTimeout = 0;
this.socketTimeout = 0;
this.autoConnectRetry = false;
}
页:
[1]