日期:2014-05-20  浏览次数:20832 次

匿名类数组,会造成内存泄漏吗?
这样定义数组
Employee[] emps = {new Employee("1"), new Employee("2"), new Employee("3"), new Employee("4") ... };
听某架构师说,这样写可能会内存泄漏影响性能,求证一下。

不然就的这样写了,太麻烦:
Employee emp1 = new Employee("1");
Employee emp2 = new Employee("2");
Employee emp3 = new Employee("3");
Employee emp4 = new Employee("4");
...

Employee[] emps = {emp1, emp2, emp3,emp4 ... };


------解决方案--------------------
某架构师?有这说法吗,看不出来有什么区别。。
------解决方案--------------------
比如Employee emp1 = new Employee("1");有指向此实例的句柄引用emp1,在执行完这句后该实例还是存活的,即GC不去回收它。
new Employee("1");这句因为它是匿名对象,没有引用句柄指向它,所以在执行完这句后已经变为垃圾了,GC可以回收。

Employee[] emps = {new Employee("1"), new Employee("2"), new Employee("3"), new Employee("4") ... };这样写有可能在某些情况下GC没有回收已经不存活的垃圾了,所以可能会造成内在泄露。
------解决方案--------------------
推荐一篇博客,Java 内存管理原理、内存泄漏实例及解决方案研究我觉得对楼主你理解那个架构师的讲法有帮助。
------解决方案--------------------
谁说没引用的?那个数组变量不就引用他们么?
------解决方案--------------------
用完数组后手动将所有的元素置null,否则的话,数组完蛋后GC第一轮收集数组对象,之后才会再次收集里面的元素对象

没有直接引用不代表没有引用,只要数组还或者,元素就不会死
------解决方案--------------------
GC不就是清理没有引用的对像吗?
要是它真的没有引用,下次GC就被清理了。
------解决方案--------------------
不知道你同事是怎么得出这个结论的...
如果连匿名引用都处理不了,JAVA也早就该退出市场了...

不过这种写法的确不是一个很好的编程风格倒是真的
------解决方案--------------------
什么叫在servlet里这么写而忘记内存管理???
JAVA能给你做内存管理吗...咱表示越听越糊涂...
------解决方案--------------------
1、楼主结帖率太低

2、不赞成楼主的架构师的说法,那样写不会造成内在泄露,对性能也没什么影响
------解决方案--------------------
servlet中要真这么用,好像确实要手动清理的,单例,当前servlet对像一直是有效的,
但觉得你这两种写法还是一样的,关键就在于用了全局变量,这是必要的吗?全局变量还得考虑线程安全,
------解决方案--------------------
探讨
我在水区发了许多水帖都还没结呢,很少发技术帖。
这样写法我也觉得很好,我还喜欢这样写呢
emps = { new Employee("1").setName("xxx").setAdress("xx"),
new Employee……