package com.xie.string;
//String
public class JavaMemory {
public static void main(String[] args){
String s="myclassisbig";
System.out.print("當前虛擬機器可用的最大記憶體:");
System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"M");
System.out.print("迴圈前虛擬機器以用記憶體:");
System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"M");
int count=0;
while(true){
try {
s+=s;
count++;
} catch (Error e) {
System.out.println("迴圈次數:"+count);
System.out.println("String的實際位元組數:"+s.length()/1024/1024+"M");
System.out.println("迴圈後,以佔用記憶體:"+Runtime.getRuntime().totalMemory()/1024/1024+"M");
System.out.println("捕獲到的錯誤:"+e);
break;
}
}
/*
* String進行+=操作後,原來的String將不能再用,同時還會建立新的對象,佔用的記憶體會比較大
* 進行+=操作後,引用改變,而gc可能還沒來得及執行,所有導致很多垃圾對象。
*/
}
}
//運行結果:
當前虛擬機器可用的最大記憶體:63M
迴圈前虛擬機器以用記憶體:4M
迴圈次數:19
String的實際位元組數:6M
迴圈後,以佔用記憶體:63M
捕獲到的錯誤:java.lang.OutOfMemoryError: Java heap space(棧記憶體)
----------------------------------------------------------------------------------------------------------------------
package com.xie.string;
public class JavaStringBufferMem {
public static void main(String[] args) {
StringBuffer s=new StringBuffer("myclassisbig");
System.out.print("當前虛擬機器可用的最大記憶體:");
System.out.println(Runtime.getRuntime().maxMemory()/1024/1024+"M");
System.out.print("迴圈前虛擬機器以用記憶體:");
System.out.println(Runtime.getRuntime().totalMemory()/1024/1024+"M");
int count=0;
while(true){
try {
s.append(s);
count++;
} catch (Error e) {
System.out.println("迴圈次數:"+count);
System.out.println("String的實際位元組數:"+s.length()/1024/1024+"M");
System.out.println("迴圈後,以佔用記憶體:"+Runtime.getRuntime().totalMemory()/1024/1024+"M");
System.out.println("捕獲到的錯誤:"+e);
break;
}
}
}
}
//運行結果:
當前虛擬機器可用的最大記憶體:1016M
迴圈前虛擬機器以用記憶體:4M
迴圈次數:24
String的實際位元組數:192M
迴圈後,以佔用記憶體:1016M
捕獲到的錯誤:java.lang.OutOfMemoryError: Java heap space
在MyEclipse8.5中修改程式運行所需的棧記憶體:
工具列點run->runconfigurations->arguments, 在VM arguments下填寫:
--Xmx1024m