java.io.ReadObject间歇性地占用极端时间

时间:2011-09-20 06:23:16

标签: java deserialization latency

我们正在尝试使用简单的嵌套对象反序列化一个非常大的对象。这通常需要大约5-10毫秒。但是,最近我们在此通话期间遇到了高达3000毫秒的随机延迟。我可以反复运行请求并从调用中获得完全相同的内容长度,但每20个中就有一个是一个巨大的滞后命中。

运行探查器时,似乎在java.io.ReadObject中占用了CPU时间。我真的很难过,因为这些电话是相同的,所以可能会导致这样的时间跳跃。

任何想法都会受到高度赞赏。

JVM在centos上运行了4GB的ram,版本为1.6。似乎没有相关的GC事件。

1 个答案:

答案 0 :(得分:0)

标准Java序列化会创建很多垃圾。如果您在执行此操作时看到尖峰,那将是因为a)它正在等待IO(可以是任何时间量)或b)执行次要或完整GC。

我会用

运行你的应用程序
-verbosegc

查看正在执行完整gc的时间。否则,您可以使用jstat

jstat -gccause 5s {process-id}

大多数集合都是stop-the-world所以当执行GC时,readObject在实际等待GC清理某些数据时似乎已经使用了大量的CPU。

在分析应用程序时,我建议启用内存分析。

所有这些都有这种延迟,你必须要对大量数据进行序列化。要获得3秒的延迟,通常需要大约3 GB的垃圾。如果每20个请求中有一个请求,则每个请求可能平均为150 MB垃圾。

也许是时候优化序列化了。你可以得到它几乎没有,但你需要做的越多越好。我将首先实现readObject / writeObject作为最简单的更改,它可以为您带来最大的好处。