首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java性能进程与线程

Java性能进程与线程
EN

Stack Overflow用户
提问于 2011-10-26 21:44:42
回答 3查看 4.3K关注 0票数 14

我正在用Java实现一个工作者池。

这本质上是一个完整的对象加载,它将拾取数据块,处理数据,然后存储结果。由于IO延迟,将有比处理器核心多得多的工作进程。

服务器专用于此任务,我希望最大限度地发挥硬件的性能(但不,我不想在C++中实现它)。

最简单的实现是使用单个Java进程来创建和监视多个工作线程。另一种方法是为每个工作进程运行一个Java进程。

为了便于讨论,假设您使用的是一台四核Linux服务器,那么您希望哪种解决方案的性能更高?为什么?

你可以假设工人们从来不需要互相交流。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-10-26 21:51:12

一个进程,多个线程--有几个原因。

当在任务之间进行上下文切换时,在某些处理器上,在线程之间切换比在进程之间切换更便宜。这在这种工作进程多于内核的I/O密集型情况下尤其重要。在阻塞I/O之间做的工作越多,这就越不重要。然而,良好的缓冲将为线程或进程付出代价。

当在同一个JVM中的线程之间切换时,至少有一些Linux实现(特别是x86)不需要刷新缓存。See Tsuna's blog。线程之间的缓存污染将被最小化,因为它们可以共享程序缓存,执行相同的任务,并共享相同的代码副本。我们讨论的是每个交换机节省100纳秒到几微秒的数量级。如果这对你来说是小事一桩,那就继续往下读……

根据设计的不同,一个进程的I/O数据路径可能较短。

线程的启动和预热时间通常要短得多。操作系统不必启动进程,Java不必启动另一个JVM,类加载只做一次,即时编译只做一次,HotSpot优化只做一次,而且更快。

票数 18
EN

Stack Overflow用户

发布于 2011-10-26 22:24:30

通常,当讨论多处理(/w,每个进程一个线程)和同一进程中的多线程时,虽然第一种情况下的理论开销比后一种情况更大(因此从理论上讲,多处理比多线程慢),但实际上在大多数现代操作系统上,这并不是什么大问题。然而,在Java上下文中讨论它时,启动一个新进程比启动一个新线程的成本要高得多。启动一个新进程意味着启动一个新的JVM实例,这是非常昂贵的,尤其是在内存方面。我建议您在同一个JVM中启动多个线程。

此外,如果您说线程间通信不是问题,那么可以使用Java的Executor Service来获得大小为2x(可用CPU的数量)的固定线程池。可用CPU的数量可以在运行时通过Java的runtime类自动检测。这样你就可以得到一个快速、简单的多线程,而不需要任何样板代码。

票数 18
EN

Stack Overflow用户

发布于 2017-05-06 18:42:58

实际上,如果你使用大规模的任务,使用多个jvm进程要比使用多个线程的一个jvm快得多。至少我们从来没有让一个jvm运行得像多个jvm那样快。

我们做一些计算,每个任务使用大约2-3 3GB的内存,并进行一些繁重的数字运算。如果我们产生30个jvm并运行30个任务,它们的性能比在一个jvm中产生30个线程要好15-20%。我们试着调优gc和各种内存段,但始终没有赶上第一个变体。

我们在不同的机器上做到了这一点,在16核服务器上执行14个任务,在36核服务器上执行34个任务,等等。

它可能对简单的任务没有任何影响,但在繁重的计算中,jvm在线程上的性能似乎很差。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7903503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档