通常高级语言都支持多线程,所以虚拟机需要考虑如何高效地支持多线程,例如高级语言的线程和虚拟机的线程以及操作系统的线程关系是什么?是否可以支持协程?这些内容都非常复杂,部分内容也和垃圾回收密切相关,但限于篇幅,本书不展开介绍。
以JVM为例,JVM为了执行字节码或者编译代码,需要为代码准备执行的线程和线程栈。例如当启动JVM后,启动线程将变成执行Java的main线程,如果在Java代码中产生新的线程,则由OS产生线程。
所以,从这个角度来说Java字节码或者编译代码的执行和C语言的执行完全一致。但是JVM为了更好地管理和执行代码,实现了线程对象和线程栈对象,线程对象和线程栈对象也是分配在JVM的本地堆中。线程对象和线程栈对象除了会关联真正底层OS的线程之外,还会存储一些额外的信息,这些信息用于描述当前线程和线程栈的信息,比如线程属于哪个Java线程对象、关联哪个类加载器、线程栈的调用链信息等。
另外,高级语言通常会支持多言语的互操作,当进行互操作时,需要考虑不同语言线程执行的约定,例如参数和返回值如何组织,内存是否可以互访问等。在JVM中支持通过JNI(Java Native Interface)的方式调用C/C++代码,但是这样的互操作除了要考虑线程管理以外,还要考虑内存的影响,特别是垃圾回收的影响。例如JVM在执行一些JNI时通常会阻塞垃圾回收的执行(例如调用JNI的Critical API),当然阻塞与否还与垃圾回收器的实现有关。在第2章中介绍安全点相关的知识时会进一步展开介绍。