这样定义数组
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 ... };

解决方案 »

  1.   

    比如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没有回收已经不存活的垃圾了,所以可能会造成内在泄露。
      

  2.   

    推荐一篇博客,Java 内存管理原理、内存泄漏实例及解决方案研究我觉得对楼主你理解那个架构师的讲法有帮助。
      

  3.   

    用完数组后手动将所有的元素置null,否则的话,数组完蛋后GC第一轮收集数组对象,之后才会再次收集里面的元素对象没有直接引用不代表没有引用,只要数组还或者,元素就不会死
      

  4.   

    GC不就是清理没有引用的对像吗?
    要是它真的没有引用,下次GC就被清理了。
      

  5.   

    不知道你同事是怎么得出这个结论的...
    如果连匿名引用都处理不了,JAVA也早就该退出市场了...不过这种写法的确不是一个很好的编程风格倒是真的
      

  6.   

    架构师的原话我已经忘了,可能他的意思是不推荐这样写,如果在servlet里面这样写,而忘记内存管理了可能真会overflow,但是我很喜欢这样写啊。
      

  7.   

    什么叫在servlet里这么写而忘记内存管理???
    JAVA能给你做内存管理吗...咱表示越听越糊涂...
      

  8.   

    servlet里面可能是这样吧,Employee[] emps作为全局变量方法体内部这样定义:这些作局部变量
    Employee emp1 = new Employee("1");
    Employee emp2 = new Employee("2");
    Employee emp3 = new Employee("3");
    Employee emp4 = new Employee("4");
    emps = {emp1, emp2, emp3,emp4 ... };方法体运行完了,局部变量回收,然后所有数组对象回收了吗?貌似回收了。如果方法体里面用这个emps = {new Employee("1"), new Employee("2"), new Employee("3"), new Employee("4") ... };
    就无法回收了。
    不过我把它emps 设成null不就能回收了吗,不是还能简化很多代码吗?
    也有可能一条线程定义了一个数组,emps = {new Employee("1"), new Employee("2"), new Employee("3"), new Employee("4") ... };然后另一个现成,改变了它的长度:emps = {new Employee("1"), new Employee("2"), new Employee("3"), ... };导致有些对象不能回收?
    或者说emps = {new Employee("1"), new Employee("2"), new Employee("3"), new Employee("4") ... };这样会导致GC回收效率下降?
      

  9.   

    servlet中要真这么用,好像确实要手动清理的,单例,当前servlet对像一直是有效的,
    但觉得你这两种写法还是一样的,关键就在于用了全局变量,这是必要的吗?全局变量还得考虑线程安全,
      

  10.   

    我在水区发了许多水帖都还没结呢,很少发技术帖。
    这样写法我也觉得很好,我还喜欢这样写呢
    emps = { new Employee("1").setName("xxx").setAdress("xx"), 
        new Employee("2").setName("xxx").setAdress("xx"), 
        new Employee("3").setName("xxx").setAdress("xx"),  ... };
      

  11.   


    你这个 set 方法写成级联调用的了,一般来说 set 方法是没有返回值的。你这样做的话,会导致一些 POJO 类不符合 JavaBeans 规范。