爲了針對性研究堆內存溢出問題,專門準備了一段程序:
import java.util.ArrayList;
import java.util.List;
public class Jvm1_5 {
public static void main(String[] args) {
int i=0;
try{
List<String> list=new ArrayList<>();
String a="hello";
while (true){
list.add(a);
a=a+a;
i++;
}
}catch (Throwable e){
System.out.println(i);
e.printStackTrace();
}
}
}
得到如下結果:
26
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at Jvm1_5.main(Jvm1_5.java:13)
Process finished with exit code 0
首先對內存溢出的提示是Java heap space,我們的程序在每一次循環中不段進行拼接,並且添加到我們的list中,內存並不會被釋放,導致了堆內存溢出。
我們添加jvm參數-Xmx7m再運行:
17
java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:3332)
at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
at java.lang.StringBuilder.append(StringBuilder.java:136)
at Jvm1_5.main(Jvm1_5.java:13)
這次發現循環了17次,堆空間就不夠了,這也引起我們的思考,有時候我們內存設置比較大,所以運行一段時間空間也還是發現不了。我們可以把內存設置小一點,就可以儘早暴露堆內存的問題。