首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内存泄漏示例-references和对象

内存泄漏示例-references和对象
EN

Stack Overflow用户
提问于 2020-10-23 15:15:13
回答 2查看 115关注 0票数 0

我有下面的method.Suppose,我从B类调用A.m1() 10,000次。因此,所有10,000个MyObj对象都将被垃圾收集,因为它们的作用域仅在m1()方法中。没有内存泄漏?

代码语言:javascript
复制
class A {
    String m1() {
        MyObj obj = new Mybj();
    }
}

我叫它下面

代码语言:javascript
复制
class B {
    void m2() {
        String s = classAObj.m1();
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-23 23:03:58

方法中创建的引用在超出作用域时最终会被垃圾收集。但这不一定要马上发生。

这里是一个演示,它显示了所收集的参考资料。但首先是一些条款。

  • 硬引用--对将存在的对象的正常引用

直到它被收集起来。这些是典型的实例值。

从对象创建.

  • 弱引用-指向同一对象作为硬引用的引用。

当硬引用被垃圾收集时,相关的弱引用也会被收集。

这是怎么回事。

方法collected

  • The

  • 方法m1被称为n时间,每次创建一个A实例的弱引用并返回它。然后将

  • 添加到列表中。一旦硬引用被垃圾收集,引用相同对象的弱引用也将是n弱引用,然后在尝试检索其关联时返回null。

对象.

代码语言:javascript
复制
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中。

代码语言:javascript
复制
        for (int i = 0; i < n; i++) {
            WeakReference<A> wk = m1();
            weak.add(wk);
        }

现在,遍历弱引用列表,查看有多少为null。预期为零

因为垃圾收集器还没有运行。在A中创建的所有m1分配仍然隐藏在堆中。

代码语言:javascript
复制
        int count = 0;
        for (WeakReference<A> wk : weak) {
            if (wk.get() == null) {
                count++;
            }
        }
       
        System.out.println(count); // probably zero

现在重复相同的过程,但是显式地调用垃圾收集器。

代码语言:javascript
复制
        count = 0;
        System.gc();
        for (WeakReference<A> wk : weak) {
            if (wk.get() == null) {
                count++;
            }
        }

在这一点上,计数应该是非零(或者可能是n,对于n的小值)到

显示部分或所有对象已被收集。

代码语言:javascript
复制
        System.out.println(count);
    }
    
    public WeakReference<A> m1() {
       A a = new A();
       return new WeakReference<>(a);
    }
}

class A {
}
票数 0
EN

Stack Overflow用户

发布于 2020-10-23 15:22:41

我想你有C++背景。在Java中,由于其垃圾收集系统,很难获得内存泄漏。垃圾收集可能会变得复杂,但基本思想是,有一个程序在后台不断运行,在堆中查找一个未使用的对象,当它找到一个对象时,它会删除它。因此,当您退出m1()方法时,没有对新的Mybj()对象的引用,因此垃圾收集器会删除它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64502729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档