ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

java – Inner Class有一个对外部类的隐式引用,可能会泄漏内存

2019-05-19 22:48:46  阅读:167  来源: 互联网

标签:java memory-leaks static inner-classes


在了解了内部类之后,我理解它有一个对外部类的隐式引用.

但我的老师告诉我,最好的方法是不使用内部类,更喜欢使用静态内部类.因为内部类可能会泄漏内存.

有人可以解释一下吗?

解决方法:

在您的评论的答案(如果我在评论中发布它将是不可读的),它所属的地方.访问外部内部类的示例.

public class Dog {
    String name;
}

public class HugeKennel {
    Double[] memmoryWaste = new Double[10000000];


    public List<Dog> getDogs() {
        SneakyDog trouble = new SneakyDog("trouble");
        return Arrays.asList(trouble);
    }

    class SneakyDog extends Dog {
        SneakyDog(String name) {
            this.name = name;
        }
    }

}

你代码中的其他地方

List<Dog> getCityDogs() {
    List<Dog> dogs = new ArrayList<>();
    HugeKennel k1 = ...
    dogs.addAll(k1.getDogs());
    HugeKennel k2 = ...
    dogs.addAll(k2.getDogs());
    return dogs;
}

....

List<Dog> cityDogs = getCityDogs();
for (Dog dog: dogs) {
    walkTheDog(dog);
}
// even though the Kenels were local variables in of getCityDogs(), they cannot be removed from the memory, as the SneakyDogs in the list are still referencing their parent kennels.
//from now on, until all the dogs are not disposed off, the kennels also have to stay in the memory.

因此,您不需要通过其parrent类访问内部类,一旦创建了内部对象,它就可以用作任何其他对象,并且可以“泄漏”到其容器类之外,就像上面的示例中那样,当狗列表将引用狗,但每只狗仍然会“知道”它的狗窝.

StackTrace中的链接示例与典型用例相关,当内部类被创建为“ad hock”作为匿名内部类时,但它是同样的问题.如果将引用传递给内部类的任何实例,那么您也“传递”对外部类的引用.

标签:java,memory-leaks,static,inner-classes
来源: https://codeday.me/bug/20190519/1138070.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有