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个字节; 它不需要单独的释放.
存储变量的位置取决于变量是局部变量还是实例变量.
局部变量存储在堆栈中.实例和静态变量存储在堆上.
让我用一个例子解释一下.假设我们有一个自定义类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()创建它们时,它会指向不同的对象.
归档时间: |
|
查看次数: |
21555 次 |
最近记录: |