黑马程序员技术交流社区

标题: 内存溢出的问题 [打印本页]

作者: 毕影彬    时间: 2012-10-17 20:21
标题: 内存溢出的问题
本帖最后由 毕影彬 于 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));  }还是溢出

作者: hello_world!    时间: 2012-10-17 23:45
说明两点,第一、int类型的数据放入ArrayList中,会自动装箱成Integer。第二、一个Integer占用的空间是16byte,16*10000000 =160M早就超过了jvm的虚拟空间。jvm默认的虚拟空间是64M
作者: qhasilver    时间: 2012-10-17 23:58
  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不保证会运行垃圾回收机制,有点浪费表情。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2