关于字面量存储在栈上的问题
来源:3-2 Java String 可以有多长?

布鲁马3518274
2023-02-24
**先统一下概念:**常量池各个JDK版本位置有区别,统一就先叫放到了方法区中
我个人的理解:
1. 字面量:
字面量在字节码中的表示CONSTANT_Utf8_info
,由于length
类型是u2
类型,所以大小是 0 ~ 65535,bytes
长度也就被限制了,JavaC编译时期做了这些阈值检测。但真到了运行时,字面量不还是会以CONSTANT_Utf8_info
放到常量池 => 方法区中。栈中放的仍然是一个变量引用而已
2. new String()
学习了下这块儿,感觉是不是应该分为两种情况
new String("")
:入参是字面量形式,虚拟机中对应的CONSTANT_String_info
这种类型,其实内部还是指向的CONSTANT_Utf8_info
这种类型。所以这种形式创建的String
对象是用到了常量池中的字面量的new String(bytes)
:入参是字节数组,并且字节数组创建通过外部IO,不是通过"".getBytes()
这种形式。那么这种String
对象压根没用到常量池,只是一种构建char[]
数组的过程。所以课程中提到了这种类型的大小只受new array
指令的限制影响
问题:
- 为什么课程中说 字面量是放到栈中的,就感觉是在说栈上开辟了一段内存空间存了字符串一样,出栈后会该段内存会被释放。就类似再说虚拟机中优化手段 方法逃逸 => 对象栈内分配一样
- 对于
new String(bytes)
上边如果我分析的对,这种在堆上分配,因为压根没用到常量池,生成的char[]
每个元素都会在堆中申请内存。当没有引用时,合适的时机会被GC回收掉。而不是像常量池中存储的字面量一样,很难会被GC回收
写回答
2回答
-
bennyhuo
2023-02-24
2.你分析的对00 -
bennyhuo
2023-02-24
1. 字面量这块儿说放到栈里面确实是有问题的,字符串常量的内容是在常量池中,受常量池的字节码结构的约束。012023-02-24
相似问题
关于字面量string的长度
回答 1
jvm线程问题
回答 1