如何理解java内存模型

       内存作为计算机的一个硬件,任何程序的运行都依赖内存,作为一个优秀的开发人员,在程序运行中一定要对内存的变化了如指掌,这既是一项基本功,也是开发人员未来不断进步的基础。所以对于一个java开发人员,理解基本的内存模型也是学习过程中非常重要的一步,下面我用自己的理解简述一下java的内存模型,希望对初学者有一定帮助。
       虽说是基础,但理解起来也是非常吃力的,因为这是一个看不见,摸不着的世界,只能发挥脑洞自行脑补,多尝试,多理解,多思考,才是硬道理。本文主要简述堆栈和常量区这三部分,内存中其余的部分可以通过后续的学习以及查阅资料和书籍进一步深入了解。
       首先普及一些概念性的常识
              1、对象:相对于内存而言,目前可以理解为,内存中存储的任何一块数据都可以理解为是内存中的一个对象。
              2、地址:内存中存储的每一块数据都有一个与之相对应的地址,暂且可以理解为一个编号,计算机通过这个地址找到内存中对应的数据。举一个现实生活中的例子:比如下班后你需要打车回家,如果你告诉出租车司机你要回家,那司机一定会一脸蒙比,你需要告诉司机*小区几号楼这样租车司机才可以找到。计算机工作的过程也是这种原理。
              3、栈区:栈区是内存中一块特定的区域,通常比较小,不适合存储较大的数据,而且存储是有序的,遵循先进后出的原则,我们暂且可以理解为,栈区的数据是摞起来的,后存放进去的数据压在之前所存放数据的上面,就类似弹夹一样,最后放进去的子弹在最上边,所以会被第一个打出来。
              4、堆区:堆区通过名字就可以看出,堆区是一个大块的比较自由的空间,可以随意存放数据没有一定的顺序,没有固定的位置,适合存储数据量较大的数据,一个类似快递仓库一样的大块区域。
              5、常量区:常量区,顾名思义是存储常量的地方。例如一个字符串 “hello”
              6、引用:引用是指一个对象通过另一个对象的地址引用另一个对象,暂且可以理解为,内存中的a知道了b的地址,把b的地址存了下来,当计算机想调用b中的数据时可以通过a去找到b。eg:小明要去你家玩,但是不知道你家在哪,他知道小红去过你家,于是就可以问小红你家在哪,然后再去找你。
       好了知道这些再往下看应该会简单一些。(我尽量尝试用简单的方式表达)
下面看一段程序:

    String a="hello";
    String b="hello";
    String c1="he";
    String c2="llo";
    String c=c1+c2;
    String d=new String("hello");
    System.out.println(a==b);
    System.out.println(a==c);
    System.out.println(a==d);
    System.out.println(c==d);

       在段代码中a,b,c1,c2,c,d这些是变量名,他们全部都存在栈区中,a和b的”hello”,c1的”he”,c2的”llo”,全部都存在常量区中,由于d使用了new关键字,new关键字代表的含义就是在堆内存中开辟一块新的空间用来存放数据,没错这里开辟了一块数据存储”hello”这个字符串,c1+c2虽然加到一起得到的也是”hello”但是这里也默认存放在堆空间中,而且也是重新开辟的空间,赋值运算符“=” 是在内存中将等号右边对象的地址赋值给内存中等号左边的对象,让等号左边的对象引用等号右边的对象,也可以说指向右边的对象,所以在这段程序中,栈区中的a引用常量区中”hello”的地址,栈区中的b引用的也是常量区中”hello”的地址,由于常量区中的字符串常量是不重复的,所以只会存一个”hello”同理a和b引用的地址是相同的,栈区中的c1引用常量区中”he”的地址,c2同理,栈区中的c引用堆区中c1+c2的地址,栈区中的d引用堆区中”hello”的地址。
       双等号“==”是比较运算符,比较的是变量的引用,所以这里a和b的引用是一样的,他俩指向的是内存中的同一块区域,所以这里只有a==b是true,其余全是false。

注:本文中所述的对象,指的是内存中存储的数据对象,并不是java程序中的对象(实例)。

好啦就到这里吧,希望对大家有所帮助。(个人理解,如有差错,欢迎留言帮助我补充修正)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值