我如何更改代码以便垃圾收集器将由于程序删除此实例?
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.in
的 Scanner
,因为关闭 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)
在我用 //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.in
的 Scanner
,因为关闭 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)