JVM
java虚拟机的缩写,是一个虚构的虚拟机
组成:
·类装载器: 用来装载.class 文件
·执行引擎: 执行字节码文件或者执行本地方法
·运行时数据区:
~方法区:
线程共享
存储已被虚拟机加载的类信息、常量、静态变量、编译后的代码
GC少见
~堆:
线程共享内存区
虚拟机启动时创建
存放对象实例
可以处于逻辑上连续 物理上不连续的内存空间
可以固定大小,也可以用作扩展
~栈:
线程私有,生命周期与线程相同
线程创建的同时同时会创建JVM栈
方法调用完成的过程就是栈帧从虚拟机入栈到出栈的过程
局部变量表所需要的内存在编译时分配
栈可以存放的基础数据类型:(int long double float short byte char boolean)
栈溢出:
条件:栈深度大于虚拟机允许的深度
解决办法: 1、调整线程栈的大小 2、越大线程总数越少 3、越少线程总数越大
~PC寄存器:
存储每个线程下一步执行的JVM指令
如果该方法为native方法,PC寄存器不会存储信息
~本地方法栈:
执行虚拟机用到的native方法。
与虚拟机的区别:本地方法栈是给虚拟机用的;虚拟机栈是给Java程序用的
·GC(垃圾回收模块):
方式: 复制删除法;标记删除法;标记整理法
gcroot:
gc的类:
废弃的常量
无用的引用
无用的类(所有的实例都被回收;classload已被回收、没有任何地方引用、无法通过反射访问)
不gc的类:
虚拟机栈中的引用对象
方法区: 类变量、常量
本地方法栈中的对象引用
·jvm三种加载类:
home: java.lang
ext: 自主体
y应用程序加载器
·java程序的执行过程:
1.加载类 获取类的二进制字节流,将其转换为方法区的运行时数据结构
2.分配内存 校验文件格式,元数据验证,字节码验证,符号引用验证
3.初始化数据
在方法区中对类的static变量分配内存并设置变量数据默认值
不包括变量实例,实例变量会在对象实例化的时候一起分配到java堆中
4.设置对象头 将常量池中内的符号引用替换成直接引用的过程
5.执行init方法 为类的静态变量赋予正确的初始值