之前在微信上看过Roy_厉的一篇自述,讲述程序员成长的过程,记得最深的一句话就是“外面的东西容易忘记,有网络就能拾起,内功才是入骨的东西”。
想想自己的经历,本是非科班生,从大一开始自学计算机,也不是特别热爱,当初学的时候是觉得网站编程吊吊的,学着以后也能赚点钱,后来从看c#开始,为了入门匆匆读了一遍《c#入门语法》然后就开始看html,java基础语法,css,js,期间还有杂七杂八的看了些设计模式,觉得自己吊吊的,其实都只是看了一遍,中间自己用一个学期的时间把贴吧里的E神的视频俄罗斯方块的自己照着视频码了一遍,之后再面试中问道怎么写的思路讲一遍的时候,我就懵逼了,就是基础掌握不好,学东西不深入的缘故,这几天辞职在家好好想想以后怎么过,如果想牛逼,就要做出改变,基础的东西,其实每天多看几遍,多码几遍代码,不是大问题,从虚拟机开始,比如,动态代理是指什么,牵涉到的知识点:I/O、反射,反射又牵涉到java虚拟机的加载过程,加载过程又分为加载--验证--准备--解析--初始化,还要说出每一步分别做了什么,这里就讲讲我的理解。
我是在博客园看了五月的仓颉的jvm的博文之后写的,所以我只是将我自己对知识的理解写下来,可能不多,或者有误,都是我自己理解后写下来的。
1)初始化加载,java文件被compiler编译成为.class文件,读取class二进制数据流。再将类信息,静态变量,字节码,常量加载到运行方法去,最后在内存中用java.lang.Class类生成一个.class文件的替代对象,该对象可以提供所有该.class文件的访问接口。
2)验证,验证该.class文件信息(二进制字节流信息)是否符合jvm虚拟机的规范要求及数据安全。知道就可以了。目前就理解到这里。
3)准备,为类变量(static标注的变量)分配内存空间,不是实例变量,为实例变量分配内存空间要和类变量一起分配到内存中。
4)解析,将符号引用变为直接引用,什么是符号引用设计编译原理,我当然不懂,看了解释也不懂。
5)初始化,为静态变量初始化默认值赋予初始化值。
落的一逼,刚刚将初始化写在了解析前面,是忘记了解析这一步了,因为符号引用和直接引用没用理解概念,所以问题来了解决问题。
//外面的东西容易忘记,内功才是入骨的东西。