List、MAP等集合对象是否有使用完后,未清除造成内存溢出

夏天的烟火s 2015-11-26 04:25:48
谁知道List、MAP等集合对象是否有使用完后,未清除造成内存溢出是怎么回事,最好有实例。
...全文
11592 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wht5771417 2019-08-01
  • 打赏
  • 举报
回复
创建一个定时器,比如1秒钟执行一次,然后调用一个方法,方法里面就new 一个ArrayList,然后添加一些数据,什么都不用干,运行一段时间监控内存占用情况。你会发现内存占用越来越多…………
lankk1 2018-08-31
  • 打赏
  • 举报
回复
使用obj.clear(),然后system.gc()
华芝塔尼欧 2018-06-26
  • 打赏
  • 举报
回复
引用 6 楼 zhoubin86282972 的回复:
避免内存溢出的原则之一:如果对象不再使用,那么在使用完后,不再让任何地方引用这个对象:

void dosmt(){
List obj = new ArrayList();
obj.add(1);
//执行很多逻辑代码
...

//最后
obj = null;
}

上面这是一种情况,但是由于这个obj,是局部变量,当代码执行完成后,obj就随时能被回收了
第二种情况

class Example{
private static List obj = new ArrayList()

void dosmt(){
List obj = new ArrayList();
obj.add(1);
//执行很多逻辑代码
...

//最后
obj = null;
}

这儿时候,由于obj是全局静态变量,doSmt执行完后,obj由于还再被引用,所以不能被回收,这个时候如何列表中存储大量数据,就可能造成内存溢出了

}

第二种方法,obj.removeall(obj),都不好使,我都不知道怎么释放。用JVisualVM看,heap呼呼的被使用。。。泪奔
ranjio_z 2015-12-02
  • 打赏
  • 举报
回复
new出来的应该都是堆里边的东西,不调用delete,堆里边的内存空间是不会释放的。需要做的步骤为:

void f(){
    List a=new ArrayList<int>();
    a.add(1);
    a.add(2);
    a.add(3);
    ...
    delete a;
}
火车头 2015-12-02
  • 打赏
  • 举报
回复
第二块代码有点问题:

class Example{
    private static List obj = new ArrayList()
 
    void dosmt(){
        obj = new ArrayList();
        obj.add(1);
        //执行很多逻辑代码
...
 
    //最后
        obj = null;
    }
     
    这儿时候,由于obj是全局静态变量,doSmt执行完后,obj由于还再被引用,所以不能被回收,这个时候如何列表中存储大量数据,就可能造成内存溢出了
 
}
火车头 2015-12-02
  • 打赏
  • 举报
回复
第二块代码有点问题:

class Example{
    private static List obj = new ArrayList()
 
    void dosmt(){
        List obj = new ArrayList();
        obj.add(1);
        //执行很多逻辑代码
...
 
    //最后
        obj = null;
    }
     
    这儿时候,由于obj是全局静态变量,doSmt执行完后,obj由于还再被引用,所以不能被回收,这个时候如何列表中存储大量数据,就可能造成内存溢出了
 
}
火车头 2015-12-02
  • 打赏
  • 举报
回复
避免内存溢出的原则之一:如果对象不再使用,那么在使用完后,不再让任何地方引用这个对象:

void dosmt(){
    List obj = new ArrayList();
    obj.add(1);
//执行很多逻辑代码
...

//最后
    obj = null;
}
上面这是一种情况,但是由于这个obj,是局部变量,当代码执行完成后,obj就随时能被回收了 第二种情况

class Example{
    private static List obj = new ArrayList()

    void dosmt(){
        List obj = new ArrayList();
        obj.add(1);
        //执行很多逻辑代码
...

    //最后
        obj = null;
    }
    
    这儿时候,由于obj是全局静态变量,doSmt执行完后,obj由于还再被引用,所以不能被回收,这个时候如何列表中存储大量数据,就可能造成内存溢出了

}
夏天的烟火s 2015-12-02
  • 打赏
  • 举报
回复
引用 9 楼 ranjio_z 的回复:
new出来的应该都是堆里边的东西,不调用delete,堆里边的内存空间是不会释放的。需要做的步骤为:

void f(){
    List a=new ArrayList<int>();
    a.add(1);
    a.add(2);
    a.add(3);
    ...
    delete a;
}
十分感谢!
夏天的烟火s 2015-12-02
  • 打赏
  • 举报
回复
引用 6 楼 zhoubin86282972 的回复:
避免内存溢出的原则之一:如果对象不再使用,那么在使用完后,不再让任何地方引用这个对象:

void dosmt(){
    List obj = new ArrayList();
    obj.add(1);
//执行很多逻辑代码
...

//最后
    obj = null;
}
上面这是一种情况,但是由于这个obj,是局部变量,当代码执行完成后,obj就随时能被回收了 第二种情况

class Example{
    private static List obj = new ArrayList()

    void dosmt(){
        List obj = new ArrayList();
        obj.add(1);
        //执行很多逻辑代码
...

    //最后
        obj = null;
    }
    
    这儿时候,由于obj是全局静态变量,doSmt执行完后,obj由于还再被引用,所以不能被回收,这个时候如何列表中存储大量数据,就可能造成内存溢出了

}
十分感谢!
夏天的烟火s 2015-12-01
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
用完就清空并设置为null,特别注意不要到处引用,那样会导致不能及时释放
请问怎样设置为null呢?集合不都是直接使用的吗?
夏天的烟火s 2015-12-01
  • 打赏
  • 举报
回复
怎样设置为null呢?集合不都是直接使用的吗?
开拓者Amadues 2015-11-27
  • 打赏
  • 举报
回复
Java里的对象假如没有被引用到,有自动内存回收机制回收内存的。 一般情况下不需要考虑自己删对象。
lengyu3 2015-11-26
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
用完就清空并设置为null,特别注意不要到处引用,那样会导致不能及时释放
同意
bdmh 2015-11-26
  • 打赏
  • 举报
回复
用完就清空并设置为null,特别注意不要到处引用,那样会导致不能及时释放

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