码迷,mamicode.com
首页 > 编程语言 > 详细

Java 数据存储

时间:2019-06-17 12:59:17      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:运行   new   处理器   col   gpo   title   半导体   初始   保存数据   

JAVA在程序运行时,在内存中划分5片空间进行数据的存储,分别是:

寄存器register

   最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制

  • 最快的存储区(由编译器根据需求分配,无法从程序中控制)
  • 位于处理器内部
  • 数量有限

 

常量存储constant storage

存放字符串常量和基本类型常量(public static final)

  • 常量值通常直接存放在程序代码内部
  • 有时在嵌入式系统中,常量本身会和其他部分分割离开,所以在这种情况下,可以选择将其放在ROM中 (ROM,Read Only Memory,只读内存。一种只能读出事先所存数据的固态半导体存储器,它相当于PC机上的硬盘,用来存储和保存数据。RAM和ROM相比,两者的最大区别是RAM在断电以后保存在上面的数据会自动消失,而ROM就不会。)

 

静态存储区static storage

    存放静态成员(static定义的)包括静态成员变量和静态成员方法(类方法)
  • 静态是指“在固定的位置”
  • 静态存储里存放程序运行时一直存在的数据
  • 可用关键字static来标识一个对象的特定元素是静态的
  • 但JAVA对象本身从来不会存放在静态存储空间里

重点注意:

  1. 静态方法中可以直接调用同类中的静态成员,但不能直接调用非静态成员。如果希望在静态方法中调用非静态变量,可以通过创建类的对象,然后通过对象来访问非静态变量。
  2. 在普通成员方法中,则可以直接访问同类的非静态变量和静态变量。
  3. 静态方法中不能直接调用非静态方法,需要通过对象来访问非静态方法

stack

    存放基本类型的变量数据和对象,数组的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)

  • 速度仅次于寄存器 
  • 通过它的“栈指针”从处理器获得支持; 
  • 栈指针向下移动,分配新内存;向上,释放内存; 
  • 这一约束限制了程序的灵活性:创建程序时,JAVA编译器必须知道存储在栈内所有数据的确切大小和生命周期,生成相应代码,以便上下移动栈指针;因此某些JAVA数据存储在栈中,而JAVA对象不存储在其中,位于通用RAM中 (RAM,random access memory随机存取存储器),与CPU直接交换数据的内部存储器,也叫主存(内存)。随时读写,速度很快,通常作为临时数据存储媒介)

特点

函数中定义的基本类型变量,对象的引用变量都在函数的栈内存中分配。

栈内存特点,数数据一执行完毕,变量会立即释放,节约内存空间。

栈内存中的数据,没有默认初始化值,需要手动设置。

 

堆heap

    存放所有new出来的对象

  • 位于通用RAM中,用来存放所有的JAVA对象
  • 不同于栈的好处:不需要知道存储数据分配多少区域以及生命周期,有很大的灵活性
  • 需要创建一个对象时,只需new一行代码,执行这行代码,会自动在堆里进行存储分配
  • 为这种灵活性付出相应代码,用堆进行存储分配比用栈进行存储需要更多的时间

 

特点

堆内存用来存放new创建的对象和数组。
堆内存中所有的实体都有内存地址值。
堆内存中的实体是用来封装数据的,这些数据都有默认初始化值。
堆内存中的实体不再被指向时,JVM启动垃圾回收机制,自动清除,这也是JAVA优于C++的表现之一(C++中需要程序员手动清除)。

 

注:

什么是局部变量:定义在函数中的变量、定义在函数中的参数上的变量、定义在for循环内部的变量

Java 数据存储

标签:运行   new   处理器   col   gpo   title   半导体   初始   保存数据   

原文地址:https://www.cnblogs.com/lucky1024/p/11038930.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!