Java JVM把基本变量存储在何处,如何释放基本变量使用后的内存?
我猜应该是存在栈上吧?
class Foo
{
private int value;
...
}
这个变量在概念上将存在于堆中,作为任何Foo
实例数据的一部分。它将随着释放实例而被释放 - 它只是表示Foo
实例的数据块中的4个字节;它不需要单独的内存释放。
变量存储的位置取决于变量是局部变量还是实例变量。
局部变量存储在堆栈中。实例和静态变量存储在堆中。
让我用一个例子来解释。假设我们有一个自定义类Animal的实例变量animal。 Animal animal = new Dog(); 这里,animal只是一个引用,并位于堆栈上。实际对象分配在堆上。该引用animal将指向在堆上分配的此对象内存。因此,如果您有3个引用指向同一对象。
Animal animal1 = new Dog();
Animal animal2 = new Dog();
Animal animal3 = new Dog();
所有三个引用将存储在堆栈中。当我提到引用时,它只是指向堆上对象的指针。就内存而言,此引用保存了对象在堆上的地址(实际上这里还有一些抽象)。因此,在32位和64位系统上,此引用占用4字节和8字节。只有当所有三个引用都被取消引用即不再在作用域内(或者说不再指向原始对象)时,垃圾回收器才可以释放分配给堆上对象的内存。
当我们存储基本类型或字符串常量时,会有一些微小的变化。除非你使用new()运算符显式地创建它们的对象,否则它们将在堆的permGen区域中创建和存储。因此,firstString和secondString两个引用都指向同一字符串,该字符串存储在permGen区域中。
String firstString = "Stack";
String secondString = "Stack";
相同的字符串字面量指向String池中的同一个对象。如果我们使用new()来创建字符串,那么就会指向不同的对象。
Dog
对象时犯了一个小错误。有三个不同的对象由三个不同的Animal
引用指向。 - asgs