第五讲、java栈区、堆区、方法区自我总结
该篇为自我总结,内容参考zhiman:Java方法区、栈及堆
一、方法区
主要存储:类信息、常量、静态变量、即时编译器编译后的代码
1、类信息
类型(类class、接口interface、枚举enum、注解annotation)加载时,jvm会将类的信息储存在方法区中,包含:
类型的完整有效名、其父类的完整有效名、类型的修饰符(public、abstract、final等)、类型常量池、方法信息、静态变量等。
2、常量
3、静态变量
关于存储引用数据类型的静态变量,存储的将会是引用类型的对象的地址。
4、即时编译器编译后的代码
程序运行时会加载类编译生成的字节码,在这个过程中静态变量、静态方法、普通方法对应的字节码加载到方法区。
二、栈区
方法有进栈和出栈
- 当方法进栈时,都会创建一个栈帧,用来储存局部变量表、操作数栈、动态链接、方法的进出口信息等。
- 方法进栈时,会将方法中的变量和引用都储存在栈中。所以,栈中的变量都是局部变量。
- 八种基本数据类型(byte short int long float double char boolean)在存储到栈中的时候,存储的将会是它们具体的值。
- 引用数据类型存储时,储存的将会是实例对象在堆区中的内存地址;引用类型没有初始化对象,那储存的将会是null。
三、堆区
- 主要存储实例化对象。也就是“new出来的对象”
- 数组也是实例化的对象,规范定义数组因该是 int[] arr = new int[]{12,13,14}; 也是通过new出来的