Java内存划分 5
一,栈:
存放的都是方法中的 局部变量,方法的运行一定要在栈当中。
局部变量:方法的参数,方法{}中的变量
作用域:一旦超出作用域,立刻从栈内存中消失。
二,堆:
凡是 new 出来的东西,都在堆当中
堆内存里面的东西都有一个地址值:16进制
堆里面的数据都有默认值:
整数 默认为0
浮点数 默认为0.0
字符 默认为 ‘\u0000’
布尔 默认为false
引用类型 默认为null
三,方法区:
存储 .class 相关信息,包含方法的信息
四,本地方法栈
与操作系统相关
五,寄存器:
与 cpu 相关
一个数组的内存图
方法信息 存储在 方法区中
运行方法就必须将 方法信息 加载到栈中,并在栈中开辟空间,存储数组名
new的时候 是在堆里面,在堆中开辟一段内存空间,编号,赋予16进制地址值。 将地址值赋给栈里面的数组名。
根据索引赋值的时候,通过数组名的地址,在堆中找到相应内存地址,按照索引递增,找到相应地址
两个数组的内存图
类比一个数组,我都懒得写了… 还是要注意压栈的问题
画这个图,实际上是为下面做铺垫
两个引用指向同一个数组
其实图里面已经可以很清楚的看到,虽然 B数组是被 A数组赋值了,但是,B数组依然能够指向内存中new出来的数组地址,
由此,不难看出,通过 数组B 一样能够改变 堆内存中的数组
实际上,是堆内存共享了
考虑一下数组如何反转(还是说一下…)
当然是在不开辟任何新的空间的前提下
那就是对称位置的 element 交换不断交换啦!!!!30秒之内,小伙伴,你想到了没有
获取数组长度
实际醉翁之意不在酒,在乎于山水之间也
看到这张图,让我突然想起了JAVA 垃圾回收机制。
垃圾回收之前我们要先确定垃圾
如何确定垃圾嘞,
两种方法:
- 引用计数法
- GC roots(可达性分析)
所谓引用计数法的产生,是因为,java中操作对象都要通过引用来调用
就像堆内存中 地址为0×999的对象,已经没有引用和他有关联的时候
这个对象,就要被确定为垃圾标记喽(没用的都是垃圾)
来源:CSDN
作者:实习生dc
链接:https://blog.csdn.net/a16310320524/article/details/104704846