内存空间
| 一、内存的划分 |
|
任何软件运行都要在内存开辟空间,因为内存运行快。 虚拟机软件启动后会开辟内存空间,之后还会对所开辟的所属的内存空间进行更细致的划分。 每一片划分出来的内存空间,内部数据的运算处理方式都不同,所以需要单独进行划分处理。
|
|
【】内存的划分: 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类型的 |
















浙公网安备 33010602011771号