使用Akk Http从Scala中的mongodb获取100K记录时出错
我编写了以下代码来获取记录并执行操作 在akka http路由上使用Akk Http从Scala中的mongodb获取100K记录时出错,mongodb,scala,akka-http,Mongodb,Scala,Akka Http,我编写了以下代码来获取记录并执行操作 在akka http路由上 complete(mongoDB.getCollection(getCollectionName(user_id, list_id)).find() .getAllContacts(user_id, list_id).map { line => validateNumber(line.phone, prefixTrim) }.toFuture().map(_.size.toString))
complete(mongoDB.getCollection(getCollectionName(user_id, list_id)).find()
.getAllContacts(user_id, list_id).map { line =>
validateNumber(line.phone, prefixTrim)
}.toFuture().map(_.size.toString))
在使用wrk测试API时,有1000个连接和10个线程,我发现以下错误
java.lang.OutOfMemoryError: GC overhead limit exceeded
Error during processing of request: 'Boxed Error'.
Completing with 500 Internal Server Error response.
To change default exception handling behavior, provide a custom ExceptionHandler.
java.util.concurrent.ExecutionException: Boxed Error
Caused by: java.lang.OutOfMemoryError: Java heap space
有没有办法在不增加堆大小的情况下解决这个问题
更新
集合大小=33MB
及
如果堆无法保存所有数据,则需要在获得结果时对其进行流式处理:
您正在加载的这个集合有多大?mongo是不是一下子就把这一切都记起来了?您为最大JVM内存设置的配置值是多少?(
-Xmx
标志)?我已经更新了我的问题。似乎所有数据都一次加载到内存中,因为您的java应用程序没有足够的内存来保存100K条记录。您可以使用java-Xmx标志增加它,或者找到一种不将所有数据保存到内存中的方法,例如通过流式处理
java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'
intx CompilerThreadStackSize = 0 {pd product}
uintx ErgoHeapSizeLimit = 0 {product}
uintx HeapSizePerGCThread = 87241520 {product}
uintx InitialHeapSize := 268435456 {product}
uintx LargePageHeapSizeThreshold = 134217728 {product}
uintx MaxHeapSize := 4294967296 {product}
intx ThreadStackSize = 1024 {pd product}
intx VMThreadStackSize = 1024 {pd product}
java version "1.8.0_131"