欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java数据保存与内存分配

程序员文章站 2022-07-12 15:42:23
...

       在叙述以下问题时先解释一下java中的堆与栈:

       栈(stack)与堆(heap)都是Java用来在Ram中存放数据的地方。与C++不同,Java自动管理栈和堆,程序员不能直接地设置栈或堆。

       栈的优势是,存取速度比堆要快,仅次于直接位于CPU中的寄存器。但缺点是,存在栈中的数据大小与生存期必须是确定的,缺乏灵活性。另外,栈数据可以共 享。堆的优势是可以动态地分配内存大小,生存期也不必事先告诉编译器,Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是,由于要 在运行时动态分配内存,存取速度较慢。

       一般情况下,可以保存数据的地方有6个:寄存器、栈、堆、静态存储、常数存储和非RAM存储。其中,寄存器是保存数据最快的地方,但是它的数量有限且程序不能直接控制。栈、堆和静态存储都在于RAM中。其中栈保存数据的速度仅次于寄存器,一些基本类型变量和对象的引用变量数据可以保存在栈中,堆中保存的数据灵活性会更大一些,可以用来保存Java对象。被static修饰的数据可以保存在静态存储区域。常数存储,就是用来存储常数的。下面看一下一维数组和二维数组的内存是如何分配的:

        一维数组:

         int [] a; 当声明这个一维数组时,就会在栈中产生一个与该数组名相同的引用变量a,由于只是数组的声明,并未产生一个实际的数组,所以堆中不有保存任何信息。声明一个数组后,就要使用new创建这个数组,a=new int[5];这时堆中就会分配一块内存给数组,此时,栈中的a中存放的就是堆中这块内存的首地址,

创建完后,就可以用for循环为数组赋值了。

        二维数组:

        int[][] a;声明时与一维数组类似,创建这个二维数组:a=new int[3][];这种创建数组的方式未确定第2维的大小,此时堆栈分配情况如下图:
Java数据保存与内存分配
            
    
    博客分类: Java 基础 java内存分配数组

      再指明第二维数:

a[0] = new int[1];
a[1] = new int[2];
a[2] = new int[3];

 此时,数组的内存分配如图:
Java数据保存与内存分配
            
    
    博客分类: Java 基础 java内存分配数组
 最后再给这个不规则数组赋值,也就是改变堆中分配的内存中那些0的值。

 

        这就是数组的创建和初始化的过程中,java内存分配的过程。当在使用中没有任何的引用变量去指向数组时,该数组就会被JVM当成垃圾自动回收了。

 


 

  • Java数据保存与内存分配
            
    
    博客分类: Java 基础 java内存分配数组
  • 大小: 11.3 KB
  • Java数据保存与内存分配
            
    
    博客分类: Java 基础 java内存分配数组
  • 大小: 8.9 KB