jvm学习笔记(一)
1、一个类从加载到使用所经历的过程有
加载->验证->准备->解析->初始化->使用->卸载
加载时机:代码中使用到时加载
验证:根据java虚拟机规范,来验证加载进来的".class"文件中的内容,是否符合指定的规范
准备:给加载进来的类分配一定的内存空间以及类变量分配内存空间并且初始化
解析:把符号引用替换成直接引用的过程
初始化:这个时段会把静态代码块或者给类变量初始化,触发的时机是new对象,注意(如果在初始化时发现父类还没有初始化,则需要先初始化父类)
2、类加载器
启动类加载器(Bootstrap ClassLoader):主要负责加载我们在机器上安装的java目录下的核心类,如java安装目录下面的lib目录
扩展类加载器(Extension ClassLoader):主要负责加载java安装目录下的lib\ext目录下的类
应用程序类加载器(Application ClassLoader):主要负责加载"ClassPath"环境变量所指定的路径中的类,也就是加载你写好的那些类到内存中
自定义类加载器:根据自己的需求加载所需的类
3、双亲委派机制
解析:假设应用程序类加载器需要加载一个类,首先他会委派给自己的父类加载器(扩展类加载器)加载,而扩展类加载器则有委派给自己的父类加载器(启动类加载器)加载,如果启动类加载器没找到该类,则将加载权利交给自己的子类加载器(扩展类加载器),如果扩展类加载器也没找到该类,则又会将加载权利交给子类加载(应用程序类加载器)
4、jvm的内存区域
方法区(元数据空间):主要放从".class"文件中加载进来的类,还有一些类似常量池的东西放在这个区域里
程序计数器:记录当前线程执行的字节码指令的位置
java虚拟机:用来保存每个方法内的局部变量的区域,如一个main方法中有顺序执行的方法A、B,那么程序启动时先将main方法压入栈中,然后再将A方法压入栈中,接着再将B方法压入栈中,当B方法执行完成之后从栈中移除,同样,如果A方法执行完毕,那么也将A方法从栈中移除,最后再将main方法移除
java堆内存:用来存放在代码中创建的各种对象
学习内容来自中华石杉老师