在Java中,我做了很多类似的事情而没有考虑太多:
public class Main {
public void run() {
// ...
}
public static void main(String[] args) {
new Main().run();
}
}
但是,最近我不确定这样做是否安全。毕竟,在Main
对象创建之后就没有对它的引用了(嗯,有this
引用,但是这个值吗?),所以看起来存在垃圾回收器可能会在执行过程中删除该对象的危险的东西。因此,该main
方法应如下所示:
public static void main(String[] args) {
Main m = new Main();
m.run();
}
现在,我很确定第一个版本可以使用,并且我从未遇到任何问题,但是我想知道在所有情况下这样做是否安全(不仅在特定的JVM中,而且最好根据语言规范对此类情况的说明)。
如果正在执行对象方法,则意味着某人拥有该引用。因此,不,在执行方法时无法对对象进行GC处理。
在Java中,我没有多想就做了以下事情: 然而,最近我变得不确定这样做是否安全。毕竟,在创建对象之后,没有对该对象的引用(嗯,有引用,但这算不算?),因此看起来垃圾回收器可能会在执行某项内容时删除该对象。因此,方法应该如下所示:
问题内容: 我有一个Java应用程序正在泄漏内存。我知道在垃圾回收期间哪些对象没有被释放,但是我无法确定引用它们的对象。 JVM内部保存的对象图是否具有某种可见性? 否则就有可能找出哪些对象引用了另一个对象? 问题答案: 在真正的基础上,您可以使用命令jhat和jmap从正在运行的Java进程中读取堆文件,然后对其进行处理- 它在本地端口上启动小型Web服务器。它并不是很容易阅读,但是您不必购买分
有人能给我解释一下原因吗?
问题内容: 有没有一种方法可以检查垃圾收集器是否可以提取对象? 在我的代码中的某个地方,我有一个对象的引用: 然后,通过Eclipse Debugger,获得对象的存储位置。之后,我将引用设置为null: 有什么方法可以检查以前引用的对象现在是否适合垃圾回收,或者是否有其他引用? 非常感谢, 斯特凡 问题答案: 您无法在运行时使用任意对象执行此操作,实际上,不可能完全确定地执行此操作。但是,有两种
在linux上,我似乎通过使用一些多线程来打破。就我所见,我正在设法在一个不是主GUI线程的线程上触发垃圾收集。这导致在实例,它试图从错误的线程调用堆栈,在linux上造成混乱。 下面的代码是我能想到的最小的例子。请注意,我没有使用做任何真正的工作,但是我不能以其他方式触发问题。上的方法验证正在从另一个线程中删除实例。典型输出为: 通过修改库代码,我可以验证是从与相同的地方调用的。 我的结论正确吗
[GC(分配失败)[defnew:10931K->472K(12288K),0.0053905秒]10931K->10712K(39616K),0.0054285秒][times:user=0.00 sys=0.00,real=0.01秒] [GC(分配失败)[defnew:10712k->472k(12288k),0.0057686秒]20952k->20952k(39616k),0.00580