java的内存划分为5个部分:
-
栈(stack):描述的是JAVA方法执行的内存模型:每个方法被执行的时候会创建一个栈帧,用于存储局部变量表、操作栈、动态链接、方法出口等信息。存放的都是方法中的局部变量。方法的运行一定是在栈中运行 .线程私有.
局部变量:方法的参数或者是方法{}内部的变量,有作用域,一旦超出作用域,立刻从栈内存中消失
-
堆(Heap):存放实例对象 ,运行时动态分配内存
- 凡是new出来的东西,都在堆当中。所有的实例对象和数组都要在堆上分配
- 堆内存里面的东西都有一个地址值(16进制)。
- 堆内存里面的数据,都有默认值.
- 线程共享的一块区域,在java虚拟机启动时创建.
- 垃圾收集器管理的主要区域
- 可以处于物理上不连续的内存空间,只要是逻辑上连续的即可
- 堆中数据必须包含能查找到此对象类型数据(对象类型、父类、实现的接口、方法)等的地址信息,这些数据存储在方法区。所以使用对象.getClass()就可以得到该类的Class对象
-
方法区(Method Area):存储.class相关信息,方括方法的信息
- 各个线程共享的内存区域
- 存储已被虚拟机加载的类信息、常量、静态变量
-
本地方法栈:与操作系统相关
-
程序计数器:与CPU相关。作用为当前线程所执行的字节码的行号指示器。线程私有。