Java 来自线程的进程、线程和方法调用-它们与堆栈的关系

Java 来自线程的进程、线程和方法调用-它们与堆栈的关系,java,c,multithreading,operating-system,java-threads,Java,C,Multithreading,Operating System,Java Threads,根据我作为Java程序员的理解: 每个线程都有其堆栈(对于Java,每个线程的默认堆栈大小为1M)。从线程调用的每个方法都有一个堆栈帧(只是线程堆栈内存的连续部分),线程堆栈只有堆栈帧。我的猜测是,一个进程也给出了一些堆栈(因此该进程的每个线程都得到了其堆栈的一部分) 进程是否有自己的堆栈,或者它进一步向线程提供(该堆栈的一部分)的某个堆栈? 另外,当我想到转义分析时,问题出现了:我了解到如果一个对象(引用)从未转义一个方法——它在堆栈上(而不是堆上),如果一个引用确实转义了一个方法,但只在一个

根据我作为Java程序员的理解:

每个线程都有其堆栈(对于Java,每个线程的默认堆栈大小为1M)。从线程调用的每个方法都有一个堆栈帧(只是线程堆栈内存的连续部分),线程堆栈只有堆栈帧。我的猜测是,一个进程也给出了一些堆栈(因此该进程的每个线程都得到了其堆栈的一部分)

进程是否有自己的堆栈,或者它进一步向线程提供(该堆栈的一部分)的某个堆栈?

另外,当我想到转义分析时,问题出现了:我了解到如果一个对象(引用)从未转义一个方法——它在堆栈上(而不是堆上),如果一个引用确实转义了一个方法,但只在一个线程中使用(=从未转义它的
run()
method)——它也在堆栈上

这意味着一个进程的“堆栈”大小没有限制,但我可以从一个进程创建(fork/clone)多少线程是有限制的(通常这个数字是多少?),并且存在最小的线程堆栈大小。所以我猜进程本身的堆栈并没有分配,有点“无限”(100%取决于线程堆栈分配)


相关:

你的问题是什么?从堆栈的角度来看,进程只是第一个线程,下一个线程不会将它们的堆栈放入进程堆栈(假设这就是为什么该进程的每个线程都会得到其堆栈的一部分的意思)@bruno I更正了我的问题:进程是否有自己的堆栈,或者它进一步给出的某个堆栈(该堆栈的一部分)到线程?同样不,每个线程都有自己的堆栈,这并不是因为您创建了一个新的线程,进程的堆栈(作为组中的第一个线程)就会减少。这就是为什么当您创建一个新线程时,进程growsA变量的全局大小可能会引用一个对象,但对象本身在堆上。Java不是C,在C中,您可以返回一个指向基于堆栈(或自动存储持续时间)变量的指针。进程有自己的堆栈,每个线程在生成线程时都有自己的堆栈。进程堆栈不是线程的一部分。线程堆栈是内核在编译时定义的每个线程的固定大小。