java - 为什么 OS 进程似乎比 Java 中的线程快

标签 java concurrency operating-system

<分区>

我开发了一个多线程 java 应用程序,它使用线程来处理一批工作。我有一个主线程,可以将作品分派(dispatch)给不同的线程。一切正常。

现在我已经更改了应用程序以允许它在多个 java 进程中运行,每个进程都像以前一样进行多线程处理。例如,我以前有 8 个线程在一个 java 进程中处理 8 个作业,现在我可以有 2 个 Java 进程,每个进程仍有 4 个线程来处理总共 8 个作业。

应用程序是这样建模的:一个调度程序将获取需要完成的工作,然后将它们调度到一个线程池。线程之间没有同步或通信。

我注意到在后面的方法中有相当大的性能提升,我想知道为什么。任何人都可以对此有所了解吗?操作系统进程调度是否比 Java 线程更高效?当我真的需要提高性能时,我是否应该将其用作一般经验法则?谢谢。

最佳答案

这真的取决于很多因素。首先,您是否查看了两种情况下的 CPU 和内存负载水平?我希望在这两个进程的情况下,系统负载更大,因此工作得更快。

另一个原因可能是您只有两个不同的内存堆,它们由两个独立的垃圾收集器清理。

还有进程如何相互通信(文件、管道、队列、套接字等)?在多进程的情况下,你不能共享内存(除非你调用一些操作系统系统调用,这是有代价的)。你在衡量时间的时候有没有考虑到这个沟通时间?

关于java - 为什么 OS 进程似乎比 Java 中的线程快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17135492/

相关文章:

Java Socket 连接被我的公共(public) IP 拒绝

java - Android - 将数据添加到数据库

Java并发修改

java - "Storing"Java 中 future 使用的对象

javascript - 如何停止 Node.js/Javascript 中的无限循环

java - CopyOnWriteArraySet 何时对实现线程安全的 HashSet 有用?

python - 如何在python中移回一个文件夹

linux - 检测堆栈溢出

linux - 什么决定了一个进程可用的虚拟地址空间的大小?

java - Kafka在Ubuntu上设置java exe路径问题