当前位置: 首页 > 知识库问答 >
问题:

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

国斌斌
2023-03-14

我在试着理解这句话的意思:

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

https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1

我假设JVM线程的工作方式与任何其他线程一样--每次调度线程运行时(比方说Linux内核),它的“程序计数器”都是从它的task_struct数据结构加载的,所以从CPU的角度来看,只有一个程序计数器--它只是在OS每次切换线程时由OS更新。

那是正确的吗?我很困惑,因为整个页面似乎一直在强调每个JVM都有自己的PC/Stack/Heap等,但我认为这是任何进程都有的-JVM是不是与其他进程不同?

共有1个答案

廉实
2023-03-14

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

JVM不是一个线程:它是一个包含许多线程的进程。

...所以从CPU的角度来看,只有一个程序计数器

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

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

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

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

 类似资料:
  • 我试图理解这句话的含义: 每个Java虚拟机线程都有自己的pc(程序计数器)寄存器。在任何时候,每个Java虚拟机线程都在执行单个方法的代码,即该线程的当前方法(§2.6)。 https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-2.html#jvms-2.5.1 我假设JVM线程像任何其他线程一样工作——每次调度线程运行(比如Linux内

  • 问题内容: 我正在编写一个多线程Java程序,其中每个线程可能都需要将其标准输出重定向到一个单独的文件。每个线程都有其自己的文件。是否可以在“每个线程”的基础上重定向System.out或在所有线程上全局更改System.out? 问题答案: 是否可以基于“每线程”重定向System.out 不,这是不可能的。 是静态的,并且在JVM最初启动时,每个JVM都会作为系统类加载器的一部分进行加载。尽管

  • 我正在编写一个多线程Java程序,其中每个线程可能需要将其标准输出重定向到一个单独的文件。每个线程都有自己的文件。是否有可能在“每个线程”的基础上重定向System.out,还是所有线程对System.out全局更改?

  • 本文向大家介绍程序计数器为什么是私有的?相关面试题,主要包含被问及程序计数器为什么是私有的?时的应答技巧和注意事项,需要的朋友参考一下 程序计数器主要有下面两个作用: 字节码解释器通过改变程序计数器来依次读取指令,从而实现代码的流程控制,如:顺序执行、选择、循环、异常处理。 在多线程的情况下,程序计数器用于记录当前线程执行的位置,从而当线程被切换回来的时候能够知道该线程上次运行到哪儿了。 需要注意

  • 问题内容: 我读到每个应用程序都在自己的JVM中运行。为什么会这样呢?他们为什么不让一个JVM运行2个或更多应用程序? 我说的是通过公共静态void main(String [])方法启动的应用程序…) 问题答案: (我假设您正在谈论通过方法启动的应用程序…) 理论上,您可以在JVM中运行多个应用程序。实际上,它们可以以各种方式相互干扰。例如: JVM具有一组System.in/out/err,一

  • 基于每个JVM的CPU核数创建线程与在多个JVM上运行的线程在CPU核数上创建线程数,条件是所有JVM运行在共享同一CPU的一个物理系统上有何不同?换句话说,一个并行运行8个线程的多线程Java程序vs在共享同一CPU的8个不同JVM上运行的同一多线程程序? 下面我给出了一些我发现的用线程实现并行处理的方法,但是我不能理解它们之间的本质区别? 方法一:线程周期性地查询数据库更改,并行地启动(长时间