MongoCleaner线程计数非常高

时间:2015-12-15 12:17:47

标签: java mongodb playframework morphia

MongoDB应用程序以“定时等待”状态结束了大量的MongoCleanerXXX线程,最终导致“OutOfMemory - 无法创建新的本机线程”问题。我正在为MongoClient&创建一个单例对象。 dataStore对象并使用Morphia进行CURD操作。

我正在使用Playframework,MongoDB-2.6,mongo-java-driver-2.11.2.jar,morphia-0.99.1-SNAPSHOT.jar

以下是创建数据存储区对象的代码。

public enum AppMongoConfig {
    INSTANCE;

    private MongoClient mongo;
    private Morphia morphia = new Morphia();;
    private Datastore datastore;
    private String ip;
    private String schema;
    private DB db;
    private int port;

    private AppMongoConfig() {
        initialize();
    }

    public void initialize() {
        Logger.info(" ##### Initializing mongo app db ######");
        this.ip = Play.application().configuration()
                .getString("appMongoDBHost");
        this.schema = Play.application().configuration()
                .getString("appMongoDBSchema");
        this.port = Play.application().configuration().getInt("appMongoDBPort");
        try {
            this.mongo = new MongoClient(this.ip, this.port);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

        this.db = this.mongo.getDB(this.schema);
        this.datastore = this.morphia.createDatastore(this.mongo,
                this.db.getName());
        Logger.info(" ##### Initialized mongo app db ######");
    }

    public Datastore getDs() {
        return this.datastore;
    }
}

这就是我访问数据库的方式

AppMongoConfig.INSTANCE.getDs()
            .find(FileUploadStatusInfo.class).field("pollingId")
            .equal(pollingId).get();

我为我的java进程使用线程转储来监视线程,我的线程数不断增加,有时甚至达到20K。在20K中,近19950个线程是“MongoCleaner”线程。以下是我在threaddump中看到的内容。

    "MongoCleaner1202732389" daemon prio=10 tid=0x00007f360418a000 nid=0x17c6 waiting on condition [0x00007f35ee2e2000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.mongodb.Mongo$CursorCleanerThread.run(Mongo.java:773)

   Locked ownable synchronizers:
    - None

"MongoCleaner298435004" daemon prio=10 tid=0x00007f36081a4000 nid=0x17c4 waiting on condition [0x00007f35ee3e3000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.mongodb.Mongo$CursorCleanerThread.run(Mongo.java:773)

   Locked ownable synchronizers:
    - None

"MongoCleaner1971787750" daemon prio=10 tid=0x00007f36081a2000 nid=0x17c2 waiting on condition [0x00007f35ee4e4000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
    at java.lang.Thread.sleep(Native Method)
    at com.mongodb.Mongo$CursorCleanerThread.run(Mongo.java:773)

   Locked ownable synchronizers:
    - None

这可能是什么原因,我做错了什么导致它作为MongoDB的客户端应用程序?

这个问题仍然存在,有没有人找到并回答。

1 个答案:

答案 0 :(得分:0)

来自EnumJINSTANCE?也许这就是AppMongoConfig的设置对我来说有点不寻常的原因。

无论你做什么,MongoClient都应该是静态的。您的问题听起来像是在创建多个/太多实例。另请参阅MongoDB - massive amount of MongoCleaner threads