添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
Java EE 帖子详情

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

夏天的烟火s 2015-11-26 04:25:48
谁知道List、MAP等集合对象是否有使用完后,未清除造成内存溢出是怎么回事,最好有实例。
...全文
10307 14 打赏 收藏
用AI写文章
14 条 回复
切换为时间正序
请发表友善的回复…
发表回复
wht5771417 2019-08-01
  • 打赏
  • 举报
回复
创建一个定时器,比如1秒钟执行一次,然后调用一个方法,方法里面就new 一个ArrayList,然后添加一些数据,什么都不用干,运行一段时间监控内存占用情况。你会发现内存占用越来越多…………
lankk1 2018-08-31
  • 打赏
  • 举报
回复
使用obj.clear(),然后system.gc()
  • 打赏
  • 举报
回复
引用 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由于还再被引用,所以不能被回收,这个时候如何列表中存储大量数据,就可能造成内存溢出了
  • 打赏
  • 举报
回复
引用 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由于还再被引用,所以不能被回收,这个时候如何列表中存储大量数据,就可能造成内存溢出了 十分感谢!
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
用完就清空并设置为null,特别注意不要到处引用,那样会导致不能及时释放
请问怎样设置为null呢?集合不都是直接使用的吗?
  • 打赏
  • 举报
回复
怎样设置为null呢?集合不都是直接使用的吗?
鸣鸣Amadues 2015-11-27
  • 打赏
  • 举报
回复
Java里的对象假如没有被引用到,有自动内存回收机制回收内存的。 一般情况下不需要考虑自己删对象。
lengyu3 2015-11-26
  • 打赏
  • 举报
回复
引用 1 楼 bdmh 的回复:
用完就清空并设置为null,特别注意不要到处引用,那样会导致不能及时释放
同意
bdmh 2015-11-26
  • 打赏
  • 举报
回复
用完就清空并设置为null,特别注意不要到处引用,那样会导致不能及时释放
发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员