验证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/1024≈1.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/1024≈0.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 类型占两个字节
- 理论上,Stirng 字符串 ,char value[] int 的最大值:2的31次方-1
public int length() {
return value.length;
}
- 结论为看String 编码格式(如UTF-8 一个汉字三个字节),一个字符占多少个字节 ,然后是字符数,具体String 能存储多大,这个看字符对应多少字节而定。