3

我使用带有akka后端的sttp lib从服务器加载文件。以下任何一种方法都会导致加载 1Gb 文件时占用大量内存:

import com.softwaremill.sttp._

val file: File = new File(...)

sttp.response(asStream[Source[ByteString, Any]])
.mapResponse { src =>
    src.runWith(FileIO.toPath(file.toPath, options, 0))
}

sttp.response(asFile(file, false))

VisualVM 绘制 1Gb 文件的顺序加载图。 在此处输入图像描述

是否有机会在写入后立即将数据写入块并从内存中逐出块

4

1 回答 1

1

根据您的情节,您的应用程序不需要大量内存。有高达 1700 MB 的“峰值”,但在垃圾收集器运行之后,堆的使用量下降到 250 MB。sttp 和 Akka 创建了很多短暂的对象;但是,垃圾收集器可以很好地清理您的记忆。

我用 124 MB 内存运行了您的客户端应用程序,只是为了验证它不需要 2GB 堆来下载 1GB 文件:

sbt -mem 124 run

该应用程序没有崩溃,它只是使用了尽可能多的内存。 在此处输入图像描述

于 2019-11-29T00:41:00.940 回答