`

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;
  }
0
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics