静态方法的实例变量什么时候在java中获取内存? 在静态方法中创建实例变量是完全正确的(在参数中或在函数内部声明),但我想知道静态方法的实例变量何时被分配内存,如果没有创建类的对象?
实际上我的意思是说静态方法中的局部变量
答案 0 :(得分:2)
首先,术语Name - Count(1)
Heavy - 2
Light - 1
不准确,我假设您在下面的示例中询问instance variable
,例如local variable
和a
:
b
在Java中,只有基元和引用存储在堆栈中,对象在构造时存储在堆中。一旦范围结束,就会清理堆栈,堆由垃圾收集器清理。
以下是一个例子:
void method(int a) {
int b = 3;
}
第一次代码引用public class Main {
static A a = new A();
static void method() {
int b = 2;
C c = new C();
}
}
时,类加载器将加载类并初始化其所有静态字段 - 对象Main
将进入堆。这里没有更多的事情发生,方法new A()
也可能不存在。
当你调用方法method
时,它会在堆栈上添加值method
,然后它会在堆栈上添加引用2
,它将指向对象{{1}在堆中。
当方法存在时,c
和new C()
将从堆栈中删除(实际上没有删除,但堆栈的顶部更改为下面的两个位置,因此每当这两个值都将被覆盖其他东西进入堆栈),而2
将保留在堆中直到垃圾收集器触发。由于GC可能检测到没有对此对象的更多引用,因此很可能会立即对其进行垃圾回收。
答案 1 :(得分:0)
如果在静态方法中声明变量或使用参数,则它不是所有实例变量。它是一个局部变量,一旦调用该方法就会被初始化
static void methodTest(int i) {
String s = "Hello";
}
此处s
是该方法的局部变量。
i
是函数参数,也是方法的局部变量
答案 2 :(得分:0)
静态方法中没有实例变量这样的东西。
如果你的意思是参数和局部变量,那些就是在堆栈上分配的(像往常一样在堆上分配任何创建的对象)。
加载类时,将初始化类的静态字段。
在构造实例时,将分配(并可能初始化)类的实例变量。
答案 3 :(得分:-3)
静态方法定义的变量仍然是方法范围内的局部变量,就像非静态方法创建局部变量一样。然而,问题是变量永远不会被垃圾收集,只要类加载器(通常是主类,它只是在运行时终止时才会卸载"这就像用你的右手抓你的左耳)没有卸载和垃圾收集。只有当对象不再被引用时,对象才会获得GC,并且在静态字段的情况下,由于我所描述的行为,即使没有使用它们,它们也有被引用的倾向。因此,在内存和资源问题的大型应用程序中,在静态方法中声明任何内容是非常糟糕的,因为很快就会使用无法收集的LOCAL VARIABLES污染内存。