在哪里住的方法? 堆栈或堆?(Where methods live? Stack or in H

2019-07-31 03:39发布

我知道,局部变量和方法paramters住在堆栈,但我没能找出其中不实际的方法生活在爪哇的情况下?

如果我宣布任何Thread对象,如:

Thread t=new Thread();
t.start();

因此,这意味着我已经从主要的方法创建的方法单独调用分开。 这是什么意思? 这是否意味着调用超过栈内存的方法单独序列的? 我对吗?

Answer 1:

每个线程被分配它自己的堆栈。

这篇文章有一个很好的介绍到Java进程中的内存分离。

Java虚拟机内部,每个线程都获得了Java堆栈,其中包含的数据没有其他线程可以访问,包括局部变量,参数和返回每个线程调用的方法的值。 堆栈上的数据被限制为原始类型和对象引用。 在JVM中,这是不可能的实际物体的图像放置在栈上。 所有对象驻留在堆上。

我见过很多场景中的客户端已经实现了每个线程确实非常少的基础上,巨大的线程服务器,以及它们运行到与内存问题。 这是因为每个线程被分配它自己的堆栈,而这个(显然)加起来。 我认为 ,默认值是512K每个线程,但我没有找到一个正规来源。



Answer 2:

如果我没有记错,该方法代码本身将生活在记忆的代码部分,而内部声明的变量将生活在堆栈,和对象将在堆上创建。 在Java中,变量的指针和基本生活在堆栈中,而任何创建的对象住在堆。

对于(差)ASCII码表示:

-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------

其中栈代表堆栈,FREE代表的可用内存,堆代表了堆,并且代码表示的代码空间。

这是我记忆中说 - 有些细节可能是错误的。



Answer 3:

堆栈是由方法调用。 什么java的压栈是一个方法调用的记录,它封装了所有的变量(包括参数和本地实例变量)该方法。 当您启动Java应用程序的主要方法(自动包括args参数)是堆栈上的唯一的事情:

main(args)

如果说你创建一个Foo对象并调用foo.method(),堆栈现在的样子:

method()
main(args)

作为方法被调用,它们被压入堆栈,当他们返回,他们被删除或从堆栈中“弹出”。 作为变量的声明和使用的堆栈条目,其对应于目前的方法(在堆栈的顶部),长到包括该变量的大小。

对于线程的例子,每个线程有自己的堆栈,它存在相互独立线程的堆栈。



Answer 4:

堆栈包含了所有的局部变量和所有活动的方法调用。 堆持有一切。

至于你的子问题:它意味着一个新的堆栈与它自己的专用内存中创建。 当你的新的线程将共享整个堆空间(内存)由JVM分配



Answer 5:

堆被分成多个代。

字节码,并汇编机器码其corrosponding JIT住在所谓的永久代,与实习字符串和其他类数据一起。

虽然它被称为“永久”的产生,它仍然可以被垃圾收集。 一些库,框架和JVM语言产生在运行时字节码,所以永久代有时需要清理。 就像堆的另一代人,但(人们通常希望)那么频繁。



Answer 6:

实际的字节码和/或这些JIT过的代码将住在进程的内存。 有可能仅会在进程内存它的一个副本,在一个给定的进程共享的所有线程的内存。 通过这些线程共享的任何变量将通过在共同的方法来存取。 本地线程(线程中使用甚至方法的局部变量)的变量将线程的内存中创建。



文章来源: Where methods live? Stack or in Heap?