java内存模型
-
java中代码执行、对象创建,都是在虚拟机中处理的。
-
jdk1.6之前jvm虚拟机结构
-
栈(stack)
- 存放方法中的局部变量,每一次方法的调用都是通过栈进行传递的,方法数据传递一定在栈中
- 局部变量:方法中的变量和参数
- 作用域:变量有效的范围,局部变量的作用域根据所属的{}内进行判断,或当前的方法中
- 如果变量超出了作用域,会立即从栈中消失
-
堆(heap)
- 凡是new出来的都在堆中
- 堆是垃圾收集器的主要区域,也称之为GC堆
- 堆中数据都有默认值:
- 整数类型:0
- 浮点类型:0.0
- 字符类型:‘\u0000’(unicode码表中的不可见字符)
- 布尔类型:false
- 引用类型:null
-
方法区(method area)
- 存储.class的相关信息,包含方法信息
- 用于存储已经被虚拟机加载的类信息和常量,静态变量,即时编译后的代码
- 方法区也被称为永久代,方法区是标准,永久代是实现
- 数据存放在磁盘
-
本地方法栈(native method stack)
- 与系统相关,和虚拟机栈类似
- 区别:虚拟机栈执行java方法,本地方法栈执行本地的方法(c,c++)
- 本地方法都被native修饰
-
寄存器(pc register)
- 与cpu相关,包含程序计数器
- 控制程序执行的顺序,记录程序执行的时间
-
总结:
-
-
在jdk1.7中的改变
- 将java堆中开辟了一个新空间,存放运行时常量池
- 移除方法区中的常量池
-
在jdk1.8中的改变
-
方法区被移除,取而代之的是元空间
-
元空间直接使用内存
-
是为了融合Hotsport和JRockit虚拟机而做出的改变
-