我有下面的method.Suppose,我从B类调用A.m1() 10,000次。因此,所有10,000个MyObj对象都将被垃圾收集,因为它们的作用域仅在m1()方法中。没有内存泄漏?
class A {
String m1() {
MyObj obj = new Mybj();
}
}我叫它下面
class B {
void m2() {
String s = classAObj.m1();
}
}发布于 2020-10-23 23:03:58
方法中创建的引用在超出作用域时最终会被垃圾收集。但这不一定要马上发生。
这里是一个演示,它显示了所收集的参考资料。但首先是一些条款。
直到它被收集起来。这些是典型的实例值。
从对象创建.
当硬引用被垃圾收集时,相关的弱引用也会被收集。
这是怎么回事。
方法collected
m1被称为n时间,每次创建一个A实例的弱引用并返回它。然后将
n弱引用,然后在尝试检索其关联时返回null。对象.
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
public class GarbageCollection {
public static void main(String[] args) {
// get out of static context
new GarbageCollection().start();
}
public void start() {
int n = 10_000;
List<WeakReference<A>> weak = new ArrayList<>();通过调用n并返回引用,创建A的弱引用。然后将其添加到List中。
for (int i = 0; i < n; i++) {
WeakReference<A> wk = m1();
weak.add(wk);
}现在,遍历弱引用列表,查看有多少为null。预期为零
因为垃圾收集器还没有运行。在A中创建的所有m1分配仍然隐藏在堆中。
int count = 0;
for (WeakReference<A> wk : weak) {
if (wk.get() == null) {
count++;
}
}
System.out.println(count); // probably zero现在重复相同的过程,但是显式地调用垃圾收集器。
count = 0;
System.gc();
for (WeakReference<A> wk : weak) {
if (wk.get() == null) {
count++;
}
}在这一点上,计数应该是非零(或者可能是n,对于n的小值)到
显示部分或所有对象已被收集。
System.out.println(count);
}
public WeakReference<A> m1() {
A a = new A();
return new WeakReference<>(a);
}
}
class A {
}发布于 2020-10-23 15:22:41
我想你有C++背景。在Java中,由于其垃圾收集系统,很难获得内存泄漏。垃圾收集可能会变得复杂,但基本思想是,有一个程序在后台不断运行,在堆中查找一个未使用的对象,当它找到一个对象时,它会删除它。因此,当您退出m1()方法时,没有对新的Mybj()对象的引用,因此垃圾收集器会删除它。
https://stackoverflow.com/questions/64502729
复制相似问题