验证String字符串的存储多少数据

验证String字符串的存储多少数据

1.1 准备java代码,一直往String对象所对应堆里面塞数据,无线循环

java 复现代码如下

 private static void stringMax() throws IOException, InterruptedException {
        System.in.read();
        String str = "开始开始";
        while (true){
            try {
                str + = str;
            } catch (OutOfMemoryError e){
                System.out.println("字节的长度:" + str.getBytes().length);
                System.out.println("字符的长度:" + str.length());
                Thread.sleep(10000);
                str + = str;
            }
        }
    }

jvm 分配的内存大小为大约4GB,jvm 变量不变
在这里插入图片描述

内存中会存在 ,一块儿内存对象 str,成指数式增长(俗称翻番儿)
windows+R==>cmd==>> jconsole 打开内存监控
监控内存如下所示
在这里插入图片描述

str = “开始开始”;"; 执行结果为

字节的长度:1610612736/1024/1024/10241.5GB)
字符的长度:536870912
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOfRange(Arrays.java:3664)
	at java.lang.String.<init>(String.java:207)
	at java.lang.StringBuilder.toString(StringBuilder.java:407)
	at com.example.mufeng.test.Main.stringMax(Main.java:125)
	at com.example.mufeng.test.Main.main(Main.java:42)

Process finished with exit code 1

String str = “123456”;; 执行结果为

字节的长度:402653184/1024/1024/10240.375GB)
字符的长度:402653184
Exception in thread "main" 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 com.example.mufeng.test.Main.stringMax(Main.java:126)
	at com.example.mufeng.test.Main.main(Main.java:42)

Process finished with exit code 1

String str = “abcdefghigqm”; 执行结果为

字节的长度:402653184
字符的长度:402653184
Exception in thread "main" 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 com.example.mufeng.test.Main.stringMax(Main.java:126)
	at com.example.mufeng.test.Main.main(Main.java:42)

Process finished with exit code 1

总结
1.验证所得:因为 str+=str; 该方法执行了String 内部的方法所以无法预测开辟了多少空间 ,str 具体消耗了多少JVM内存比如( char[] copy = new char[1073741823]);char 数组消耗太多内存因为Java 中 char 类型占两个字节

  1. 理论上,Stirng 字符串 ,char value[] int 的最大值:2的31次方-1
   public int length() {
        return value.length;
    }
  1. 结论为看String 编码格式(如UTF-8 一个汉字三个字节),一个字符占多少个字节 ,然后是字符数,具体String 能存储多大,这个看字符对应多少字节而定。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值