繁体   English   中英

静态方法的Java实例变量

[英]Java instance variable of a static method

静态方法的实例变量何时在Java中获取内存? 在静态方法中创建实例变量是完全正确的(在参数中或在函数内部声明),但是我想知道静态方法的实例变量何时分配内存,如果没有创建该类的对象?

其实我是说静态方法里面的局部变量

首先, instance variable一词不准确,我假设您在下面的示例中询问诸如ab类的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存在时,将2c从堆栈中删除(实际上没有删除,但是堆栈的顶部更改为下面的两个位置,因此无论何时有其他东西进入堆栈,这两个值都将被覆盖),而new C()将保留在堆中,直到垃圾回收器触发为止。 由于GC可能检测到不再有对该对象的引用,因此可能会立即对其进行垃圾回收。

如果在静态方法中声明变量或使用参数,则根本不是实例变量。 它是一个局部变量,方法被调用后将被初始化

static void methodTest(int i) {

String s = "Hello";

}

s是该方法的局部变量。 i是函数参数,它也是方法的局部变量

静态方法中没有实例变量之类的东西。

如果您指的是参数和局部变量,则它们将分配在堆栈上(所有创建的对象将照常分配在堆上)。

类的静态字段将在加载类时初始化。

构造实例时,将分配(并可能初始化)类的实例变量。

静态方法定义的变量仍然是方法范围内的局部变量,就像非静态方法创建的局部变量一样。 但是,问题在于,只要不卸载类加载器(通常是主类,仅在运行时终止时才“卸载”该类,就像用左手抓挠左耳一样),该变量就永远不会被垃圾回收集。 而且,只有在不再引用对象的情况下,对象才会获得GC,并且在静态字段的情况下,即使由于我描述的行为而没有使用它们,它们也倾向于被引用。 因此,在存在内存和资源问题的大型应用程序中,在静态方法中声明任何内容是一个绝妙的主意,因为您很快就会用无法收集的局部变量来污染内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM