A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 毕影彬 中级黑马   /  2012-10-17 20:21  /  1859 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 毕影彬 于 2012-10-20 19:01 编辑

测试代码public static void main(String[] args) {  List list = new ArrayList() ;  long startTime = System.currentTimeMillis();  for(int i = 0 ; i<10000000 ; i++){   list.add(i) ;   if(i==100000){    list.clear();           System.gc() ;   }  }  long endTime = System.currentTimeMillis();  System.out.println("End.. : " + endTime + " Cost : "  + (endTime - startTime));  }还是溢出

评分

参与人数 1技术分 +1 收起 理由
韩军博 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
说明两点,第一、int类型的数据放入ArrayList中,会自动装箱成Integer。第二、一个Integer占用的空间是16byte,16*10000000 =160M早就超过了jvm的虚拟空间。jvm默认的虚拟空间是64M
回复 使用道具 举报
  1.         public static void main(String[] args) {
  2.                 List list = new ArrayList() ;
  3.                 long startTime = System.currentTimeMillis();               
  4.                 for(int i = 0 ; i<10000000 ; i++){                       
  5.                         list.add(i);                       
  6.                 if(list.size()==100000){                       
  7.                         list.clear();
  8.                         System.out.println("clear"+i);
  9.                     System.gc() ;
  10.                 }               
  11.                 }               
  12.                 long endTime = System.currentTimeMillis();
  13.                 System.out.println("End.. : " + endTime + " Cost : "  + (endTime - startTime));                 
  14.                 }
复制代码
1.二楼已经把原因说出来了,java虚拟机默认的堆内存大小为64M,而你的清理机制是错误的。无法清理掉list里的元素,我帮你修改了一下。 if(i==100000){ 改成 if(list.size()==100000){
2.System.gc();这个方法写上去没意义,java不保证会运行垃圾回收机制,有点浪费表情。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马