MongoException:java.lang.OutOfMemoryError:超出了GC开销限制

问题描述 投票:9回答:1

我正在批量写入MongoDB并获得OOM异常(java.lang.OutOfMemoryError:超出了GC开销限制)。我有两个问题:

  1. OOM是否来自Mongo客户端驱动程序或MongoDB服务器?
  2. 是否有OOM发生的线索?

FO 2016-11-15 15:19:10,437-[TS] org.mongodb.driver.cluster info(71)-WritableServerSelector从群集描述ClusterDescription {type = UNKNOWN,connectionMode = MULTIPLE,all = [ ServerDescription {地址= mongo.server1-or:30000,类型=未知,状态= CONNECTING},ServerDescription {地址= mongo.server2:30000,类型= UNKNOWN,状态= CONNECTING},ServerDescription {地址= mongo.server3:30000,类型=未知,状态=连接}]}。等待30000毫秒,然后超时INFO 2016-11-15 15:19:11,448-[TS] org.mongodb.driver.cluster info(71)-WritableServerSelector从群集描述ClusterDescription {type = UNKNOWN,connectionMode = MULTIPLE,all = [ServerDescription {地址= mongo.server1或:30000,类型=未知,状态= CONNECTING},ServerDescription {地址= mongo.server2:30000,类型=未知,状态= CONNECTING},ServerDescription {地址= mongo.server3:30000,类型=未知,状态= CONNECTING}]}。等待30000毫秒,然后超时INFO 2016-11-15 15:19:14,324-[TS] org.mongodb.driver.cluster info(76)-连接到服务器mongo.server2:30000时监视线程异常com.mongodb.MongoException:java.lang.OutOfMemoryError:超出了GC开销限制在com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:125)在com.mongodb.connection.DefaultServerMonitor $ ServerMonitorRunnable.run(DefaultServerMonitor.java:128)在java.lang.Thread.run(Thread.java:745)原因:java.lang.OutOfMemoryError:超出了GC开销限制INFO 2016-11-15 15:19:14,325-[TS] com.xyz.executors.ConsumeMessageTask run(45)-预定的线程池将写入MongoDBINFO 2016-11-15 15:19:14,325-[TS] org.mongodb.driver.connection info(71)-已打开与mongo.server3:30000的连接[connectionId {localValue:28690}]错误2016-11-15 15:19:17,353-[TS] com.xyz.executors.ConsumeMessageTask run(117)-批量写入MongoDB时发生错误com.mongodb.MongoTimeoutException:等待与WritableServerSelector匹配的服务器30000毫秒后超时。群集状态的客户端视图为{type = UNKNOWN,服务器= [{address = mongo.server1-or:30000,type = UNKNOWN,state = CONNECTING},{address = mongo.server2:30000,type = UNKNOWN,state = CONNECTING ,异常= {com.mongodb.MongoException:java.lang.OutOfMemoryError:超出了GC开销限制},是由于{java.lang.OutOfMemoryError:超出了GC开销限制}},{地址= mongo.server3:30000,类型= UNKNOWN ,state = CONNECTING}]在com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:369)在com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101)在com.mongodb.binding.ClusterBinding $ ClusterBindingConnectionSource。(ClusterBinding.java:75)在com.mongodb.binding.ClusterBinding $ ClusterBindingConnectionSource。(ClusterBinding.java:71)在com.mongodb.binding.ClusterBinding.getWriteConnectionSource(ClusterBinding.java:68)在com.mongodb.operation.OperationHelper.withConnection(OperationHelper.java:219)在com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:168)在com.mongodb.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:74)在com.mongodb.Mongo.execute(Mongo.java:781)在com.mongodb.Mongo $ 2.execute(Mongo.java:764)在com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:2195)在com.mongodb.DBCollection.executeBulkWriteOperation(DBCollection.java:2188)在com.mongodb.BulkWriteOperation.execute(BulkWriteOperation.java:121)在com.xyz.executors.ConsumeMessageTask.run(ConsumeMessageTask.java:112)在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:471)在java.util.concurrent.FutureTask.run(FutureTask.java:262)在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:615)在java.lang.Thread.run(Thread.java:745)`

mongodb garbage-collection out-of-memory mongo-java mongo-java-driver
1个回答
0
投票

您的堆栈跟踪显示错误源自此行:

at com.mongodb.connection.BaseCluster.createTimeoutException(BaseCluster.java:369) at com.mongodb.connection.BaseCluster.selectServer(BaseCluster.java:101)...

因此,客户端在尝试连接到服务器时会超时。从服务器收到的信息在上面的行中:

Client view of cluster state is {type=UNKNOWN, servers=[ {address=mongo.server1-or:30000, type=UNKNOWN, state=CONNECTING}, {address=mongo.server2:30000, type=UNKNOWN, state=CONNECTING, exception={com.mongodb.MongoException: java.lang.OutOfMemoryError: GC overhead limit exceeded}, caused by {java.lang.OutOfMemoryError: GC overhead limit exceeded}}, {address=mongo.server3:30000, type=UNKNOWN, state=CONNECTING}]

这意味着OutOfMemoryError来自mongo.server2。最好检查该服务器的日志以查看其发生原因,但是大量的写作可能与此有关。可能是mongo.server2跟不上同步您写入主服务器的数据。

© www.soinside.com 2019 - 2024. All rights reserved.