wor*_*138 5 java multithreading jvm process
我试图弄清楚 JVM 在生成多个线程方面是如何工作的。我认为我的思维模型可能有点偏差,但现在我一直在思考这个想法:既然任何时候都只有一个 JVM 副本在运行,那么每个线程不是都需要自己的 JVM 副本吗?我意识到 java 应用程序的多个线程映射到本机操作系统线程,但我不明白未运行 JVM 的线程如何处理字节码;是不是所有线程都可以访问 JVM?谢谢,任何帮助表示赞赏。
但我不明白不运行 JVM 的线程是如何处理字节码的;是不是所有线程都可以访问 JVM?
http://www.artima.com/insidejvm/ed2/jvmP.html很好地解释了这一点。它是这样说的:
正在运行的 Java 应用程序的每个线程都是虚拟机执行引擎的一个不同实例。从其生命周期开始到结束,线程要么执行字节码,要么执行本机方法。线程可以通过解释或执行来直接执行字节码原生地在硅中,或者间接地,通过即时编译和执行生成的本地代码。Java 虚拟机实现可以使用对正在运行的应用程序不可见的其他线程,例如执行垃圾收集的线程。此类线程不需要实现的执行引擎的“实例”。然而,属于正在运行的应用程序的所有线程都是正在运行的执行引擎。
总结一下我对此的理解:
对于每个线程(execpt GC 线程等),相应的 ExecutionEngine 实例(在同一 JVM 中)将字节码转换为机器指令,并且本机操作系统线程执行这些机器指令。当然,我这里说的不是绿线。
这有点过于简单化,我写的一些内容并不完全正确,但本质是这样的:
既然任何时候都只有一份 JVM 副本在运行,那么每个线程难道不需要自己的 JVM 副本吗?
并不真地。您可以允许多个线程从一块内存中读取数据(如内存中的同一地址),这样就只有一个 JVM。但是,您需要小心,以免线程在并发访问此类共享资源 (JVM) 时造成混乱,就像现实世界中的情况一样(想象一下两个人试图同时输入两个不同的文档与一台电脑)。
让多个线程与某些共享资源(例如 JVM(堆栈、堆、字节码编译器)、控制台、打印机等)一起正常工作的一种策略实际上是为每个线程拥有副本(每个人一台 PC)。例如,每个线程都有自己的堆栈。
然而,这并不是唯一的方法。例如,不可变资源(如内存中的类字节码)可以通过共享内存在多个线程之间共享,而不会出现问题。如果一份备忘录没有改变,两个人就可以同时安全地查看该备忘录。同样,由于类字节代码不会更改,因此多个线程可以同时从一份副本中读取它们。
另一种方法是使用锁来对线程之间的事情进行排序(无论谁触摸鼠标都可以使用 PC)。例如,您可以想象一个 JVM,其中只有一个字节码解释器,该解释器在所有线程之间共享,并由一个全局锁保护(这在实践中效率非常低,但您明白了)。
还有一些其他高级机制可以让多个线程使用共享资源。开发 JVM 的人使用了这些技术,这就是为什么您不需要每个线程都有 JVM 副本的原因。
归档时间: |
|
查看次数: |
2963 次 |
最近记录: |