类的生命周期?
示意图
其实一般就是加载和链接,一般其他语言也一样,只不过java拆分的更细了,加载、链接、new初始化、业务/使用、销毁。加载就是磁盘类文件加载到内存中去。链接要细拆分为:验证、准备,解析,验证是:魔法数字、类文件格式(类似报文格式),准备是:初始化字段的默认值,验证是:字段(不存在字段异常)和方法(非法访问方法异常)是否符合jvm规范。new初始化就是初始化对象,然后就可以使用了,最后就是销毁,这个就是一般的三部曲,就是spring的bean的生命周期一样。
何时初始化?
初始化一个类的时机是什么?
1.new 对象
2.基于反射
3.当初始化子类的时候,父类如果没有初始化就要先初始化
4.包含main方法的启动类/入口类
注意,有且仅有以上四种情况,才会触发类的初始化!
类加载器器
如何唯一确定一个类?
类和类加载器,二者共同才能唯一确定一个类。
也就是说,即使是同一个类文件,如果类加载器不一样,这个类也不一样!
双亲委派模型
示意图
其实就是1.jvm/lib目录,即根加载器 2.jvm/lib/ext目录,即扩展目录 3.应用程序库目录,比如web-inf/lib。注意层次结构,示意图是有层次结构的,也就是说,从上往下!另外,委派的意思是,总是1.先由父类加载器加载 2.父加载器在父库目录找不到类,才由子加载器在子目录找类。另外,jdk类都是在jvm/lib目录,比如Object类,都是由根加载器加载,只有这样的话,Object类才唯一;否则,每一层的类加载器都加载一个Object类,那样就乱套了!应用程序lib目录的jar包和类文件,都是由应用程序加载器加载!
参考
深入理解java虚拟机