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