Java内存分析


Java内存分析

Java内存主要分为堆、栈和方法区

    • 存放new的对象和数组
    • 可以被所有的线程共享,不会存放到别的对象引用
    • 存放基本变量类型(包含这个基本类型的具体数值)
    • 引用对象的变量(会存放这个引用在堆里的具体地址)
  • 方法区
    • 可以被所有的线程共享
    • 包含了所有的staticclass变量

以数组为例进行举例

  1. 声明一个数组时:int[] array;,进行压栈

  2. 创建数组时:array = new int[10];,产生了new,此时在堆中分配了一个空间,开辟了一个初始大小为10的内存空间

  3. 给数组元素赋值

    array[0] = 1;
    array[1] = 2;
    array[2] = 3;
    array[3] = 4;
    array[4] = 5;
    array[5] = 6;
    array[6] = 7;
    array[7] = 8;
    array[8] = 9;
    array[9] = 10;

    假如输出第11个元素

    System.out.println(array[10]);

    这个元素不存在,会发生数组下标越界异常:

    ==java.lang.ArrayIndexOutOfBoundsException==

狂神说java的内存分析图

下面是我自行画的图,嘿嘿

java数组内存分析

数组的三种初始化

  • 静态初始化

    int[] a = {1, 2, 3}; // 创建 + 赋值 => 一经创建就长度固定
    Man[] mans = {new Man(1, 1), new Man(2, 2)}; // 引用类型
  • 动态初始化(==包含默认初始化==)

    int[] a = new int[2]; // 创建之后,所有的元素默认为0,所以需要下面手动赋值
    a[0] = 1;
    a[1] = 2;
  • 数组的默认初始化

    数组是引用类型,它的元素相当于类的实例变量,因此数组一经分配空间,其中的每个元素也被按照实例变量同样的方式被隐式的初始化

数组的四个基本特点

  • 长度是确定的,数组一旦被创建,它的大小就是固定的
  • 它的元素必须是相同类型的,不允许出现混合类型
  • 数组中的元素可以是任何数据类型,包括基本类型和引用类型
  • 数组的变量属于引用类型,数组也可以看成是对象,数组的元素就相当于该对象的成员变量

数组本身就是对象,Java中对象是在堆中的,正如上面画的图中所示,==数组对象本身是在堆中的==

数组边界

下标的合法区间:[0, length - 1],如果越界就会报错;

==java.lang.ArrayIndexOutOfBoundsException==

小结

  • 数组是相同数据类型的有序集合
  • 数组是对象,数组元素相当于对象的成员变量
  • 数组长度固定;下标越界就会报错(java.lang.ArrayIndexOutOfBoundsException)

文章作者: Virus
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Virus !
 上一篇
给憨憨写的阶乘的实现 给憨憨写的阶乘的实现
给憨憨写的阶乘的实现原理 一个数的阶乘 当这个数 = 1的时候,算式为:1 * (1 - 0) = 1,所以1的阶乘就是1 当这个数 = 2的时候,算式为:2! = 2 * 1 = 2 * (2 - 1) = 2,所以2的阶乘就是 ==前2
2020-05-18
下一篇 
一些场景的思路笔记 一些场景的思路笔记
新增预约场景 什么时机发送消息给客户? 答:添加入库成功后,发送消息给客户。 在laravel写在控制器中,还是写别的地方? 答:从业务代码可维护成本来说,分离代码是更好的维护,所以一般不写在控制器中 laravel提供orm操作中,有模型
2020-05-12
  目录