我如何更改代码以便垃圾收集器将由于程序删除此实例?

how can i change the code so the garbage collector will delete this instance due the program?

在我用 //D 标记的行中, 对象实例 Scanner 一次性使用。但只要程序播放(永远),它的内存就会留在堆中。为什么垃圾收集器不删除这个实例对象? 我如何更改代码以便垃圾收集器将由于程序删除此实例? 谢谢

package Try;

import java.util.Random;
import java.util.Scanner;

public class Foo1 extends Thread {

    private int min_, max_;
    Foo1(int max, Integer min) {

    max_ = max;
    min_ = min.intValue();
    }

    public void run() {

        Random rand_gen = new Random();
        while(true) {
            try {
                Thread.sleep(rand_gen.nextInt(max_-min_) + min_);
            }catch (InterruptedException e){
                e.printStackTrace();
            }
            System.out.println("you got new message");
        }
    }

    public static void main(String[] args){

        System.out.println("Insert 1 to start"); 

        Scanner sc = new Scanner(System.in); // D

        int i = sc.nextInt();

        if (i == 1) {
            Foo1 f1;
            int max = 1000;
            Integer min = new Integer(1000);
            Foo1 f2 = new Foo1(max, min);
            f1 = f2; // A
            f1.start();
        }
    }
}

how can i change the code so the garbage collector will delete this instance due the program?

您应该将对象的值设置为 null。然后垃圾收集器将释放该对象使用的堆内存。

public static void main(String[] args){

    System.out.println("Insert 1 to start"); 

    Scanner sc = new Scanner(System.in); // D

    int i = sc.nextInt();
    sc = null;

    if (i == 1) {
        Foo1 f1;
        int max = 1000;
        Integer min = new Integer(1000);
        Foo1 f2 = new Foo1(max, min);
        f1 = f2; // A
        f1.start();
    }
}

之所以没有在方法结束时自动删除是因为你在main-method中初始化了它。换句话说:主方法在应用程序停止时停止。

您可以删除对扫描仪的引用,方法是将其设置为 null,即 sc = null

-或-

如果您不再需要Scanner,可以在使用后关闭它:

int i = sc.nextInt();
sc.close();

更好的方法是使用 try-with-resources 如下:

int i;
try (Scanner sc = new Scanner(System.in)) {
    i = sc.nextInt();
}

请注意,sc.close() 关闭扫描器并释放资源,而 sc = null 删除对扫描器的引用,但资源可能仍保持打开状态。

警告: 如果您仍然需要它来获得来自 System.in 的更多输入,请不要关闭 System.inScanner,因为关闭 Scanner 也将关闭 System.in。考虑以下代码:

String s;
System.out.print("Enter a text: ");
try (Scanner sc = new Scanner(System.in)) {
    s = sc.nextLine();
}

try (Scanner in = new Scanner(System.in)) {
    System.out.print("Enter another text: ");
    s = in.nextLine();
}

尝试执行上面给出的代码将导致:

Enter a text: hello
Enter another text: Exception in thread "main" java.util.NoSuchElementException: No line found
    at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
    at Main.main(Main.java:14)