[英]Does not storing a newly declared object cause a memory leak?
我的意思是通过帖子标题说的是 - 这样做:
public static void makeNewObjectAndDoTask() {
new SomeClass().doYourTask();
}
我自己用 Java 和 JavaScript 等语言编写了这样的代码 - 声明一个新的 object 而不将其存储在变量中,只是调用它的一种方法。 这会导致 memory 泄漏吗? ..或者 object 是否在方法堆栈的末尾被清除/被 Java 垃圾收集器释放?
为了安全起见,我应该这样做吗?:
public static void makeNewObjectAndDoTask() {
SomeClass obj = new SomeClass().doYourTask();
obj = null;
//System.gc(); // Perhaps also call the collector manually?
}
正如评论者已经回答的那样,代码中没有 memory 泄漏
public static void makeNewObjectAndDoTask() {
new SomeClass().doYourTask();
}
至少就其本身而言,假设SomeClass()
构造函数和doYourTask()
方法不会创建 memory 泄漏。
当然,垃圾收集器会在未来某个时间清理 SomeClass 实例。
它是如何工作的?
new SomeClass().doYourTask();
语句已完成,无法再访问这个单独的SomeClass
实例。 因此,它满足垃圾收集标准。替代代码
public static void makeNewObjectAndDoTask() {
SomeClass obj = new SomeClass().doYourTask();
obj = null;
}
只会延迟垃圾收集机会,因为它将引用存储在obj
中,从而使实例可访问至少一小段时间,直到您分配obj = null;
.
在System.gc();
很少是一个好主意。 它强制 GC 运行(并将执行时间花在清理内存上),而不是依赖 JVM 高度优化的 GC 调度策略。 除非您对垃圾收集器有透彻的了解,否则不要这样做,这导致您得出结论认为 GC 策略在您的情况下失败。
我们不希望出现 OutOfMemoryErrors,也不希望浪费过多的时间用于垃圾回收,而标准的 GC 系统在这两方面都做得非常好。
我想我在评论中找到了来自@luk2302和@FedericoklezCulloca的答案,令人满意。 期待其他人使用这篇文章 - 或者回答,也许。 谢谢你,stackoverflow 社区!~
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.