面试经典题型总结篇(五)

目录

一、岗位须知

 二、JVM

1.JVM的执行流程

2.java运行时数据区

①堆

②java虚拟机栈

③本地方法栈

④程序计数器

⑤方法区

三、JVM类加载

1.类加载过程

2.双亲委派模型

四、垃圾回收

1.判断死亡对象

①引用计数

②可达性分析

2.垃圾回收算法

①标记-清除算法

②复制算法

 ③标记-整理算法

④分代算法


一、岗位须知

1.为什么选择测试开发?

①测开是测试工作和开发工作都会接触到的,测试是在一个项目开发的过程中非常重要的一环。测试人员的责任非常大,责任越大成就感就越大,我喜欢这样的工作。

②测开有一部分的开发工作,无论是自动化脚本还是测试工具或框架,都提高了测试的效率,为工作提供了有力的保障,所以我认为测开会激发我对这个岗位的热爱和持续学习的态度。

2.怎么理解测试开发?

①从岗位名字来看,要求测试开发工程师要既懂测试,由要懂开发。

②这个岗位融合了开发角色和质量意识,要求我们兼具开发人员的技能和测试人员的思维。

总的来说,测试开发的定位就是保障产品的质量和提高测试的效率、帮助开发优化产品的性能 。

 3.为什么选择测试?

①一方面我做事情喜欢刨根问底,想把问题一一解决,喜欢并享受这个过程。

②我认为测试人员应该具有足够的耐心和细心,在学校的经历也让我在这方面比别人更有优势。

③国内计算机已经达到了野蛮生长的地步,所以取胜的关键在于用户体验和质量,所以测试也成为了其中不可小觑的一环,选择测试也是看中了发展前景。

4.怎样理解测试?

①测试是无处不在的,测试的意义是为了发现错误而执行程序的过程,以便保证软件产品的质量。

②测试是产品上线的最后一道把关,如果测试工作做得好,就能避免很多问题。

所以说,测试在软件中是非常重要的。 

 二、JVM

JVM是Java虚拟机,属于一个完整的计算机系统但在现实生活中不存在。

1.JVM的执行流程

 所以,JVM主要由类加载器、运行时数据区、执行引擎、本地库接口四部分组成。

2.java运行时数据区

由上图可以看出主要由方法区、堆区、虚拟机栈、本地方法栈、程序计数器组成。

①堆

线程共享,主要保存程序中创建的所有对象。堆中有两个区域:新生代、老年代。

新生代中存放新建的对象,经过一定的QC次数后仍然存活的对象放入老年代。

新生代中又分为Edan区、survivor-from区、survivor-to区(与垃圾回收有关)。

②java虚拟机栈

线程私有,是java方法执行的内存模型,每个方法执行的同时都会创建一个栈帧,用于存放局部变量表、操作数等。

③本地方法栈

线程私有,本地方法栈和虚拟机栈类似,只不过 Java 虚拟机栈是给 JVM 使用的,而本地方法栈是给本地方法使用的。

④程序计数器

线程私有,用来记录线程当前执行的行号。

⑤方法区

方法区的作用:用来存储被虚拟机加载的类信息、常量、静态变量、即编译器编译后的代码等数据的。

三、JVM类加载

1.类加载过程

加载在加载 Loading 阶段,Java虚拟机需要完成以下三件事情: 通过一个类的全限定名来获取定义此类的二进制字节流;将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构;在内存中生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口。验证验证是连接阶段的第一步,这一阶段的目的是确保Class文件的字节流中包含的信息符合《Java虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

准备准备阶段是正式为类中定义的变量(即静态变量,被static修饰的变量)分配内存并设置类变量初始值的阶段。

解析解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程,也就是初始化常量的过程。

初始化初始化阶段,Java 虚拟机真正开始执行类中编写的 Java 程序代码,将主导权移交给应用程序。初始化阶段就是执行类构造器方法的过程。

2.双亲委派模型

JDK 1.2 以来, Java 一直保持着三层类加载器、双亲委派的类加载架构器。

当一个类加载器收到加载请求时,先不会自己加载,而是将请求转给父加载器加载,最后所有的加载请求都会有最顶级类加载器加载,只有父加载器无法完成这个请求时,子加载器才会尝试加载。

双亲委派模型的优点?

