线程对象在哪里创建?堆栈还是堆?

Chi*_*ran 5 java concurrency multithreading

当我说出类似的话:

Thread t1 = new Thread();
Run Code Online (Sandbox Code Playgroud)

它是在堆还是堆栈上创建它?

SLa*_*aks 11

无法在Java中在堆栈上分配对象.
堆栈只能保存引用和基元,并且只能保存局部变量.

请注意,启动一个线程将为该线程创建一个新堆栈.

  • +1更具体地说,`Thread`对象及其字段在堆上分配.与新线程关联的堆栈内存由JVM/OS分配,但在堆上不是_not_.它分配在不同的内存部分. (2认同)

Try*_*ing 9

Thread t1 = new Thread();
Run Code Online (Sandbox Code Playgroud)

这会在堆中分配对象即t1.

随着每个新线程的出现,它将获得自己的pc寄存器(程序计数器)和Java堆栈.如果线程正在执行Java方法(不是本机方法),则pc寄存器的值指示要执行的下一条指令.线程的Java堆栈存储线程的Java(非本机)方法调用的状态.一个Java方法调用的状态包括its local variables, the parameters with which it was invoked, its return value(如果有的话), and intermediate calculations.本机方法调用的状态以依赖于实现的方式存储在本机方法堆栈中,也可能存储在寄存器或其他依赖于实现的存储区域中.

Java堆栈由堆栈帧(或帧)组成.堆栈帧包含一个Java方法调用的状态.当线程调用方法时,Java虚拟机会将新帧推送到该线程的Java堆栈.方法完成后,虚拟机将弹出并丢弃该方法的框架.

Java虚拟机没有用于保存中间数据值的寄存器.指令集使用Java堆栈存储中间数据值.

该图显示了正在执行三个线程的虚拟机实例的快照.在快照的瞬间,线程1和线程2正在执行Java方法.线程三正在执行本机方法.它还显示了Java虚拟机为每个线程创建的内存区域,这些区域对于拥有线程是私有的.没有线程可以访问另一个线程的pc寄存器或Java堆栈.

在此输入图像描述