【发布时间】:2021-08-12 20:25:39
【问题描述】:
我正在尝试使用 micronaut 创建内存开销较低的微服务。从使用 micronaut 开始,我遇到了一些问题,即在启动时内存开始变低,但在加载时会膨胀并且不会恢复。
我正在使用一个小型应用程序对其进行测试,该应用程序从休息调用中获取一个项目,执行一些工作,以模拟内存峰值,并将结果存储在数据库中。如果我运行 jar 文件,则应用程序以 ~170mb 内存开始,并且在诱导尖峰后约为 700mb。本机映像具有类似的结果,但启动内存较低。使用 xms 和 xmlx 数字确实有助于 jar 版本在峰值后恢复,尽管它会导致本机映像在峰值期间崩溃。
这是 micronaut 的问题吗?有什么办法可以帮助它恢复记忆吗?
以下是我的测试和结果
使用 micronaut.io/launch 创建带有 kotlin、gradle 和 graalvm 插件的 java 11 应用程序。此外,我正在使用包含的 gradle 插件来构建应用程序和本机图像。
java -jar build/docker/layers/application.jar
启动
| System memory | heap size |
|---|---|
| ~174 mb | 50mb used 264mb total |
峰值期间
| System memory | heap size |
|---|---|
| ~1125 mb | 250mb used 520mb total |
尖峰之后(包括 gc 调用)
| System memory | heap size |
|---|---|
| ~711 mb | 24mb used 88mb total |
而对于本机映像,只有系统内存
./build/native-image/application
| before | during | after |
|---|---|---|
| 13mb | 800mb | 800mb |
【问题讨论】:
-
您是否检查/比较了问题出在您的实施还是框架本身?
-
"这是 micronaut 的问题吗?" - 从问题中提供的信息中,答案并不清楚。 “有什么办法可以帮助它恢复记忆吗?” - 这取决于消耗内存的内容以及引用对象的方式。如果您可以分享有关应用程序正在做什么的信息,除了“做一些工作,模拟内存峰值”或更好地提供示例应用程序,那将有所帮助。如果它看起来像一个错误,使用示例应用程序在github.com/micronaut-projects/micronaut-core/issues 提交问题会有所帮助。我们很乐意进行调查。
-
@Michal_Szulc 这是一个很好的观点,对于一个绝对简单的应用程序,系统和堆大小保持更紧密的联系,堆大小 100mb 系统内存 250mb。这可能意味着它与我的数据库库有关。我会调查谢谢你
-
看来问题的主要部分是我使用的数据库库 sql2o,但对于我尝试过的其他一些库,该应用程序将位于 300mb 以上,这似乎很高。但只要应用程序没有出现巨大的内存峰值,它似乎就保持在相当低的水平。
标签: micronaut