Java虚拟机-它如何分配资源?

4
我正在测试一个支持连续查询的数据流系统的性能。
它是这样工作的: - 有一个轮询服务将数据发送到我的系统。 - 当数据进入系统时,每个查询都基于当前时间的数据流窗口进行评估。 - 随着数据的传递,窗口滑动。
我的问题是,当我向系统添加更多查询时,我应该预期吞吐量会减少,因为它无法处理数据速率。
然而,实际上我观察到了吞吐量的增加
我不明白为什么会出现这种情况,我猜测这可能与JVM分配CPU、内存等方面有关。
有人能解决我的问题吗?
5个回答

4
大多数Java虚拟机最初解释JVM字节码,这比本地机器代码执行略慢。随着JVM发现您反复使用代码的特定部分,它将该代码部分编译为本地机器代码(增加其处理速度)。因此,有时候压力测试代码,甚至让代码长时间运行往往会加速执行而不是减速。HotSpot JVM(SUN的默认JVM)是最知名的JVM,它执行本地编译以加速代码执行。
此外,与您过去遇到的某些库相比,许多Java库非常成熟。这意味着它们可能使用非阻塞套接字监听器、可重新分配的工作线程池或任何适用于高吞吐量处理的技术,而不是分配线程来处理请求。这与JIT(类似于HotSpot)JVM的自我调整相结合,使得对Java进行基准测试相当具有挑战性。一般来说,事情倾向于在运行时间越长的情况下变得更快,直到达到某个点。

2

一如既往,答案就是进行性能分析。不过,猜测一下:Hotspot虚拟机在开始执行即时编译之前需要经过相当多的步骤。


2

您的问题在技术细节方面不够详细,但这是一个猜测。

如果IO流子系统相当高效(例如基于select),并且单个客户端没有占满网络接口,那么存在许多客户端可能会增加总吞吐量,因为服务器进程可以处理更多数据。


0

0
另一个更愚蠢的理论:当然,随着负载的增加,吞吐量会增加,至少在达到容量之前是这样的。如果您平均每秒可以处理100个查询,并且您平均每秒发送10个查询,则吞吐量为每秒10个查询。如果您将负载增加到平均每秒100个查询,则吞吐量为(几乎)每秒100个查询。当然,在此之后情况会变得更糟。您是否已经接近容量?如果您已经排除了这种可能性,请不要介意。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接