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

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

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
StringStringBufferStringBuilder都是用于处理字符串的类,它们之间的区别如下: 1. 可变性:String 类是不可变的,即一旦创建,它的值无法改变。每次对 String 进行修改时,都创建一个新的 String 对象。而 StringBufferStringBuilder 类是可变的,可以直接对其进行修改,而不创建新的对象。因此,在需要频繁修改字符串的情况下,使用 StringBufferStringBuilder 更高效。 2. 线程安全性:String 类是线程安全的,因为它的不可变性可以保证多个线程同时访问时不出现竞争条件。而 StringBuffer 是线程安全的,它的方法都使用了 synchronized 关键字进行同步。而 StringBuilder 是非线程安全的,不提供同步操作,适用于单线程环境。 3. 性能:由于 String 是不可变的,每次修改创建一个新的对象,这带来一定的性能开销。而 StringBufferStringBuilder 是可变的,可以直接在原有对象上进行修改,避免了频繁创建对象的开销。在性能要求较高的场景下,使用 StringBufferStringBuilder String 更合适。 根据具体的需求,选择适合的类来处理字符串。如果字符串不需要修改或线程安全性很重要,则使用 String 类;如果需要频繁修改字符串且线程安全性要求较高,则使用 StringBuffer;如果需要频繁修改字符串且不涉及多线程环境,则使用 StringBuilder。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值