[英]Java instance variable of a static method
静态方法的实例变量何时在Java中获取内存? 在静态方法中创建实例变量是完全正确的(在参数中或在函数内部声明),但是我想知道静态方法的实例变量何时分配内存,如果没有创建该类的对象?
其实我是说静态方法里面的局部变量
首先, instance variable
一词不准确,我假设您在下面的示例中询问诸如a
和b
类的local variable
:
void method(int a) {
int b = 3;
}
在Java中,只有原语和引用存储在堆栈中,而对象在构造时存储在堆中。 范围一结束,堆栈将被清除,垃圾收集器将清除堆。
这是一个例子:
public class Main {
static A a = new A();
static void method() {
int b = 2;
C c = new C();
}
}
您的代码第一次引用Main
,类加载器将加载该类并初始化其所有静态字段-对象new A()
将进入堆。 这里什么也没有发生,方法method
也可能不存在。
当您调用method method
,它将在堆栈上添加值2
,然后在堆栈上添加引用c
,该引用将指向堆中的对象new C()
。
当method存在时,将2
和c
从堆栈中删除(实际上没有删除,但是堆栈的顶部更改为下面的两个位置,因此无论何时有其他东西进入堆栈,这两个值都将被覆盖),而new C()
将保留在堆中,直到垃圾回收器触发为止。 由于GC可能检测到不再有对该对象的引用,因此可能会立即对其进行垃圾回收。
如果在静态方法中声明变量或使用参数,则根本不是实例变量。 它是一个局部变量,方法被调用后将被初始化
static void methodTest(int i) {
String s = "Hello";
}
s
是该方法的局部变量。 i
是函数参数,它也是方法的局部变量
静态方法中没有实例变量之类的东西。
如果您指的是参数和局部变量,则它们将分配在堆栈上(所有创建的对象将照常分配在堆上)。
类的静态字段将在加载类时初始化。
构造实例时,将分配(并可能初始化)类的实例变量。
静态方法定义的变量仍然是方法范围内的局部变量,就像非静态方法创建的局部变量一样。 但是,问题在于,只要不卸载类加载器(通常是主类,仅在运行时终止时才“卸载”该类,就像用左手抓挠左耳一样),该变量就永远不会被垃圾回收集。 而且,只有在不再引用对象的情况下,对象才会获得GC,并且在静态字段的情况下,即使由于我描述的行为而没有使用它们,它们也倾向于被引用。 因此,在存在内存和资源问题的大型应用程序中,在静态方法中声明任何内容是一个绝妙的主意,因为您很快就会用无法收集的局部变量来污染内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.