Java中数据存储的5个位置
寄存器
最快的存储区,位于处理器内部。但是其数量极其有限,是根据需求进行分配的,无法进行人为控制(c或cpp允许人为向编译器建议寄存器的分配方式)。
栈
位于通用RAM(随机访问存储器)中,可以通过堆栈指针从处理器中获得直接支持。指针向下移动则分配新的内存;若向上移动则释放内存。其速度仅次于寄存器。创建程序时Java系统必须知道存储在栈内所有项的确切生命周期,以便上下移动指针,这一约束也限制了程序的灵活性,所以常用于存储对象引用和基本数据类型,而不用于存储对象。
例如:
String s = new String("hello");
其中String类型s是存储在栈中,而new的这个对象存储在堆中。
堆
通用内存池,也位于RAM区,用于存放所有的Java对象。堆相比于栈的好处是:编译器不需要知道存储的数据在堆里存活多久,因此在堆里分配存储有很大的灵活性。如上述代码中提到的,在执行new这行代码时,会自动在堆里分配存储空间。当然,这种灵活性也会消耗更多的存储和清理所需的时间。
常量存储
常量值通常直接存放在程序代码的内部(常量池中),因为其值在初始化时已被确定,永远不会被改变,因此是安全的。
非Ram存储
如果数据完全存活与程序之外,那么它可以不受程序的控制,在程序没有运行时也存在。其中两个例子是流对象和持久化对象。对于流对象而言,其本质是将内存中的对象状态通过序列化过程转化为字节流,这一转化使得对象能够脱离创建它的程序环境;而持久化对象,则直接被存放于磁盘上。