Java内存划分 5

一,栈:

存放的都是方法中的 局部变量,方法的运行一定要在栈当中。

局部变量:方法的参数,方法{}中的变量

作用域:一旦超出作用域,立刻从栈内存中消失。

二,堆:

凡是 new 出来的东西,都在堆当中

堆内存里面的东西都有一个地址值:16进制

堆里面的数据都有默认值:

​ 整数 默认为0

​ 浮点数 默认为0.0

​ 字符 默认为 ‘\u0000’

​ 布尔 默认为false

​ 引用类型 默认为null

三,方法区:

存储 .class 相关信息,包含方法的信息

四,本地方法栈

与操作系统相关

五,寄存器:

与 cpu 相关

一个数组的内存图

Java内存划分--数组内存图
方法信息 存储在 方法区中

运行方法就必须将 方法信息 加载到栈中,并在栈中开辟空间,存储数组名

new的时候 是在堆里面,在堆中开辟一段内存空间,编号,赋予16进制地址值。 将地址值赋给栈里面的数组名。

根据索引赋值的时候,通过数组名的地址,在堆中找到相应内存地址,按照索引递增,找到相应地址

两个数组的内存图

Java内存划分--数组内存图
类比一个数组,我都懒得写了… 还是要注意压栈的问题
画这个图,实际上是为下面做铺垫

两个引用指向同一个数组

Java内存划分--数组内存图
其实图里面已经可以很清楚的看到,虽然 B数组是被 A数组赋值了,但是,B数组依然能够指向内存中new出来的数组地址,
由此,不难看出,通过 数组B 一样能够改变 堆内存中的数组
实际上,是堆内存共享了

考虑一下数组如何反转(还是说一下…)

当然是在不开辟任何新的空间的前提下

Java内存划分--数组内存图
那就是对称位置的 element 交换不断交换啦!!!!30秒之内,小伙伴,你想到了没有

获取数组长度

Java内存划分--数组内存图
实际醉翁之意不在酒,在乎于山水之间也

看到这张图,让我突然想起了JAVA 垃圾回收机制。
垃圾回收之前我们要先确定垃圾
如何确定垃圾嘞,
两种方法:

  1. 引用计数法
  2. GC roots(可达性分析)
    所谓引用计数法的产生,是因为,java中操作对象都要通过引用来调用
    就像堆内存中 地址为0×999的对象,已经没有引用和他有关联的时候
    这个对象,就要被确定为垃圾标记喽(没用的都是垃圾)

相关文章: