在标有//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();
}
}
}
如何更改代码,以便垃圾回收器在程序运行期间删除此实例?
您应该将对象的值设置为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方法中初始化了它。换句话说:主方法在应用程序停止时停止。
您可以通过将扫描仪的参考设置为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