Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Scala:如何进行字符串连接以避免GC开销问题_Java_Scala_Performance_Garbage Collection - Fatal编程技术网

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

Java Scala:如何进行字符串连接以避免GC开销问题,java,scala,performance,garbage-collection,Java,Scala,Performance,Garbage Collection,我有一个应用程序,它接收一些非常大的分隔文件(~10到15m条记录),并在进行一些预处理后将其吸收到Kafka中。作为预处理的一部分,我们将分隔记录转换为json,并将元数据添加到json消息(文件名、行号)。我们正在使用Json4s本机序列化程序进行此操作,如下所示: import org.json4s.native.Serialization._ //some more code and below is the final output. write(Map( "schema

我有一个应用程序,它接收一些非常大的分隔文件(~10到15m条记录),并在进行一些预处理后将其吸收到Kafka中。作为预处理的一部分,我们将分隔记录转换为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开销限制


尝试使用Stringbuilder,可以避免创建不必要的对象


尝试使用Stringbuilder,可以避免创建不必要的对象


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

信息

java.lang.OutOfMemoryError:超出GC开销限制

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


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

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

信息

java.lang.OutOfMemoryError:超出GC开销限制

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


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

即使字符串连接在这里或那里分配了一些不必要的字符缓冲区,它最终也不会泄漏任何内容。如果您的应用程序流血致死,原因可能在别处。你可能会觉得至少很有趣……即使字符串连接在这里或那里分配了一些不必要的字符缓冲区,它最终也不会泄漏任何东西。如果您的应用程序流血致死,原因可能在别处。您可能会发现至少有娱乐性…@Explorer,我不熟悉Scala,但在Java中,字符串连接成本很高。大多数语言都有相同的行为。问题是to+=追加到字符串会重建一个新字符串,因此它的开销与字符串的长度(两者之和)成线性关系@Explorer,我不熟悉Scala,但在Java中字符串连接成本很高。大多数语言都有相同的行为。问题是to+=追加到字符串会重建一个新字符串,因此它的开销与字符串的长度(两者之和)成线性关系。我找到了导致内存泄漏的对象,我使用TrieMap作为一些数据的缓存,当卷增加超过3M时,它就会爆炸。我找到了导致内存泄漏的对象,我使用TrieMap作为一些数据的缓存,当卷增加超过3M时,它就会爆炸。