gpt4 book ai didi

java - Scala:如何进行字符串连接以避免 GC 开销问题

转载 作者:行者123 更新时间:2023-12-01 17:51:43 24 4
gpt4 key购买 nike

我有一个应用程序,它需要一些非常大的分隔文件(~10 到 15 M 记录),并在进行一些预处理后将其摄取到 Kafka 中。作为此预处理的一部分,我们将分隔记录转换为 json 并将元数据添加到该 json 消息(文件名、行号)。我们使用 Json4s Native 序列化器来完成此操作,如下所示:

import org.json4s.native.Serialization._ 
//some more code and below is the final output.
write(Map(
"schema" -> schemaName,
"data" -> List(resultMap),
"flag" -> "I")
)

消息转换为 Json 后,我们将添加消息元数据,例如:

def addMetadata(msg: String, metadata: MessageMetadata): String = {
val meta = write(asJsonObject(metadata))
val strippedMeta = meta.substring(1, meta.length -1)
val strippedMessage = msg.substring(1, msg.lastIndexOf("}"))
"{" + strippedMessage + "," + strippedMeta + "}"
msg
}

最后的消息如下所示:

{"schema":"SchemaName"
"data": [
],
"flag": "I",
"metadata":{"srcType":"file","fileName":"file","line":1021}}

现在这两种方法都会泄漏一些内存并抛出以下错误。该应用程序具有每分钟处理 300k 消息的能力,但在大约 4-5 分钟后,其速度减慢并最终终止。我知道字符串连接会生成大量垃圾对象,并且想知道最好的方法是什么?

java.lang.OutOfMemoryError: GC overhead limit exceeded

最佳答案

当产生大量此类短消息时,就会创建大量微小的短生命对象。 GC 可以非常有效地处理如此微小的短生命对象 - 它不太可能导致任何严重问题。

消息内容

java.lang.OutOfMemoryError: GC overhead limit exceeded

意味着GC非常努力,但没有成功。对于微小的、生命周期较短的物体来说,情况并非如此。最有可能的是,您发生了严重的内存泄漏,几分钟后就耗尽了您的所有内存。然后 GC 就会失败,因为没有任何东西可以回收。

不要浪费时间来优化可能无害的东西。使用一些工具来查找泄漏。

关于java - Scala:如何进行字符串连接以避免 GC 开销问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49415881/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com