Menu Close

Java 垃圾收集器(GC)、静态方法/变量

Java垃圾回收是程序自动执行内存管理的过程。垃圾收集器(GC)查找未使用的对象并将其删除以回收内存。在Java中,对象的动态内存分配是使用使用某些内存的new运算符实现的,并且该内存将一直分配,直到存在用于该对象的引用为止。

如果没有对对象的引用,则假定不再需要该对象,并且可以回收该对象所占用的内存。无需明确销毁对象,因为Java自动处理了解除分配。

实现此目的的技术称为垃圾收集。当系统中没有要分配的内存时,未取消分配内存的程序可能会造成内存泄漏、程序崩溃。

Java中的垃圾回收会在程序的生命周期内自动发生,从而消除了取消分配内存的需求,从而避免了内存泄漏。

在C语言中,程序员应负责释放使用free函数动态分配的内存。这就是Java内存管理的方向。

注意:所有对象均在内存中创建。在后面的教程中将对此进行更多介绍。

Java中的垃圾收集器机制

1)示例代码:

class Student {
    int a;
    int b;

    public void setData(int c, int d) {
        a = c;
        b = d;
    }

    public void showData() {
        System.out.println("Value of a = " + a);
        System.out.println("Value of b = " + b);
    }

    public static void main(String args[]) {
        Student s1 = new Student();
        Student s2 = new Student();
        s1.setData(1, 2);
        s2.setData(3, 4);
        s1.showData();
        s2.showData();
        //Student s3;
        //s3=s2;
        //s3.showData();
        //s2=null;
        //s3.showData();
        //s3=null;
        //s3.showData();
    }
}

2)保存,编译和运行代码。如图所示,创建了两个对象和两个参考变量。

Java中的垃圾回收是什么?

3)取消注释行20、21、22。保存,编译并运行代码。

4)如下图所示,两个参考变量指向同一对象。

Java中的垃圾回收是什么?

5)取消注释第23和24行。编译,保存并运行代码

6)如下图所示,s2变为null,但是s3仍指向该对象并且不符合Java垃圾回收的条件。

7)取消注释第25和26行。保存,编译和运行代码

8)此时,没有指向该对象的引用,并且可以进行垃圾回收。它将从内存中删除,并且无法取回它。

如何在Java中删除对象?

1)如果要使对象有资格进行垃圾收集,请将其引用变量分配为null。

2)基本类型不是对象。无法将它们分配为null。

静态方法/变量

Java中的静态变量是属于该类的变量,并且在执行开始时仅初始化一次。它是属于该类而不属于实例变量。静态变量在执行开始时仅初始化一次。在初始化任何实例变量之前,将首先初始化这些变量。

  • 该类的所有实例共享一个副本
  • 静态变量可以通过类名直接访问,不需要任何对象

语法 :

<class-name>.<method-name>

Java中的静态方法

Java中的静态方法是属于类而不属于对象的方法。静态方法只能访问静态数据。它无法访问非静态数据(实例变量)。

  • 静态方法只能调用其他静态方法,而不能从中调用非静态方法。
  • 静态方法可以直接通过类名访问,不需要new对象
  • 静态方法无论如何都不能引用“ this”或“ super”关键字

语法 :

<class-name>.<method-name>

注意: main方法是静态的,因为在进行任何实例化之前,应用程序必须可以访问该方法。

让我们通过例子来学习static关键字的细微差别!

示例:如何调用静态变量和方法

步骤1)代码:

public class Demo{
    public static void main(String args[]){
        Student s1 = new Student();
        s1.showData();
        Student s2 = new Student();
        s2.showData();
    }
}
class Student {
    int a; 
    static int b;
    Student(){
        b++;
    }
    public void showData(){
        System.out.println("Value of a = "+a);
        System.out.println("Value of b = "+b);
    }

}

步骤2)保存并编译运行代码。

步骤3)预期的输出:

Value of a = 0
Value of b = 1
Value of a = 0
Value of b = 2

Java中的静态块

静态块是当一个类首次加载到JVM将被执行的Java类中的语句块。静态块随着类的加载而执行,而且只执行一次

class Test{
 static {
 //Code here
 }
}

以下程序是java静态块的示例。

public class Demo {
    static int a;
    static int b;
    static {
        a = 10;
        b = 20;
    }
    public static void main(String args[]) {

        System.out.println("Value of a = " + a);
        System.out.println("Value of b = " + b);

    }
}

输出:

Value of a = 10
Value of b = 20
Posted in Java

发表评论

相关链接