每个方法在执行时都会创建一个栈帧用于存放局部变量表,操作数栈,动态链接,方法出口等信息.每一个方法从调用到完成对应这一个栈帧在虚拟机中的入栈到出栈
64位(long,double)会占用2个局部变量空间(slot),其余占用一个
在方法运行时不会改变大小
与虚拟机栈基本一致
区别:
仅保存Native方法信息
存放对象实例
被所有线程共享,虚拟机启动时创建
垃圾管理器主要区域,所以也被称为GC堆
-Xms -Xmx
OOM
用于存储已被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码
所有线程共享
在HotSpot也被称为永久代
方法区可以不实现垃圾收集
OOM
方法区 的一部分
用于存放编译期生成的字面量,符号引用,直接引用,当类加载完毕后加入
具备动态性,运行期间也可将新的常量放入池中, String.intern()
String.intern()
OOM
1.类加载检查. 先查询参数是否在常量池中有一个类的符号引用, 检查这个符号引用代表的类是否已经被加载,解析 初始化过,如果没有 ,则需要进行相应的类加载过程
2.1 指针碰撞,要求java堆中内存绝对规整
2.2 空闲列表
2.3 线程安全问题
3.虚拟机对对象进行必要设置,实例信息,元数据信息,对象hash码,GC分代信息等,这些信息在对象头中
执行init方法 代码:P45
对象头
运行时数据 Mark Word
类型指针
实例数据
对齐填充
通过栈中的reference数据来操作堆中的具体对象
直接指针 reference 中直接保存对象地址
SUN HotSpot 采用直接指针
使用句柄 reference中保存句柄地址
在堆中维护一个句柄池
java堆溢出
java heap space 会有dump文件 ,通过分析dump文件确定是溢出还是泄漏
虚拟机栈和本地方法栈溢出
单线程
大小: 操作系统分配进程内存2G(32位 win) - Xmx(最大堆容量) - MaxPermSize(方法区) 剩余部分可大致认为是其大小
程序计数器忽略,忽略消耗
方法区和运行时常量池溢出
本机直接内存溢出