私有
- 程序计数器:记录当前线程所执行字节码的行号指示器
- 虚拟机栈:存放了当前线程调用方法的局部变量表、操作数栈、动态链接、方法返回值等信息(可以理解为线程
的栈)
- 本地方法栈:为虚拟机使用的Native方法提供服务
共享
- Java堆:占据了虚拟机管理内存中最大的一块,唯一目的就是存放对象实例,也是垃圾回收器主要管理的地方,故又称GC堆
- 方法区:存储加载的类信息、常量区、静态变量、JIT(即时编译器)处理后的数据等,类的信息包含类的版
本、字段、方法、接口等信息。需要注意是常量池就在方法区中,也是我们这次需要关注的地方
String常量池随JDK的改变
JDK1.7中JVM把String常量区从方法区中移除了;JDK1.8中JVM把String常量池移入了堆中,同时取消了“永久
代”,改用元空间代替(Metaspace)
String.intern()
检查字符串常量池中是否存在String,如果存在返回池里的字符串引用;若池中不存在,则将其加入池中,并返回其引用。
这样做主要是为了避免在堆中不断地创建新的字符串对象
对于直接做+运算的两个字符串(字面量)常量,并不会放入String常量池中,而是直接把运算后的结果放入常
量池中
对于先声明的字符串字面量常量,会放入常量池,但是若使用字面量的引用进行运算就不会把运算后的结果放入常量池中了
JVM会对String常量的运算进行优化:未声明的,只放结果;已经声明的,只放声明
jvm 运行时数据区、String 常量池
最新推荐文章于 2022-01-04 20:36:22 发布