内存空间

一、内存的划分

任何软件运行都要在内存开辟空间,因为内存运行快。

虚拟机软件启动后会开辟内存空间,之后还会对所开辟的所属的内存空间进行更细致的划分。

每一片划分出来的内存空间,内部数据的运算处理方式都不同,所以需要单独进行划分处理。

【】内存的划分:

1寄存器,这部分cpu来处理

2本地方法区,和所在操作系统有关,分版本,运行本地系统平台里的内容,暂时用不到

3方法区,暂时用不到

4栈内存:存储的都是局部变量,而且该变量所属的作用域一旦结束,该变量就会自动释放。

5堆内存:存储数组和对象(其实数组就是对象),凡是new建立的都在堆中

 堆存实体,栈存局部变量
 
二、栈内存

【】栈内存存储的都是局部变量,凡是定义在函数里的变量都是局部变量,

主函数和其他函数里面的变量就是局部变量,

在类里定义的变量就不是局部变量(函数外面,类的里面,和函数并列的变量是全局变量)。

比如类里面定义的与主函数并列的变量int x=3就不是局部变量

【】局部变量在函数里面,内存里面过程是先加载该函数进内存,然后在函数里面开辟局部变量内存空间。

先划分函数内存空间,在函数内存空间里面划分变量的内存空间

【】存储的都是局部变量,而且该变量所属的作用域一旦结束,该变量就会自动释放。

所以栈内存更新速度很快,因为所属的变量,生命周期太短,活的时间太短

【】局部代码块:限制局部变量生命周期,小程序没有,大程序有用

 
 
三、堆内存
堆内存:凡是new建立的都在堆中,存储数组和对象(其实数组就是对象),

arr在主函数中是局部变量,在栈内存中存储

new int[3]属于实体,在堆内存,实体就是实实在在存储的个体,实体作用是封装数据,堆里存实体,而且能封装多个

一个数据没了,堆里面其他数据还存在

【】执行主函数时,主函数先进栈,主函数进栈后局部变量数组名arr才能在栈里开辟空间

【】通过new关键字,在堆内存开辟一个空间。内存存储数据都通过内存地址来体现,内存地址就是一串二进制数字,数字太长,一般用16位数字来表示。给实体分配一个内存地址。

数组里面有索引角标,划分成几个格子,每个各自都有角标编号。

【】堆内存里面都有一个默认初始化值,不同类型数值初始化值不同。short、int、long是0。小数double0.0,float0.0f,布尔false。栈内存没有默认初始值。

 【】堆内存特点:

\u表示unicode码表,00表示一个字节,00表示第二个字节,0000标志是16位

 unicode对文字和数字对应关系的一张表,是服务于各个国家的;

ascii码表仅是英文,只服务于美国

 
 
 
四、栈内存与堆内存的指向关系

 【】堆内存存储的实体有地址,堆内存的数组把地址赋给了栈内存的变量,栈内存的变量就指向了这个对内存里的数组

【】sop(arr(0))一输出,

先找栈内存局部变量arr,通过内存地址,找到堆内存,再找到角标0,最后找到对应的数字8

【】sop(arr)就会得到变量arr中存储的内存地址

【】这叫做引用数据类型,arr引用{指向)了堆内存中的一个实体,很像c++的指针只是在java叫做引用

--------java基于c++成长起来,和c++非常像,它优化了c++

【】让arr不做任何实体指向,可以让arr空,int[] arr=null;空能取消引用型变量的指向,替代arr里面存储的对内存地址,如果sop(arr)就会得到null字样。。另外堆内存失去栈内存指向后就成了垃圾,在不定时的时间内垃圾回收机制进行内存空间回收。就象有个环卫工帮忙收垃圾。而c++的垃圾回收是程序员自己手动回收的。java在内存管理这块由于c++。

 
 
五、数组内存练习

【】栈内存开辟空间存储临时变量x,堆内存通过new开辟实体数组int【3】,数组有了一个内存地址34,然后这个内存地址进入栈内存变量x里面,x存储这个数组的内存地址34

【】栈内存开辟空间存储临时变量y,堆内存通过new开辟实体数组int【3】,数组有了一个内存地址87,然后这个内存地址进入栈内存变量y里面,y存储这个数组的内存地址87

【】数字9赋值给数组x【0】,数字34赋值给数组y【0】

【】x=y,将变量y内的地址87赋值给变量x,则x不再指向地址34的数组,转而指向地址87的数组,

y不变还是指向地址87的数组

【】sop(y)会得到在变量y存储的内存地址

 
 
六、数组操作常见问题

【1】数组角标越界异常:7个元素,角标从0到6,无法打印第七个角标,因为不存在

显示异常:告知第7个数组索引超出范围

例子:

【2】空指针下打印数组元素

【3】直接打印数组名

一般做测试的时候用,当不知道变量接收的是什么类型数据的时候就打印,打印完只看@左边就行

@右边是数组实体哈希值,

可以简单理解为哈希算法给出的十六进制地址值,本来是二进制,为了好表示换成十六进制数

@左边是实体的类型

半中括号 [ 代表这个实体是数组型实体

大写I代表int类型的

posted @ 2025-07-02 08:53  ibddindonon  阅读(32)  评论(0)    收藏  举报