JVM在哪里存储原始变量?

JRo*_*mio 23 java jvm memory-management

Java JVM在哪里存储原始变量,以及原语在使用后释放的内存如何释放?

我猜它是在堆栈上?

Jon*_*eet 39

简单的答案:它取决于声明变量的位置,而不是它的类型.

局部变量存储在堆栈中.实例和静态变量存储在堆上.

不要忘记,对于引用类型变量,变量的值是引用,而不是对象.(数组也是引用类型 - 所以如果你有int[],则值将在堆上.)

现在,这可能是一个过于简单的答案,因为智能VM 可能能够检测特定引用类型变量是否引用永远不会"逃避"当前方法的对象.如果是这种情况,它可能会内联堆栈上的整个对象.

但从概念上讲,这个模型是准确的.所以类型的变量int被声明为实例变量,如下所示:

class Foo
{
    private int value;
    ...
}
Run Code Online (Sandbox Code Playgroud)

将概念上存在于堆上,作为任何实例的数据的一部分Foo.它将作为释放实例的一部分释放 - 它只是表示Foo实例的数据块中的4个字节; 它不需要单独的释放.

  • @Ben:在这种情况下,我根本不会把它称为变量.我没有声明堆中的所有*都是实例或静态变量.无论如何,澄清之后肯定会更好,所以谢谢:) @Rakesh:是的,数组是引用类型.您是否认为每次执行作业时都会复制数组的全部内容? (2认同)

小智 5

  • 类对象,包括方法代码和静态字段:堆。
  • 对象,包括实例字段:堆。
  • 局部变量和对方法的调用:堆栈


Ani*_*kur 5

存储变量的位置取决于变量是局部变量还是实例变量.

局部变量存储在堆栈中.实例静态变量存储在堆上.

让我用一个例子解释一下.假设我们有一个自定义类Animal的实例变量动物.动物动物=新狗(); 这里的动物只是一个参考,位于堆栈上.实际对象在堆上分配内存.此引用动物将指向在堆上分配的此对象内存.因此,如果您有3个引用指向同一个对象.

Animal animal1 = new Dog();
Animal animal2 = new Dog();
Animal animal3 = new Dog();
Run Code Online (Sandbox Code Playgroud)

所有三个引用都将在堆栈中.当我说引用它只是一个指向堆上对象的指针.在内存方面,这个引用保存了堆上对象的地址(这里实际上没有更多的抽象).因此32位为4个字节,64位为8个字节.只有当所有三个引用都被解除引用时,即它们不再在范围内(或者更确切地说不再指向原始对象),那么只有垃圾收集器可以释放分配给堆上对象的内存.

当我们存储基本类型或字符串文字时,存在轻微的变化.除非使用new()运算符显式创建它们的对象,否则它们将被创建并存储在Heap的permGen区域中.所以两者都引用了firstString和secondString

String firstString = "Stack";
String secondString = "Stack";
Run Code Online (Sandbox Code Playgroud)

将指向String池中的同一对象.当我们使用new()创建它们时,它会指向不同的对象.