第一部分
1.现场写程序:数据结构书上的而程序,基本的算法(排序算法),要提前演练,以免到时慌张。
2.把话题引导自己熟悉的领域
3.日程本记录宣讲会,笔试,面试的时间
4.笔试面试完要对问题进行回顾,不会的东西一定要搞懂。
5.数据结构,java编程思想,TCP/IP,操作系统,计算机网络
6.初入职场调整好自己的和心态和节奏,不要跟着别人的脚步乱了自己的阵脚。清楚自己在做什么,清楚自己的目标
7.和厉害的同事领导打交道。
第二部分
一、类加载过程
程序主动使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载、连接、初始化3个步骤来对该类进行初始化。
1.过程
1.1 加载
由JVM提供的类加载器(也称为系统类加载器),将类中的class从文件导入内存并生成一个java.lang.class对象。使用不同的类加载器,可以从不同的来源:
- 从文件系统中加载Class文件。绝大部分程序的类加载方式
- 从网络中加载Class文件。比如maven环境中配置的远程仓库,即从网络中获取类和包
- 从jar包中获取Class文件。JDBC的驱动类就是从JAR保重获取Class文件
- 把一个java源文件进行动态编译,并进行加载。
加载类的二进制文件。JVM允许类加载器预先加载某些类,无需等到首次使用才加载。(有些常用的就先预加载)
除了系统类加载器意外,用户还可以通过继承ClassLoader创建用户类加载器
1.2 链接
连接分为三个部分:验证、准备、解析。此阶段将类的二进制数据合并到JRE中
1.2.1 验证用以验证被加载的类是否由正确的内部结构。(四种验证方式我不懂,不赘述,或许是自己设计类加载器的时候需要用到吧)
1.2.2 准备为静态变量分配内存,并设置默认初始值。
1.2.3 解析将二进制中的符号引用替换成直接引用。符号引用使用助记符描述引用目标,布局与内存无关;直接引用通过偏移量或者指针或者能直接使用的句柄描述要引用的对象
1.3 初始化
1.2.2 中是设置默认初始值(譬如null,0,活着其他的default x),并不是用户指定的值。初始化时为静态变量设定正确的初始值
二、类加载时机
- new一个对象
- 调用类的静态方法
- 初始化一个类的子类(会首先初始化他的父类)
- 使用一个类或接口的静态变量或者对静态变量进行赋值
- 反射 Class.forname(“…”)
注:对于一个final类型的静态变量,如果该变量的值在编译时就可以确定下来,那么这个变量相当于“宏变量”。Java编译器会在编译时直接把这个变量出现的地方替换成它的值,因此即使程序使用该静态变量,也不会导致该类的初始化。反之,如果final类型的静态Field的值不能在编译时确定下来,则必须等到运行时才可以确定该变量的值,如果通过该类来访问它的静态变量,则会导致该类被初始化。
三、类加载器
四种类加载器
- 启动类加载器(extensions class loader)加载核心类
- 扩展类加载器(bootstrap class loader)它负责加载JRE的扩展目录,lib/ext或者由java.ext.dirs系统属性指定的目录中的JAR包的类。由Java语言实现,父类加载器为null。
- 系统类加载器(extensions class loader)
- 用户类加载器(system class loader)
类加载方式:双亲委托制:
某个特定的类加载器在接到加载类的请求时,首先将加载任务委托给父加载器,依次递归,如果父加载器可以完成类加载任务,就成功返回;只有父加载器无法完成此加载任务时,才自己去加载。
1.避免重复加载
2.一种安全机制,父类已经加载过的类子类就无需再加载,子类也无法再自定义一个类动态替换已存在的类。防止核心API被篡改
参考自:类加载全过程参考,并进行的思考
总结:对类加载器种类不是特别了解,也没有想去详细了解的欲望。今天就对类加载过程有了全面的认识,感谢csdn博主的分享。我不想要抄袭,我想自己学会,可是在学的过程中总想着复制粘贴。记住自己的目的:是学会该知识点和以后便于回顾而写博客,而不是为了写博客而写博客。