关于字面量存储在栈上的问题

来源: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指令的限制影响

问题:

  1. 为什么课程中说 字面量是放到栈中的,就感觉是在说栈上开辟了一段内存空间存了字符串一样,出栈后会该段内存会被释放。就类似再说虚拟机中优化手段 方法逃逸 => 对象栈内分配一样
  2. 对于new String(bytes)上边如果我分析的对,这种在堆上分配,因为压根没用到常量池,生成的char[]每个元素都会在堆中申请内存。当没有引用时,合适的时机会被GC回收掉。而不是像常量池中存储的字面量一样,很难会被GC回收
写回答

2回答

bennyhuo

2023-02-24

2.你分析的对
0
0

bennyhuo

2023-02-24

1. 字面量这块儿说放到栈里面确实是有问题的,字符串常量的内容是在常量池中,受常量池的字节码结构的约束。
0
1
布鲁马3518274
感谢感谢~
2023-02-24
共1条回复

大厂资深面试官 带你破解Android高级面试

改变视野和思维 深度与广度兼备的 Android 进阶面试指导课程

1636 学习 · 222 问题

查看课程