局部变量的Java内存(Stack)分配
我正在学习java,现在我陷入了对象和局部变量的内存分配。 任何人都可以说明或澄清我的一些疑惑吗?
- 我读到了对象的实例变量和局部变量的堆和堆栈内存。 我有问题,天气为每种方法创建一个新的STACK? 或者对于整个类使用单个堆栈的每个类?
- 我读过每个线程正在创建ONE STACK是什么意思
谢谢Mahaveer
- 每个线程都有一个私有堆栈。
- 每个方法在该线程的堆栈中都有一个私有堆栈帧 。
堆栈以一对一的映射与线程相关联。 堆栈绝对不与方法和类相关联。
推理所有这些的方法是方法的局部变量对于该方法的每次调用都是私有的 。
每个线程都有自己的堆栈 。
- 无论何时使用
new
,都会在堆上创建一个对象 。 - 局部变量存储在堆栈中。 这包括基元 (例如
int
)和对创建的任何对象的引用 。 实际的对象本身并不是在堆栈上创建的,正如我在使用new
时提到的那样, 它们将在堆上创建。
我有问题,天气为每种方法创建一个新的STACK?
调用方法时使用相同的堆栈。 一个方法将在堆栈上创建它自己的小部分,称为“堆栈帧”,用于保存它的局部变量。
它就像一堆板,当一个方法被称为板时,板被添加到堆栈的顶部( 堆栈框架 ),当该方法结束时,板从堆栈中移除。 所有该方法的局部变量都将随之被销毁,但使用new
创建的实际对象则不会。
当JVM的垃圾收集器看到你不再需要它们时,它将会破坏堆上的 对象 (用new
创建的对象 )。
当然,java垃圾收集器总是处理堆,当它有机会被执行时,所以它只查找孤立对象并将它们擦掉,这就是为什么java中的NEW关键字总是在堆内存上创建新对象的原因。