有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

我有一个应用程序,它需要一些非常大的分隔文件(大约10到15米的记录),并在进行一些预处理后将其吸收到卡夫卡中。作为预处理的一部分,我们将分隔记录转换为json,并向json消息(文件名、行号)添加元数据。我们使用Json4s本机序列化程序来实现这一点,如下所示:

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


共 (1) 个答案

  1. # 1 楼答案

    当产生大量这样的短消息时,就会产生大量微小的短生命物体。这种微小的短生命物体是GC可以非常有效地处理的——它不太可能造成任何严重问题

    信息

    java.lang.OutOfMemoryError: GC overhead limit exceeded

    这意味着GC非常努力,但没有取得任何成功。这不是小生命体的情况。最有可能的是,你有一个巨大的内存泄漏,几分钟后会带走你所有的内存。然后GC必须失败,因为没有什么可回收的

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