一、虚拟机内存结构
1、栈(stack)
- 存放都是方法中的局部变量,每一次方法的运行都是栈当中,方法中的数据传递都是通过栈的。
- 局部变量:方法的参数,或者方法内定义的变量
- 作用域:局部变量一旦超出其作用域,立刻从栈中消失
2、堆(heap)
- 凡是new出来的都在堆当中,堆中的东西都会有有个地址值(16进制),堆中的数据都会有默认值:
整数:0
浮点数:0.0
字符:‘\u0000’
布尔:false
引用:null - java堆垃圾收集器管理的主要区域,因此被称之为GC
3、方法区(method area)
- 存储.class相关信息,包含方法的信息,它用于存储已经被虚拟机加载的类信息、常量、静态变量、编译器编译后的代码等数据。
- 方法区也称之为永久代,一个是标准一个是实现
4、本地方法区(native method area)
- 与系统相关,和栈所发挥的作用类似。
- 区别:
栈是为虚拟机执行java代码(字节码)服务
本地方法区则是为虚拟机能使用到的Native方法服务
5、寄存器(PC register)
- 与CPU相关,也称之为程序计算器
- 作用:
①字节码解释器通过改变程序计算器来依次读取命令
②在多线程的情况下,程序计算器用于记录当前线程执行的位置,从而实现线程来回切换后依然从记录位置开始执行
6、总结
堆:new出来都在堆中,堆中的数据都有默认值
栈:局部变量都存储在栈中,栈中运行的方法和方法间值的传递
方法区:静态变量和常量都在方法区,方法区存放的是.class信息
7、jdk1.7
把我们的运行时常量池从方法区移出,在堆(heap)中开辟了一块空间存放运行时常量池
8、jdk1.8
方法区(HotSpot永久代)被彻底移除,取而代之的生死元空间(Metaspace),元空间使用的直接内存
9、一些原理图
创建数组内存图:
数组冒泡排序:
java内存详细图:
jdk1.7和jdk1.8内存结构对比:
值传递和引用传递