Java的运行时数据存储机制

Java程序在运行时需要为一系列的值或者对象分配内存,这些值都存在什么地方?用什么样的数据结构存储?这些数据结构有什么特点?本文试图说明此命题的皮毛之皮毛。

概念

 

对于Java,有六个不同的、用于数据存储的概念,他们是:

1.     寄存器( register),是最快的存储区,位于处理器内部。因为寄存器的数量极其有限,所以寄存器由编译器根据需求进行分配。程序员无法使用Java代码使用寄存器中的存储空间,或者说:在Java开发的层面上,寄存器的操作已经被封装。

2.     栈( stack),位于通用 RAM。存取速度快,仅次于寄存器。栈指针若向下移动,则分配新的内存;若向上移动,则释放那些内存。创建程序时候, JAVA 编译器必须知道存储在栈内所有数据的确切大小和生命周期,因为它必须生成相应的代码,以便上下移动栈指针,进而分配和释放内存。由于栈的这种存储特性,所以某些数据存在栈中,比如对象引用和基础类型的变量值;但是有些数据是不适合存到栈中的,比如对象的实例。

3.     堆( heap),一个运行时数据区,位于 RAM。堆中的空间是动态分配的,所以,不需要知道数据的大小和生命周期。因此,在堆里存储数据有很大的灵活性。Java对象的实例和数组放在这里。堆中的过期对象由GC负责回收。堆的存取速度较慢。

4.     静态存储( static storage),RAM中一片固定的位置。存储静态数据,这些数据在程序中用static关键字修饰。

5.     常量存储( constant storage),常量值通常直接存放在程序代码内部,这样做是安全的,因为它们永远不会被改变。

6.     非 RAM存储。如果数据完全存活于程序之外,那么它可以不受程序的任何控制,在程序没有运行时也可以存在。

栈和静态存储的数据共享

 

用一个案例理解,假设定义:

int a = 3;

int b = 3 ;

编译器先处理 int a = 3 ;首先它会在栈中创建一个变量为a 的引用,然后查找栈中是否有 3 这个值,如果没找到,就将3 存放进来,然后将 a 指向 3 。接着处理 int b = 3 ;在创建完 b 的引用变量后,因为在栈中已经有 3 这个值,便将 b 直接指向 3 。这样,就出现了 a 与 b 同时均指向 3 的情况。这时,如果再令 a=4 ;那么编译器会重新搜索栈中是否有 4 值,如果没有,则将 4 存放进来,并令 a 指向 4 ;如果已经有了,则直接将 a 指向这个地址。因此 a 值的改变不会影响到 b 的值。要注意这种数据的共享与两个对象的引用同时指向一个对象的这种共享是不同的,因为这种情况 a 的修改并不会影响到 b, 它是由编译器完成的,它有利于节省空间。而一个对象引用变量修改了这个对象的内部状态,会影响到另一个对象引用变量。

数据共享对于静态数据同样。

最新文章

  1. JSONP和CORS两种跨域方式的简单介绍和解决方案实例
  2. LeetCode "Longest Substring with At Most K Distinct Characters"
  3. Saltstack系列1:安装配置
  4. Spring MVC的UrlBasedViewResolver和InternalResourceViewResolver
  5. sql2005下载和安装
  6. [Javascript] property function && Enumeration
  7. mysql 1054错误
  8. 利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
  9. js实现td排序及分组分类
  10. ABP使用Miniprofiler监测EF
  11. 向后台提交数据:通过form表单提交数据需刷新网页 但通过Ajax提交数据不用刷新网页可通过原生态Ajax或jqueryAjax。Ajax代码部分
  12. Android tabLayout+recyclerView实现锚点定位
  13. 使用正则表达式进行某网页中的email邮箱抽取
  14. 记关于vue-cli3 本地代理模拟数据的实践
  15. 使用 TensorFlow 的起始步骤
  16. 使用Elasticsearch 与 NEST 库 构建 .NET 企业级搜索
  17. Deep Reinforcement Learning from Self-Play in Imperfect-Information Games
  18. HTML中放置CSS的三种方式和CSS选择器
  19. H3C路由器和交换机的一些记录
  20. CentOS6.7 通过yum在线安装MySQL5.7

热门文章

  1. Python基本数据类型之字典,集合,range
  2. 双系统可以进入Windows但进入Ubuntu时无法进入系统引导,只有左上角光标闪
  3. R语言画图教程之盒形图
  4. 架构hive2mysql流程
  5. 洛谷 P3956 棋盘
  6. Spring配置xml自动提示——转载https://blog.csdn.net/sinat_18474835/article/details/79370629
  7. 完美解决IE8不支持margin auto问题
  8. 访问树中的所有元素(DOM)
  9. canvas用2d渲染出3d的感觉
  10. C# 基础才是重中之重~对象的生与死