Java内存划分
栈
栈(Stack) :存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。
局部变量:方法的参数,或者是方法{}内部的变量
作用域: 一旦超出作用域,立刻从栈内存当中消失。
- 栈区: 对象实例在Heap 中分配好以后,需要在Stack中保存一个4字节的Heap内存地址,
用来定位该对象实例在Heap 中的位置,便于找到该对象实例。
1. 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2. jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
3. 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
堆
堆(Heap) :凡是new出来的东西,都在堆当中。
- 堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象
本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中)
1. 存储的全部是对象,每个对象都包含一个与之对应的class的信息。(class的目的是得到操作指令)
2. jvm只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身.
3. 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。
- 堆内存里面的东西都有一个地址值: 16进制
- 堆内存里面的数据,都有默认值。规则:
- 如果是整数 默认为0
- 如果是浮点数 默认为0.0
- 如果是字符 默认为"\u0000'
- 如果是布尔 默认为false
- 如果是引用类型 默认为null
静态区/方法区
方法区(Method Area) :存储.class相关信息,包含方法的信息。
1. 方法区又叫静态区,跟堆一样,被所有的线程共享。方法区包含所有的class和static变量。
2. 方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量。
3. 全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。
本地方法栈
本地方法栈(Native Method Stack) :与操作系统相关。
寄存器
寄存器(pc Register) :与CPU相关。