Java “是什么意思?”;每个JVM线程都有自己的程序计数器;

Java “是什么意思?”;每个JVM线程都有自己的程序计数器;,java,multithreading,process,linux-kernel,jvm,Java,Multithreading,Process,Linux Kernel,Jvm,我试图理解这句话的意思: 每个Java虚拟机线程都有自己的pc(程序计数器) 登记在任何时候,每个Java虚拟机线程都在执行 单一方法的代码,即该方法的当前方法(§2.6) 线 我假设JVM线程与任何其他线程一样工作——每次线程被调度运行(比如Linux内核)时,它的“程序计数器”都是从CPU加载的,因此从CPU的角度来看,只有一个程序计数器——每次操作系统切换线程时,它都会被操作系统更新 对吗?我很困惑,因为整个页面似乎一直在强调每个JVM都有自己的PC/堆栈/堆等。但我认为这是任何进程都有

我试图理解这句话的意思:

每个Java虚拟机线程都有自己的pc(程序计数器) 登记在任何时候,每个Java虚拟机线程都在执行 单一方法的代码,即该方法的当前方法(§2.6) 线

我假设JVM线程与任何其他线程一样工作——每次线程被调度运行(比如Linux内核)时,它的“程序计数器”都是从CPU加载的,因此从CPU的角度来看,只有一个程序计数器——每次操作系统切换线程时,它都会被操作系统更新

对吗?我很困惑,因为整个页面似乎一直在强调每个JVM都有自己的PC/堆栈/堆等。但我认为这是任何进程都有的——JVM在某种程度上是独一无二的吗

假设JVM与任何其他线程一样工作

JVM不是一个线程:它是一个有许多线程的进程

…因此,从CPU的角度来看,只有一个程序计数器

程序计数器只是构成线程上下文的几个寄存器之一。每个CPU都有一组物理寄存器(或者两组,如果是超线程的话,但让我们保持简单,忽略超线程)。因此,每个CPU在任何给定的瞬间都可以运行一个线程。但是

操作系统可以“切换上下文”:它可以保存在给定CPU上运行的一个线程的所有寄存器,然后从其他线程加载保存的寄存器(包括程序计数器)

在典型的桌面操作系统中,操作系统调度程序可能每秒调用100次或更多次,以决定此时应该运行哪些线程。它将切换出当时实际运行的线程,并切换到等待运行的线程

这样,您的计算机可以拥有比CPU多得多的活动线程

假设JVM与任何其他线程一样工作

JVM不是一个线程:它是一个有许多线程的进程

…因此,从CPU的角度来看,只有一个程序计数器

程序计数器只是构成线程上下文的几个寄存器之一。每个CPU都有一组物理寄存器(或者两组,如果是超线程的话,但让我们保持简单,忽略超线程)。因此,每个CPU在任何给定的瞬间都可以运行一个线程。但是

操作系统可以“切换上下文”:它可以保存在给定CPU上运行的一个线程的所有寄存器,然后从其他线程加载保存的寄存器(包括程序计数器)

在典型的桌面操作系统中,操作系统调度程序可能每秒调用100次或更多次,以决定此时应该运行哪些线程。它将切换出当时实际运行的线程,并切换到等待运行的线程


这样,您的计算机可以拥有比CPU多得多的实时线程。

您错误地引用了标题中的摘录:“每个Java虚拟机线程都有自己的pc”。然后是“JVM线程和其他线程一样工作”。你是对的——这种区别是我困惑的一部分。好吧,你错误地引用了标题中的摘录:“每个Java虚拟机线程都有自己的pc”。然后是“JVM线程和其他线程一样工作”。你是对的——这种区别是我困惑的一部分。有道理。我的困惑实际上是关于线程上下文的构成——我现在明白了,这篇文章说的是,每个JVM线程在pc和堆栈上都有一个共享堆,但是JVM进程对所有线程都有一个共享堆。这是有道理的。我的困惑实际上是关于什么构成了线程上下文——我现在明白了,这篇文章说的是,每个JVM线程都有它在pc和堆栈上的线程,但是JVM进程有一个所有线程的共享堆。