在下面的示例中,new Thread()没有任何引用。可能是被废弃的垃圾收集了吗?同样,在不扩展Thread类或实现可运行的情况下,我们如何创建线程?
public class TestFive {
private int x;
public void foo() {
int current = x;
x = current + 1;
}
public void go() {
for(int i = 0; i < 5; i++) {
new Thread() {
public void run() {
foo();
System.out.print(x + ", ");
}
}.start();
}
}
public static void main(String args[]){
TestFive bb = new TestFive();
bb.go();
}
}
如果尚未启动的新线程无法正常访问,则将对其进行垃圾回收。
已经启动的新线程成为垃圾回收“根”。它不会(直到)完成才被垃圾收集。
在下面的示例中,new Thread()没有任何引用。可能是被废弃的垃圾收集了吗?
不。它已经启动,因此在完成/死亡之前不会被垃圾收集。并且它 确实 有一个可达的引用,直到(至少)start()
调用返回为止。
同样,在不扩展Thread类或实现可运行的情况下,我们如何创建线程?
在你的榜样,你 已经 创建的匿名子类Thread
; 即扩展的类Thread
。
我看到的所有解决方案都需要使用。但是,我想在Eclipse之外的单个文件上使用CDT解析器。那有什么办法吗?
问题内容: 在学习OCJP时,我遇到了以下问题: 当// doStuff到达时,有多少个对象可以使用GC? 正确答案是2,含义及其目的。 当到达// doStuff行时,c3也为null。为什么它也没有资格获得GC? 问题答案: c3是带有空引用的本地句柄,它不指向(并且已经指向了)分配的对象。因此,GC无需任何操作。
问题内容: 首先,我想澄清一下我的理解,因为以下问题是相同的。 上面代码的输出是 这意味着,尽管一旦GC运行,实际的对象对象就会被垃圾回收,但是内存中仍然有一个类对象,该对象此时不指向任何对象。 现在考虑到上述理解为真,我对工作原理感到困惑。在下面的代码中 输出: 现在的 问题 是,据说输入是弱引用,这意味着在上面的代码中, 成为实际对象时可以进行垃圾回收,因为不再有对该对象的强引用,但是 和作为
我在为异步消息传递开发轻量级库的过程中遇到了这种情况。为了了解创建大量中等大小的短生命周期对象的成本,我编写了下面的测试: 在我的笔记本电脑上,使用默认的GC设置,它运行大约需要95秒: 这就是事情变得奇怪的地方。我调整了程序,为每次迭代分配一个新对象: 理论上,这应该会增加一些小开销,但是没有一个对象应该被提升到Eden之外。充其量,我希望运行时接近相同。然而,这个测试在大约17秒内完成: 我运
问题内容: 如果堆上有两个互相引用的对象,但它们没有链接到任何引用变量,那么这些对象是否可以进行垃圾回收? 问题答案: 对,他们是。基本上,GC从“已知根”(静态变量,来自alll线程中所有堆栈帧的局部变量)中查找无法进行垃圾回收的对象。如果无法从根目录访问对象,则可以收集该对象。 编辑:汤姆指出了这一点,我认为值得将答案本身引入: 从技术上讲,静态变量不是根-它们是由类加载器所引用的类所引用的,
问题内容: 我已经阅读了很多有关在Java中优化GC的文章,并且经常想知道有多少人 真正 使用了一些更高级的功能。 我一直避免在可能的地方进行调整,而专注于编写我能做的最简单的代码(Brian Goetz的建议)-到目前为止,这对我来说似乎一直很好。 这些调整策略是否具有弹性,可以跨VM版本进行更改,或者它们需要不断进行重新评估? 我使用的一种调优是-server标志。 问题答案: 我当前工作的一