不存储新声明的 object 会导致内存泄漏吗?
Does not storing a newly declared object cause a memory leak?
我想通过 post 标题说的是 - 这样做:
public static void makeNewObjectAndDoTask() {
new SomeClass().doYourTask();
}
我自己用 Java 和 JavaScript 等语言编写了这样的代码 - 声明一个新的 object 而不将其存储在变量中,只是为了调用它的一种方法。这会导致内存泄漏吗? ..或者 object 在 method-stack 结束时被清除/被 Java 垃圾收集器释放?
为了安全起见,我应该这样做吗?:
public static void makeNewObjectAndDoTask() {
SomeClass obj = new SomeClass().doYourTask();
obj = null;
//System.gc(); // Perhaps also call the collector manually?
}
正如评论者已经回答的那样,像
这样的代码没有内存泄漏
public static void makeNewObjectAndDoTask() {
new SomeClass().doYourTask();
}
至少就其本身而言,假设 SomeClass()
构造函数和 doYourTask()
方法不会造成内存泄漏。
当然,垃圾收集器会在将来某个时间清理 SomeClass 实例。
它是如何工作的?
- 无法再从程序代码访问的实例将被垃圾收集。可访问性意味着在变量、字段、数组元素、方法参数等中被引用。
- 一旦
new SomeClass().doYourTask();
语句完成,就无法再访问这个单独的 SomeClass
实例。因此,它符合垃圾收集标准。
- 下一次垃圾收集器 运行s,它可以回收实例占用的内存(及其字段,递归地,只要它们没有在别处被引用)。
替代代码
public static void makeNewObjectAndDoTask() {
SomeClass obj = new SomeClass().doYourTask();
obj = null;
}
仅延迟垃圾回收机会,因为它在 obj
中存储了一个引用,因此使实例至少可访问一小段额外的时间,直到您分配 obj = null;
.
像 System.gc();
那样手动调用垃圾收集器很少是个好主意。它强制 GC 运行(并将执行时间花在清理内存上),而不是依赖于 JVM 高度优化的 GC 调度策略。除非您对垃圾收集器有透彻的了解,否则不要这样做,这导致您得出 GC 策略在您的情况下失败的结论。
我们不希望出现 OutOfMemoryErrors,也不希望在垃圾回收上浪费过多的时间,标准的 GC 系统在这两方面都做得很好。
我想通过 post 标题说的是 - 这样做:
public static void makeNewObjectAndDoTask() {
new SomeClass().doYourTask();
}
我自己用 Java 和 JavaScript 等语言编写了这样的代码 - 声明一个新的 object 而不将其存储在变量中,只是为了调用它的一种方法。这会导致内存泄漏吗? ..或者 object 在 method-stack 结束时被清除/被 Java 垃圾收集器释放?
为了安全起见,我应该这样做吗?:
public static void makeNewObjectAndDoTask() {
SomeClass obj = new SomeClass().doYourTask();
obj = null;
//System.gc(); // Perhaps also call the collector manually?
}
正如评论者已经回答的那样,像
这样的代码没有内存泄漏public static void makeNewObjectAndDoTask() {
new SomeClass().doYourTask();
}
至少就其本身而言,假设 SomeClass()
构造函数和 doYourTask()
方法不会造成内存泄漏。
当然,垃圾收集器会在将来某个时间清理 SomeClass 实例。
它是如何工作的?
- 无法再从程序代码访问的实例将被垃圾收集。可访问性意味着在变量、字段、数组元素、方法参数等中被引用。
- 一旦
new SomeClass().doYourTask();
语句完成,就无法再访问这个单独的SomeClass
实例。因此,它符合垃圾收集标准。 - 下一次垃圾收集器 运行s,它可以回收实例占用的内存(及其字段,递归地,只要它们没有在别处被引用)。
替代代码
public static void makeNewObjectAndDoTask() {
SomeClass obj = new SomeClass().doYourTask();
obj = null;
}
仅延迟垃圾回收机会,因为它在 obj
中存储了一个引用,因此使实例至少可访问一小段额外的时间,直到您分配 obj = null;
.
像 System.gc();
那样手动调用垃圾收集器很少是个好主意。它强制 GC 运行(并将执行时间花在清理内存上),而不是依赖于 JVM 高度优化的 GC 调度策略。除非您对垃圾收集器有透彻的了解,否则不要这样做,这导致您得出 GC 策略在您的情况下失败的结论。
我们不希望出现 OutOfMemoryErrors,也不希望在垃圾回收上浪费过多的时间,标准的 GC 系统在这两方面都做得很好。