一个技术小白对java内存的看法~

内存篇:


我们天天码代码是否想过这帮英文哥们是怎么运行的,还是说我们程序猿只满足程序能运行却不去理解底层基础?也行很多人都感觉C语言才能接触到内存

底层,学java没有必要去理解吗,其实理解底层基础会解决很多程序bug,而且写出的程序从性能上看会更加完美。

在java中分为6块储存内存的区域:


1、栈

2、堆

3、寄存器

4、常量储存

5、静态存储

6、ROM存储

栈:

一般程序运行的时候,数据会分别存储在栈和堆内存,jvm(虚拟机)会自动帮我们管理。

栈内存存取速度比堆要快,因为内部存储的都是字面数据而不是对象实例之类的,

在进行编译的时候就已经明确了存储的数据的声明周期等,

栈有一个很重要的特殊性,就是存在栈中的数据可以共享且。

如:

上图定义了2个变量,a 和 b 且数据是一样的首先编译器 会先在栈内存中开辟一个32byte的内存大小用于存储a数据,

然后到b的时候编译器会先内存中寻找是否有6这个数据,如果有,变压器不会为b存储数据而是直接引用a的

内存地址,相当于是a了,这就是栈内存中的共享!


栈中主要存放一些基本类型的变量(,int, short, long, byte, float, double, boolean, char)

和对象引用等等,人无完人栈也是有缺点是,存在栈中的数据大小与生命周期必须是确定的,

缺乏灵活性

堆:

堆内存主要存储对象实例等等,堆内存的优势体现于会动态的为对象分配储存空间存储对象

如:

上图一开始是会先在栈内存中先声明Test 的变量 a 和 a2 ,堆内存则是根据对象的大小分配空间,

a 和 a2 存储的是堆内存中对象的地址值,指向了堆内存中的对象。

我们知道c语言是可以通过指针分配对象的内存的,而java不行,但是java是怎么防止无用对象过多了?

在java堆中,如果用一个对象没有任何引用,这时候会被“垃圾回收机制”随机回收掉,回收时间不确定。

4、常量储存

该区域属于堆内存中的区域,也可叫常量池,用于储存无法被改变的数据的地方,如被fianl修饰的变量和字符串

如:

上方储存的就是常量池中存储的数据,和栈一样数据拥有共享性,如果同时定义2个字符串

String a = "123";

String b = "123";

不会开辟新的空间而是直接引用,如果 a==b 进行比较结果会是true b 指向了a

总结:

栈内存存储方式是后进先出(数据的创建及消亡),而堆内存是先进后出。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值