String和StringBuffer占用内存情况,及修改程序运行时的栈内存

时间:2021-10-16 10:37:35

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