1. 避免重复加载类:比如 A 类和 B 类都有一个父类 C 类,那么当 A 启动时就会将 C 类加载起来,那 么在 B 类进行加载时就不需要在重复加载 C 类了。
2. 安全性:使用双亲委派模型也可以保证了 Java 的核心 API 不被篡改,如果没有使用双亲委派模 型,而是每个类加载器加载自己的话就会出现一些问题,比如我们编写一个称为 java.lang.Object 类的话,那么程序运行的时候,系统就会出现多个不同的 Object 类,而有些 Object 类又是用户 自己提供的因此安全性就不能得到保证了。

四、垃圾回收

对于程序计数器、虚拟机栈、本地方法栈这三部分区域而言,其生命周期与相关线程有关,随线程而生,随线程而灭。并且这三个区域的内存分配与回收具有确定性,因为当方法结束或者线程结束时,内存就自然跟着线程回收了。因此有关内存分配和回收关注的为Java 堆与方法区这两个区域。

1.判断死亡对象

首先我们回收不用的内存空间时,需要判断在内存中的对象是否已经不可用了(死亡)。判断死亡对象的方法有两种:

①引用计数

给对象增加一个引用计数器,每当有一个地方引用它时,计数器就 +1 ;当引用失效时,计数器就 -1 ;任何时刻计数器为0 的对象就是不能再被使用的,即对象已 " "

②可达性分析

 像上图一样,我们定义"GC Roots"的对象作为起始点,从这个点向下搜索,有连接的部分说明依然可用,有一部分到GC Roots没有任何的引用链相连时说明对象不可用,那就是死亡对象可以回收。

在Java语言中,可作为GC Roots的对象包含下面几种:

1. 虚拟机栈 ( 栈帧中的本地变量表 ) 中引用的对象;
2. 方法区中类静态属性引用的对象;
3. 方法区中常量引用的对象;
4. 本地方法栈中 JNI(Native 方法 ) 引用的对象。

2.垃圾回收算法

通过上面的两种方法我们可以将死亡对象标记出来了,标记出来之后我们就可以进行垃圾回收操作了

①标记-清除算法

简单粗暴,将标记到的死亡对象直接清除。
这样的弊端:1.会产生大量的内存碎片,因为死亡对象不连续清除之后对于之后的使用会产生影响;2. 标记和清除这两个过程的效率都不高

②复制算法

 它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这块内存需要进行垃圾回收时,会将此区域还存活着的对象复制到另一块上面,然后再把已经使用过的内存区域一次清理掉。这样做的好处是每次都是对整个半区进行内存回收,内存分配时也就不需要考虑内存碎片等复杂情况,只需要移动堆顶指针,按顺序分配即可。

商用虚拟机都是采用这种方法,具体的流程:(Eden:Survivor From : Survivor To = 8:1:1

1. 当Eden区满的时候,会触发第一次垃圾回收,把还活着的对象拷贝到Survivor From区;当Eden区再次触发垃圾回收的时候,会扫描Eden区和From区域,对两个区域进行垃圾回收,经过这次回收后还存活的对象,则直接复制到To区域,并将Eden和From区域清空。 
2. 当后续Eden又发生垃圾回收的时候,会对Eden和To区域进行垃圾回收,存活的对象复制到
From区域,并将Eden和To区域清空。 
3. 部分对象会在From和To区域中复制来复制去,如此交换15次,最终如果还是存活,就存入到老年代。
这种方法会频繁地挪动对象,所以在老年代不适用。

 ③标记-整理算法

复制收集算法在对象存活率较高时会进行比较多的复制操作,效率会变低。因此在老年代一般不能使用复制算法。标记整理算法中标记过程仍与"标记-清除"过程一致,但后续步骤不是直接对可回收对象进行清理,而是让所有存活对象都向一端移动,然后直接清理掉端边界以外的内存。

④分代算法

分代算法是通过区域划分,实现不同区域和不同的垃圾回收策略,从而实现更好的垃圾回收。

 当前 JVM 垃圾收集都采用的是"分代收集(Generational Collection)"算法,这个算法并没有新思想,只是根据对象存活周期的不同将内存划分为几块。一般是把Java堆分为新生代和老年代。在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,因此我们采用复制算法;而老年代中对象存活率高、没有额外空间对它进行分配担保,就必须采用"标记-清理"或者"标记-整理"算法

面试题 : 请问了解Minor GCFull 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倍以上。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LAKURRAA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值