首先梳理一下Java中各种对象、变量存储的位置。参见后面程序例子
- Register(寄存器,位于处理器内部):最快的存储区,由编译器根据需求进行分配,不能直接控制。
- Stack(栈,位于RAM区):存放基本类型的变量数据和对象的引用。对于小的、简单的变量,Java创建一个并非是引用的“自动”变量,这个变量直接存储“值”,并置于栈中。例如,
int a = 3;
,a和3均在栈中。 - Heap(堆,位于RAM区):所有的new对象存储在堆中。例如,
String str = new String("something");
,str在栈中,something在堆中。 - 常量存储(在代码内部,或者放在ROM中):为了避免某个常量值被反复实例化,存放可以在编译期就确定的字符串常量、基本类型常量以及基本类型的包装类(Byte, Short, Integer, Long, Character, Boolean,并且对应值小于等于127时),例如:
String str = "something"
,str在栈中,“something”在String类的常量池中。Integer i1=127
,当且仅当包装器要包装的值小于127才能用常量池。Integer i2=new Integer(12);
没用包装器,i2在栈中,12在堆中public static int a = 1;
,a这个变量名在栈中,1在常量池中
- 非RAM存储:流对象和持久化对象。在流对象中,对象转化成字节流,通常被发送给另一台机器。在持久化对象中,对象被存放在磁盘上。