目录
一、岗位须知
1.为什么选择测试开发?
①测开是测试工作和开发工作都会接触到的,测试是在一个项目开发的过程中非常重要的一环。测试人员的责任非常大,责任越大成就感就越大,我喜欢这样的工作。
②测开有一部分的开发工作,无论是自动化脚本还是测试工具或框架,都提高了测试的效率,为工作提供了有力的保障,所以我认为测开会激发我对这个岗位的热爱和持续学习的态度。
2.怎么理解测试开发?
①从岗位名字来看,要求测试开发工程师要既懂测试,由要懂开发。
②这个岗位融合了开发角色和质量意识,要求我们兼具开发人员的技能和测试人员的思维。
总的来说,测试开发的定位就是保障产品的质量和提高测试的效率、帮助开发优化产品的性能 。
3.为什么选择测试?
①一方面我做事情喜欢刨根问底,想把问题一一解决,喜欢并享受这个过程。
②我认为测试人员应该具有足够的耐心和细心,在学校的经历也让我在这方面比别人更有优势。
③国内计算机已经达到了野蛮生长的地步,所以取胜的关键在于用户体验和质量,所以测试也成为了其中不可小觑的一环,选择测试也是看中了发展前景。
4.怎样理解测试?
①测试是无处不在的,测试的意义是为了发现错误而执行程序的过程,以便保证软件产品的质量。
②测试是产品上线的最后一道把关,如果测试工作做得好,就能避免很多问题。
所以说,测试在软件中是非常重要的。
二、JVM
JVM是Java虚拟机,属于一个完整的计算机系统但在现实生活中不存在。
1.JVM的执行流程
所以,JVM主要由类加载器、运行时数据区、执行引擎、本地库接口四部分组成。
2.java运行时数据区
由上图可以看出主要由方法区、堆区、虚拟机栈、本地方法栈、程序计数器组成。
①堆
线程共享,主要保存程序中创建的所有对象。堆中有两个区域:新生代、老年代。
新生代中存放新建的对象,经过一定的QC次数后仍然存活的对象放入老年代。
新生代中又分为Edan区、survivor-from区、survivor-to区(与垃圾回收有关)。
②java虚拟机栈
线程私有,是java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧,用于存放局部变量表、操作数等。
③本地方法栈
④程序计数器
⑤方法区
三、JVM类加载
1.类加载过程
加载:在加载 Loading 阶段,Java虚拟机需要完成以下三件事情: 通过一个类的全限定名来获取定义此类的二进制字节流;将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。验证:验证是连接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。
准备:准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。
解析:解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。
初始化:初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。
2.双亲委派模型
当一个类加载器收到加载请求时,先不会自己加载,而是将请求转给父加载器加载,最后所有的加载请求都会有最顶级类加载器加载,只有父加载器无法完成这个请求时,子加载器才会尝试加载。
双亲委派模型的优点?
1. 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那 么在 B 类进行加载时就不需要在重复加载 C 类了。2. 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模 型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户 自己提供的因此安全性就不能得到保证了。
四、垃圾回收
1.判断死亡对象
①引用计数
②可达性分析
像上图一样,我们定义"GC Roots"的对象作为起始点,从这个点向下搜索,有连接的部分说明依然可用,有一部分到GC Roots没有任何的引用链相连时说明对象不可用,那就是死亡对象可以回收。
在Java语言中,可作为GC Roots的对象包含下面几种:
2.垃圾回收算法
①标记-清除算法
②复制算法
它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配即可。
商用虚拟机都是采用这种方法,具体的流程:(Eden:Survivor From : Survivor To = 8:1:1)
③标记-整理算法
复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。标记整理算法中标记过程仍与"标记-清除"过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。
④分代算法
当前 JVM 垃圾收集都采用的是"分代收集(Generational Collection)"算法,这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高、没有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法。
面试题 : 请问了解Minor GC和Full GC么,这两种GC有什么不一样吗?
1. Minor GC又称为新生代GC : 指的是发生在新生代的垃圾收集。因为Java对象大多都具备朝生夕灭的特性,因此Minor GC(采用复制算法)非常频繁,一般回收速度也比较快。2. Full GC 又称为老年代GC或者Major GC : 指发生在老年代的垃圾收集。出现了Major GC,经常会伴随至少一次的Minor GC(并非绝对,在Parallel Scavenge收集器中就有直接进行Full GC的策略选择过程)。Major GC的速度一般会比Minor GC慢10倍以上。