博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个技术小白对java内存的看法~
阅读量:3674 次
发布时间:2019-05-21

本文共 1030 字,大约阅读时间需要 3 分钟。

内存篇:

我们天天码代码是否想过这帮英文哥们是怎么运行的,还是说我们程序猿只满足程序能运行却不去理解底层基础?也行很多人都感觉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

总结:

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

你可能感兴趣的文章
字符串的拼接及三元运算符和优先级运算符
查看>>
包机制与公司域名
查看>>
通过dos窗口进行javadoc文档的编写及三种注释
查看>>
用户交互scanner的使用以及scanner输入n个数求和
查看>>
顺序分支循环结构
查看>>
switch多级选择结构和java字节码文件反编译
查看>>
循环结构(while和do...while区别)及迭代,\t与\n,print
查看>>
打印九九乘法表(for循环嵌套)
查看>>
增强for循环
查看>>
break和continue+标签
查看>>
打印三角形及debug单步调试
查看>>
方法详解(命名规则)
查看>>
方法的定义及修饰符
查看>>
方法重载
查看>>
命令行传参及dos编译命令
查看>>
可变参数以及非静态方法如何调用
查看>>
数组内存分析及三种数组初始化方法
查看>>
数组特点,数组越界
查看>>
数组的使用:foreach,数组做方法入参,数组做返回值
查看>>
多维数组
查看>>