gpt4 book ai didi

java.io.ReadObject 间歇性地花费极端时间

转载 作者:行者123 更新时间:2023-12-02 07:52:23 26 4
gpt4 key购买 nike

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

运行探查器时,CPU 时间似乎被 java.io.ReadObject 耗尽。鉴于调用是相同的,我真的很困惑什么会导致时间如此跳跃。

任何想法将不胜感激。

JVM 有 4GB 内存,运行在 CentOS 1.6 版本上。似乎没有相关的 GC 事件。

最佳答案

标准 Java 序列化会产生大量垃圾。如果您看到执行此操作的时间出现峰值,那是因为 a) 它正在等待 IO(可以是任意时间)或 b) 执行次要或完整 GC。

我会运行你的应用程序

-verbosegc

查看何时执行完整GC。否则你可以使用 jstat

jstat -gccause 5s {process-id}

大多数集合都是 stop-the-world 的,因此当执行 GC 时,readObject 看起来会使用大量 CPU,而实际上它是在等待 GC 清理一些数据。

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

尽管如此,要出现这种延迟,您必须对大量数据进行反序列化。要获得 3 秒的延迟,通常需要大约 3 GB 的垃圾。如果每 20 个请求就有一个,则每个请求平均可能会产生 150 MB 的垃圾。

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

关于java.io.ReadObject 间歇性地花费极端时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7480949/

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