Java中数据存储方式、栈机制与引用的关系

总述:

   这里是例举的Java当中的例子,其他语言如:C/C++(多一个指针)。但是基本的存储方式都是一样的,生命周期也是差不多的。这是我学了一年多的计算机的一点感悟,也是从翻阅其他书籍、和其他大神的博客得到的一些总结。    
   好多博客知识对引用做了很简单的区分(按值传递、按址传递),但是他们并没有考虑到程序运行时的机制,以及数据变量在内存中的分配。函数是在栈中运行的,所有要遵循栈的保护机制。入栈要进行参数的现场保护,出栈要进行现场恢复,所以传入的参数(引用)就会恢复原始状态,本质上,除了原始类型值按值(因为原始类型存储在代码块中)传递之外,对象都是引用(按地址)传递,只是因为栈的机制、以及数据的存储区域、声明周期的不同;所以才会有
   对参数改变的生效或者无效之说(也就是按值和按址)。
   这里做了一单i简单的归纳,我想说的更清楚一些,但是表达能力有限。

1.说明:

    其实,不管是哪种语言,大概的数据存储、分配方式都是遵循一些基本的原理的。因为这里是以Java的源代码作为示例的,因此就拿Java里面的数据作为说明对象。

2.概念:

     2.1、要点:

        (1).程序(主要指函数)执行时,执行顺序是按照栈的方式。程序入栈的时候,其传入的参数要进行“现场保护”,函数执行完毕,出栈的时候要对参数进行“现场恢   复”。

       基于这样的机制来保护原有参数不受影响,程序得以按照原先的状态继续执行。



        (2)栈:后进先出

                 堆:顺序随意

    2.2、预备知识

        在Java中,程序中分为6个存储区域来存放程序中的变量以及代码占用的内存。

       (1)寄存器(register):这是最快的存储区,因为它位于CPU的内部。数量有限,而且不能被我们直接控制,由系统进行控制。一般感觉不到。(C /C++里面可以声明)



       (2)栈(stack):位于通用RAM中,通过它的“栈指针”可以从处理器那里直接获得。栈指针若向下移动则分配新的内存;若向上移动则释放那些跳过的内存。这是一种

                                     快速的分配方法,仅次于寄存器。操作方式类似于数据结构当中的栈,实际中的栈是由系统调用的。




      (3)堆(heap):一种通用性的内存池,存放所有Java中的对象(因为Java对象都是new出来的)。而且,编译器不需要知道要从堆了分配多少存储区域,也不必要

                                    知道存储的数据在堆里活动多长时间。由程序员创建,由程序员释放(若程序员不释放,Java系统会自动释放,但C/C++就不会)。但是,这种方式

                                    的存储需要的时间也比栈较久。




      (4)全局区(静态区):这个区存放着全局变量和静态变量。里面存放着程序运行时一直存在的数据。比如说直接在源文件里面声明的类(没有嵌入在其他类中)的

                                              类就是存放在全局区里,以及用static声明的变量和函数也是存放在这个区
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值