Java学习-内存划分及内存的调用关系
一、JAVA内存划分
JAVA的内存可以划分为五个部分:堆、栈、方法区、本地方法区和寄存器。
堆(Heap):凡是new出来的东西都在堆中
如:
1 integer = new Integer(2) // integer(2) 就在堆中 2 3 int[] arr = {12, 23, 34, 45}; //注意 简化写法在实际编译时仍然会被编译为:int[] arr = new int[]{12, 23, 34, 45};
注意:1、堆内存里的东西都有一个16进制的地址值
2、堆内存里的数据,都有默认值。 如:整数是:0;布尔是:false;引用是:null ...
栈(Stack):存放的都是方法中的局部变量
局部变量:①方法的参数 ②方法 {} 内部的变量
作用域:一旦超出了作用域,立刻从栈内存中消失
注意:方法一定要在栈当中运行
方法区(Method Area):存储.class相关信息,包含方法的信息
本地方法区():与操作系统相关
寄存器(pc Register):与CPU相关
二、 JAVA内存的调用关系 (堆、栈、方法区)
例子:数组元素赋值
1 package cn.itcast.day05.demo03; 2 3 public class arrayRAM { 4 5 public static void main(String[] args) { 6 7 // 初始化三个元素的数组并打印 8 int[] arrayA = new int[3]; 9 System.out.println(arrayA); 10 System.out.println(arrayA[0]); 11 System.out.println(arrayA[1]); 12 System.out.println(arrayA[2]); 13 14 // 改变数组元素 15 arrayA[1] = 10; 16 arrayA[2] = 20; 17 18 // 数组赋值并打印 19 int[] arrayB = arrayA; 20 System.out.println(arrayB); 21 System.out.println(arrayB[0]); 22 System.out.println(arrayB[1]); 23 System.out.println(arrayB[2]); 24 25 // 改变数组元素的值 26 arrayB[1] = 100; 27 arrayB[2] = 200; 28 System.out.println(arrayB[1]); 29 System.out.println(arrayB[2]); 30 } 31 }
上述代码在内存的调用过程:方法区 -> 栈 -> 堆 -> 返回内存地址给栈
注意:1、arrayA 赋值给arrayB的是它的内存地址值。所以arrayA和B完全相同,因为他们使用的是同一块内存地址。
2、arrayB修改数组元素,ArrayA也会随之更改。