java - 使用 akka 流将数据分块写入文件

标签 java scala memory-management akka-stream sttp

我使用 sttp lib 和 akka 后端从服务器加载文件。 以下任一方法都会导致加载 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 文件的顺序加载图。 enter image description here

是否有机会以 block 的形式写入数据并在写入后立即从内存中逐出 block

最佳答案

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

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

sbt -mem 124 run

应用程序没有崩溃,它只是使用了尽可能多的可用内存。 enter image description here

关于java - 使用 akka 流将数据分块写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59082262/

相关文章:

scala - Gatling 2 - 将值映射到模板

scala - Spark 在 groupBy/aggregate 中合并/组合数组

java - 读取S3对象并写入InMemory Buffer

c++ - 消除 C++ 和 GNU 科学库代码中的内存泄漏

java - 将查询字符串参数解析为 java 对象

java - 在 JPanel 中显示外部 HTML 文件

iphone - 苹果框架中的内存泄漏

android - 如何确定我的 android 应用程序是否存在内存泄漏?

java - 如何使 java JPanel 和 graphics2d 透明?

java - 我怎样才能把它变成一个循环?