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的客户端应用程序?
这个问题仍然存在,有没有人找到并回答。
答案 0 :(得分:0)
来自EnumJ的INSTANCE
?也许这就是AppMongoConfig
的设置对我来说有点不寻常的原因。
无论你做什么,MongoClient
都应该是静态的。您的问题听起来像是在创建多个/太多实例。另请参阅MongoDB - massive amount of MongoCleaner threads