2011-02-19 190 views
0

我想问为什么执行“NAME.add("Tom");”时触发Java堆空间?JAVA while循环arralyist问题

<%@ page import="java.util.*" %> 

<% 
try { 
    ArrayList <String> NAME = new ArrayList<String>(); 
    int count= 0; 

    do 
    { 
     NAME.add("Tom"); 
    } while (count < 2); 

    String[] name = NAME.toArray(new String[NAME.size()]); 

%> 

<script type="text/javascript"> 
    var output=[]; 
    <%int i = 0;%> 

    <%while (i < name.length) { System.out.println(name[i]);%> 
     output[<%=i%>] = []; 
     output[<%=i%>][0] = '<%=name[i]%>'; 

    <% System.out.println("No exception in JAVASCRIPT.");i++;}%> 
</script> 

<% 
} catch (Exception error){System.out.println(error);}%> 

回答

1

您不会增加count变量。

3

注意,在该代码:

int count= 0; 

do 
{ 
    NAME.add("Tom"); 
} while (count < 2); 

你永远不会改变的count价值的任何地方,所以这个循环将永远循环下去。如果您更改了代码,以便以某种方式更改count(可能通过使用for循环向上计数),则应该消失。 JVM可能会耗尽堆空间,因为尽可能多地将Tom的副本添加到集合中,最终耗尽可用内存。

+0

该列表实际上不会包含`“Tom”`的副本,只有很多很多的对同一个“Tom”对象的引用。尽管如此,每个引用都需要4(或8)个字节,并且它们最终将填充堆。 – 2011-02-19 14:15:48

0

看这个代码

诠释计数= 0; do NAME.add(“Tom”); } while(count < 2);

你忘了增加count。所以在你的代码中,它会做一个无限循环,你的所有内存都将被占用。