Java 内存分配:
◆寄存器: 我们在程序中无法控制
◆栈: 存放基本类型的数据和对象的引用, 以及成员方法中的局部变量
◆堆: 存放对象本身(成员变量 + 成员方法的引用)
◆静态域: 存放在对象中用 static 定义的静态成员
◆常量池: 存放常量
◆非 RAM 存储: 硬盘等永久存储空间
栈的存取速度比堆快, 仅次于寄存器.
常量池:
专门用于存储, 管理在编译时就可以确定的保存在. class 文件中的一些数据.
包括代码中所定义的各种基本类型 (如 int,long 等等) 和对象型 (如 String 及数组) 的常量值 (final) 还包含一些以文本形式出现的符号引用, 比如:
◆类和接口的全限定名;
◆字段的名称和描述符;
◆方法的名称和描述符.
- int a=1; // 在编译时就可以确定 a 的值为 1,1 存放在常量池中, 栈中 a 存的其实是常量池中 1 的地址
- int b=2+3; // 在编译时就能确定 b 的值为 5,5 存放在常量池中, 栈中 b 存的其实是常量池中 5 的地址
- int c=a+b; // 编译时不能确定 c 的值
- String str1="hello"; // 编译时能确定,"hello" 存储在常量池中, 栈中存的是对应的地址
- String str2="hello"+"world"; // 编译时能确定,"hello world" 存储在常量池中, 栈中存的是对应的地址
- String str3=str1+"world"; // 编译时不能确定 str3 的值
在常量池中, 相同的直接量只有一个, 不会产生多个副本. 比如:
- int a=1;
- int b=1;
常量池中只存储一个直接量 1; 栈中 a 和 b 存储的都是常量池中该直接量的内存地址, 它们引用同一个直接量.
String str=new String("hello java"); // 这是一个对象, 存储在堆中,"hello java" 并不会放在常量池中.
java 内存分配(堆, 栈, 常量池)
来源: http://www.bubuko.com/infodetail-3056120.html