当前位置: 首页 > 知识库问答 >
问题:

如何更改代码,以便垃圾回收器在程序运行期间删除此实例?

楚望
2023-03-14

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

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();
        }
    }
}

共有2个答案

伊温书
2023-03-14

如何更改代码,以便垃圾回收器在程序运行期间删除此实例?

您应该将对象的值设置为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方法中初始化了它。换句话说:主方法在应用程序停止时停止。

匡祖鹤
2023-03-14

您可以通过将扫描仪的参考设置为null,即sc=null,来删除对扫描仪的参考。

-或者-

如果您不再需要扫描仪,可以在使用后将其关闭:

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

更好的方法是按如下方式使用try with资源:

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

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

警告:切勿关闭系统的扫描仪。如果您仍然需要它从系统获得更多输入,请在中。在中,关闭扫描仪也将关闭系统。在中。考虑下面的代码:

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)

 类似资料:
  • 问题内容: 简短形式:CMS垃圾收集器似乎无法收集数量不断增加的垃圾;最终,我们的JVM填满,应用程序变得无响应。通过外部工具(JConsole或)强制GC 清理一次。 更新:该问题似乎与JConsole的JTop插件有关。如果我们不运行JConsole,或者在没有JTop插件的情况下运行它,则该行为消失。 (技术说明:我们正在Linux 2.6.9机器上运行32位Sun JDK 1.6.0_07

  • 主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、

  • 1.CMS介绍 CMS(Concurrent Mark-Sweep)(并发 标记-清除)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。 是标记清除算法的落地实现的垃圾回收器。 2.CMS过

  • 主要内容:垃圾回收算法,1、垃圾回收器的分类,2、串行垃圾回收器,3、吞吐量优先,4、响应时间优先,5、G1(Garbage First,jdk9默认),6、Full GC垃圾回收算法 1.标记清除 2.标记复制 3.标记整理 内存效率:复制算法>标记清除算法>标记压缩算法(时间复杂度) 内存整齐度:复制算法=标记清除算法>标记压缩算法 内存利用率:复制算法<标记清除算法=标记压缩算法 年轻代: 存活率低 复制算法 老年代: 区域大,存活率高 标记清除(内存碎片不是太多)+标记压缩共同实现 1、

  • 问题内容: 我有一个名为的文件,该文件引用了另一个仅包含函数且在循环中使用的文件。这些功能具有不同的优化功能。 然后,这将引用另外两个仅包含函数的相似文件,这些文件处于循环中。所有这些文件都使用numpy。 我认为这是因为函数调用循环并在numpy中创建数组导致了内存过载。因此,我无法完成一些优化算法,也无法遍历我想要的所有可能的坐标。 如何确保删除numpy中的变量?据我了解,numpy的C库使

  • 垃圾回收 我们对生产中花了很多时间来调整垃圾回收。垃圾回收的关注点与Java大致相似,尽管一些惯用的Scala代码比起惯用的Java代码会容易产生更多(短暂的)垃圾——函数式风格的副产品。Hotspot的分代垃圾收集通常使这不成问题,因为短暂的(short-lived)垃圾在大多情形下会被有效的释放掉。 在谈GC调优话题前,先看看这个Attila的报告,它阐述了我们在GC方面的一些经验。 Scal