有人可以解释一下,当JVM只是Linux上的单个进程时,Java多线程程序(例如Tomcat servlet容器)如何能够使用所有CPU内核?是否有任何好的深入文章详细描述了这个主题?
编辑#1 :我不是在寻找如何在Java中实现多线程程序的建议。我正在寻找JVM内部如何在linux / windows上使用多个内核的解释,同时仍然是操作系统上的单个进程。
编辑#2 :我设法找到的最佳解释是Hotspot(Sun / Oracle JVM)使用NPTL在Linux上将线程实现为本机线程。因此,Java中的每个线程都是Linux上的轻量级进程(本机线程)。使用ps -eLf
命令可以清楚地看到打印出来的不仅是进程id(PPID
),还有本机线程id(LWP
)。
更多细节也可以在这里找到:
编辑#3 :维基百科在NPTL上有简短但很好的条目,还有一些参考文献http://en.wikipedia.org/wiki/Native_POSIX_Thread_Library
答案 0 :(得分:11)
Linux内核支持线程作为一等公民。事实上,对于内核而言,一个线程与一个进程没有多大区别,只不过它与另一个线程/进程共享一个地址空间。
默认情况下,某些旧版本的ps
甚至为每个线程显示了一个单独的进程,较新的版本可以使用-m
标志启用此行为。
答案 1 :(得分:4)
JVM是一个包含许多线程的单个进程。每个线程都可以在不同的CPU核心上进行调度。单个进程可以有很多线程。
当JVM内部运行的Java软件要求另一个线程时,JVM会启动另一个线程。
这就是JVM如何设法使用多个核心。
答案 2 :(得分:3)
如果您使用并发库并尽可能多地拆分您的工作,JVM应该处理剩下的工作。
看看这个http://embarcaderos.net/2011/01/23/parallel-processing-and-multi-core-utilization-with-java/
答案 3 :(得分:2)
我首先阅读Concurrency Tutorial。
特别是,它解释了processes and threads之间的差异(和关系)。
在我熟悉的架构上,线程(包括JVM创建的线程)由操作系统管理。 JVM只使用操作系统提供的线程功能。