jvm Thread对象在启动之前有多重?

c6ubokkw  于 10个月前  发布在  其他
关注(0)|答案(2)|浏览(55)

我想知道在调用start()方法之前,Thread的示例是否只是一个标准的Java对象,或者是否从创建它们的那一刻起就分配了一些特殊的JVM/OS级别的资源(例如为它们的堆栈预先分配内存等)。根据初步的研究,它们看起来像普通的对象,但如果一些JVMMaven能够证实这一点,那就太棒了。
我最关心的是前面提到的线程的堆栈内存,因为JVM规范指出 “每个Java虚拟机线程都有一个私有的Java虚拟机堆栈,与线程同时创建”。我想知道 “created” 是否指的是对start()方法的调用或正在构造的Thread示例(老实说,我不知道OS线程、JVM线程和Thread对象之间的确切关系,因此我感到困惑。我也想我可能听说过它在过去几年里发生了一些变化,但我记不清了)。此外,我猜测,即使在构建Thread示例时分配了一些操作系统虚拟内存的情况下,其堆栈的实际物理内存页面也只会在线程开始使用之后分配,我再次猜测,这只是在start()-ed之后。
这就是“我可能听说过的变化”:jep-425在java-19中引入。它将OS线程和JVM线程之间的Map更改为M:N。然而,我仍然不确定Thread对象和JVM线程之间的Map(我几乎确定start()-艾德Thread对象和JVM线程之间的Map是1:1,但不确定JVM线程是在Thread示例创建时创建的还是在start()上创建的。我问过another question regarding this

rks48beu

rks48beu1#

尽管Thread构造函数执行了相当多的检查和初始化,但它不会将Thread示例绑定到本机OS线程。这只会发生在Thread.start()上,所以从这个意义上说,未启动的Thread不是一个“重”对象(我的意思是,它没有本地对等体)。
可能最昂贵的部分是,如果Thread是用inheritThreadLocals设置为true构造的(这发生在Thread的许多常见构造器中),并且创建线程在其map中有许多线程本地值。
也就是说,重申我对这个问题的评论,创建很多线程而不启动它们是不寻常的,通常表明你做错了什么(例如。扩展Thread而不是实现Runnable),您可能需要寻找替代方案。

58wvjzkj

58wvjzkj2#

在调用**start()**方法之前,Thread示例都是普通的Java Object,操作系统级的资源在Thread启动时由JVM分配,由JVM和操作系统管理。

**注意:**OS_Level资源是OS提供的组件和能力,用于管理和控制计算机系统中的进程和线程,包括:程序计数器(PC),线程调度,线程优先级,线程控制块(TCB)

相关问题