Java程序运行时,数据都保存到什么地方?

引用和对象

  • 例子说明 String a = "a";
    • a是引用,"a" 是对象

程序运行时,有5个地方可以存储数据

  • 寄存器
    • 位于不同于其他存储区的地方-处理器内部
    • 最快的存储区
    • 寄存器数量极其有限,按需分配,不能直接控制,不能再程序中感觉到寄存器存在的任何迹象(另一方面,c和c++允许向编译器建议寄存器的分配方式)
  • 堆栈
    • 位于通用RAM(随机访问寄存器),存储单元的内容可按需随意取出和存入,存储速度与存储单元的位置无关的存储器(断电丢失)
    • 通过堆栈指针可以从处理器那里获取直接支持
    • 堆栈指针向下移动则分配新的内存,若向上移动,则释放内容。这是一种快速有效的分配存储方法,仅次于寄存器。
    • 创建程序时,JAVA系统必须知道存储在堆栈内所有项的确切生命周期,以便上下移动堆栈指针。这一约束限制了程序的灵活性。
    • 对象引用存储在堆栈中
    • 位于RAM区中的通用的内存池,用于存储所有java对象。
    • 堆不同于堆栈的地方是:堆不需要知道存储的数据在堆里存活多长时间。因些,在堆里分配存储空间有很大的灵活性。当需要一个对象时,只需要用NEW写一行简单的代码,当执行这行代码时,会自动在堆里进行存储分配。缺点是用堆进行存储分配和清理要比用堆栈更耗时。
  • 常量存储
    • 存储在ROM(只读寄存器中)
    • 常量值一般直接放于程序内部,这样做是安全的,因为它们永远不可能改变。如果是嵌入式,可能常量本身会和程序分开,放在ROM中
    • 这种存储区的一个例子是字符串池,所有字面常量字符串和具有字符串值的常量表达式都自动是内存限定的,并置于特殊的静态存储区中
  • 非RAM存储
    • 如果数据完全存活于程序之外,那么它可以不受任何程序的影响。比如流对象和持久化对象。
    • 把对象转化成可以存放在其他媒介上的事物,在需要时,可以恢复成常规的、基于RAM的对象。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容