Java如何利用多核?

JVM 在单个进程中运行,JVM 中的线程共享属于该进程的堆。那么,JVM 如何利用提供多个操作系统线程以实现高并发的多核呢?


答案 1

您可以使用多个线程来使用多个内核。但是,使用比计算机中存在的内核数量更多的线程数量可能只是浪费资源。您可以使用 availableProcessors() 来获取内核数。

Java 7中,有一个fork/join框架来利用多个内核。

相关问题:


答案 2

JVM 在单个进程中运行,JVM 中的线程共享属于该进程的堆。那么,JVM 如何利用提供多个操作系统线程以实现高并发的多核呢?

Java将利用底层操作系统线程来完成在不同CPU上执行代码的实际工作,如果在多CPU机器上运行。当每个Java线程启动时,它会创建一个关联的操作系统线程,操作系统负责调度等。JVM 某些对线程进行一些管理和跟踪,Java 语言构造(如 、、、等)都会影响操作系统线程的运行状态。volatilesynchronizednotify()wait()

JVM 在单个进程中运行,JVM 中的线程共享属于该进程的堆。

JVM不需要“在单个进程中运行”,因为即使是垃圾回收器和其他JVM代码也在不同的线程中运行,操作系统通常将这些不同的线程表示为不同的进程。例如,在 Linux 中,您在进程列表中看到的单个进程通常伪装一堆不同的线程进程。即使您在单核计算机上也是如此。

但是,您是对的,它们都共享相同的堆空间。它们实际上共享相同的整个内存空间,这意味着代码,插入字符串,堆栈空间等。

那么,JVM 如何利用提供多个操作系统线程以实现高并发的多核呢?

线程的性能改进来自几个原因。显然,直接并发通常使程序运行得更快。能够同时执行多个 CPU 任务可以(尽管并非总是)提高应用程序的吞吐量。您还可以将 IO 操作隔离到单个线程,这意味着当一个线程正在等待 IO(读取/写入磁盘/网络等)时,其他线程可以运行。

但在内存方面,由于本地的每CPU缓存内存,线程的性能得到了很大的提高。当线程在 CPU 上运行时,CPU 的本地高速内存缓存可帮助线程在本地隔离存储请求,而无需花时间读取或写入中央内存。这就是为什么 和 调用 包含内存同步构造的原因,因为缓存内存必须刷新到主内存中,或者在线程需要协调其工作或相互通信时失效。volatilesynchronized