【发布时间】:2017-10-06 17:00:41
【问题描述】:
我已将我的微服务部署到 AWS 服务器上的 docker 容器中,该容器是使用 Akka-HTTP(https://github.com/theiterators/akka-http-microservice) 和 Scala 编写的。将服务部署到 AWS 服务器后,我将面临内存泄漏问题和性能问题。
我注意到,当服务器收到更多请求(如 340mb、410mb、422mb...)时,内存使用量会增加,并且取决于负载,然后它会自动降到正常状态(230mb)。但是,当服务器收到更多请求时,内存使用量不断增加,即使在 CPU 使用率达到正常阶段后,它也无法释放未使用的内存,最终达到最大值(512mb)并崩溃。
如果它正确清除未使用的内存/资源,我们可以避免这种情况。 JVM 应该使用垃圾收集器自行处理内存使用。但是一旦处理了请求,它就无法清除不需要的内存(对象)。我正在使用下面的代码来清除 Akka.HTTP 演员对象。
try {
<-- code block -->
} catch {
case e: Exception =>
sys.addShutdownHook(system.shutdown())
} finally {
sys.addShutdownHook(system.shutdown())
}
如何在执行过程完成后立即删除未使用的内存/资源?
请尽快为我们提供解决方案/方法来解决此问题,因为这对我们来说是一个非常关键的问题?
【问题讨论】:
-
很难(不可能?)对这个问题给出一个有意义的答案。请考虑根据 SO 建议 (stackoverflow.com/help/mcve) 创建一个最小、完整和可验证的示例
-
512mb 听起来像是一个非常小的堆,用于运行 Scala Web 服务。尝试给它更多的堆(比如 2g),看看是否能解决你的问题
-
那是什么版本的akka-http?我们在去年修复了一些内存泄漏。
-
@jrudolph 我们正在使用 akka-http 2.4.3 版来开发我们的微服务。
-
然后尝试更新到最新的akka-http 10.0.6和akka 2.4.18
标签: scala memory-leaks garbage-collection akka-http