JVM在单个进程中运行,并且JVM中的线程共享属于该进程的堆。那么JVM如何利用提供多个OS线程以实现高并发性的多个内核?
JVM在单个进程中运行,并且JVM中的线程共享属于该进程的堆。那么JVM如何利用提供多个OS线程以实现高并发性的多个内核?
Answers:
您可以使用多个线程来使用多个核心。但是,使用比计算机中存在的内核数更多的线程数,只会浪费资源。您可以使用availableProcessors()来获取核心数量。
在Java 7中,存在使用多个内核的fork / join框架。
相关问题:
JVM在单个进程中运行,并且JVM中的线程共享属于该进程的堆。那么JVM如何利用提供多个OS线程以实现高并发性的多个内核?
如果在多CPU机器上运行,Java将利用底层OS的线程来完成在不同CPU上执行代码的实际工作。当每个Java线程启动时,它创建了一个相关的操作系统线程和OS负责调度等。JVM的某些做一些管理和喜欢的线程和Java语言结构的跟踪volatile
,synchronized
,notify()
,wait()
,等所有影响运行操作系统线程的状态。
JVM在单个进程中运行,并且JVM中的线程共享属于该进程的堆。
JVM不必“在单个进程中运行”,因为即使垃圾回收器和其他JVM代码在不同的线程中运行,并且OS经常将这些不同的线程表示为不同的进程。例如,在Linux中,您在进程列表中看到的单个进程通常会伪装一堆不同的线程进程。即使您在单核计算机上,也是如此。
但是,您是正确的,它们都共享相同的堆空间。它们实际上共享相同的整个内存空间,这意味着代码,内部字符串,堆栈空间等。
那么JVM如何利用提供多个OS线程以实现高并发性的多个内核?
线程的性能提高有两个原因。显然,直接并发通常会使程序运行得更快。能够同时执行多个CPU任务(尽管并非总是如此)可以提高应用程序的吞吐量。您还可以将IO操作隔离到单个线程,这意味着当一个线程正在等待IO(读/写到磁盘/网络等)时,其他线程也可以运行。
但是就内存而言,线程由于本地每CPU缓存的内存而获得了很多性能提升。当线程在CPU上运行时,CPU的本地高速内存缓存可帮助线程在本地隔离存储请求,而不必花费时间来读取或写入中央内存。这就是为什么volatile
并且synchronized
调用包含内存同步结构的原因,因为当线程需要协调其工作或彼此通信时,必须将高速缓存存储器刷新到主存储器或使其无效。
如果操作系统通过可用处理器分配线程,则Java将受益于多个内核。JVM本身并没有做任何特别的事情来使其线程在多个内核之间平均调度。请记住以下几点:
Runtime.getRuntime().availableProcessors()
)。不多不少。java.util.concurrent
包装。