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

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

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

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

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

那么,JVM如何利用提供多个OS线程以实现高并发性的多个内核?

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

但是就内存而言,线程由于本地每CPU缓存的内存而获得了很多性能提升。 当线程在CPU上运行时,CPU的本地高速内存缓存可帮助线程在本地隔离存储请求,而不必花费时间来读取或写入中央内存。 这就是为什么volatile和synchronized调用包含内存同步结构的原因,因为当线程需要协调其工作或彼此通信时,必须将高速缓存存储器刷新到主存储器或使其无效。