1.类加载的步骤
1.加载:在硬盘上找到对应的 .class 文件 读取文件内容
2.验证:检查 .class 里面的内容是否符合要求
3.准备:给类对象分配内存空间(在元数据区,初始值用0填充)
4.解析:针对字符串常量进行初始化(把 .class文件中的常量的内容取出来,放到“元数据区”)
5.初始化:针对类对象进行初始化 (涉及到静态成员,静态代码块)
2.类加载的双“亲委派模型”
描述了JVM加载.class文件过程中找到该文件的过程,引入“类加载器” 实际上就是一个特定的类,负责完成后续的类加载工作,JVM中内置了三个类加载器:
BootstrapClassLoader
负责加载标准库中的类
ExtentionClassLoader
负责加载JVM拓展库中的类
ApplicationClassLoader
负责加载第三方库 和 自己写的代码里的类
这三个类是继承关系 BootstrapClassLoader是ExtentionClassLoader的父类,ExtentionClassLoader是ApplicationClassLoader的父类,
工作原理:例如,当我们自己写了一个名为 java.class 的类时,最开始就会被ApplicationClassLoader 接手,但是他并不是一拿到这个任务就自己处理,而是先交给他的父类ExtentionClassLoader ,ExtentionClassLoader 接受到后,任然是向上传递,交给其父类BootstrapClassLoader ,对于BootstrapClassLoader来说,它已经没有父类了,就会开始处理,先在标准库中查找有没有这个类,找不到就向下传递给他的子类,由于是我们自己写的类,显然是找不到的,于是这个任务又回到ExtentionClassLoader 手里,它在查到拓展库中的类时,又没找到,最终交给ApplicationClassLoader,此时就要查找第三方库/用户项目代码的目录,如果找到了,就有由当前类加载器处理,如果没找到,就抛出ClassNotFoundException
这种机制主要是为了应对 用户写的类名与标准库中的类名冲突,保证加载的是标准库中的类,而不是用户的类
3.简述JVM中的垃圾回收机制
1.找到不被继续使用的对象
判定不存在引用指向该对象时,就认为该对象不会被继续使用,检测一个对象是否还有引用指向有两种方案
1.1引用计数
为对象开辟空间的时候在其相邻的位置开辟一块名为 计数器的空间,每当有新的引用指向该对象时,会先进行计数器+1,当指向该对象的某一个引用置为null时,计数器-1
这种机制的两个缺陷;
a. 对于对象本身占用的空间很小时,这种机制会消耗额外的空间
b.可能存在 “循环引用” 问题 t
1.2可达性分析
把对象之间的引用关系理解成一个图结构,JVM会不停的遍历这样的结构,把所有能访问到的对象标记成“可达”,剩下的就是不可达
2.释放对应内存
2.1 标记-清除
直接把被标记为“不可达”的内存空间释放掉,缺点就是会造成有很多内存碎片
2.2 复制算法
空间分两块,只使用一半空间,当要释放该空间里的一部分空间时,就把不要求释放的空间里的内容放在另一半空间,而释放原来一半空间的所有内容
缺点就是 只能使用一半的空间,空间利用率不高
2.3标记-整理
类似于顺序表删除中间元素,会有一个搬运的过程,将不被删除的内容搬运覆盖到要删除的内容的空间中
2.4 分代回收
根据对象的年龄来讨论,当某个对象经历了一轮GC后,还没有成为垃圾,那么年龄+1,年龄大的会降低筛查频率,年龄小的会适当增加筛查频率
为什么要有垃圾回收机制?
在Java中,当内存中某块空间没有任何引用指向时,会被认为这块空间不会再被使用,于是会被回收,以达到释放内存空间减轻编程负担的作用。
4.软件测试中如何进行弱网测试
1.借助抓包工具,这里使用fiddler,打开弱网配置
2.打开设置弱网的脚本
修改不同的上行速率与下行速率即可
5.常用的测试方法以及如何设计测试用例
5.1测试方法
5.1.1.等价类
输入用作测试的一些案例,符合需求文档中要求的是 有效等价类,不符合要求的是无效等价类(比如电话号码超过11位数字),等价类是为了测试该软件 应该做的做了没有
5.1.2.边界值
有效等价类中确定边界值,无效等价类中确定次边界值
5.1.3.场景法
确定基本事件流和备用事件流
5.1.4.正交表法
在测试组合有很多,需要选择一些有代表性的时候,用正交表法。
例如,有 姓名 电子邮箱 密码 确认密码 验证码 五种信息需要输入,每个信息框都有 填写 不填写 两种填写结果,请据此设计测试用例。
步骤:
1.确定因素和水平
因素:姓名 电子邮箱 密码 确认密码 验证码
水平:填写 不填写
2.利用工具allpairs生成正交表
将因素和水平写入到excel表中
2.1.在allparis.exe同级目录下创建一个txt文件,将excel表中的数据复制到txt文件中
2.2.使用allparis对txt文件生成正交表文件 使用命令 allparis.exe test.txt > result_test
(要在放有allparis.exe路径下进行)
成功后该文件夹下有result_test.txt 生成,里面就有正交表生
2.3.根据生成的正交表来编写测试用例
继续补全测试用例,主要注意边界值
正交表的性质:
单看一列中,每个数字出现的次数相同
任意拎出来两列,每行的数字组合齐全且不重复
5.判定表法
当不同的选项是否勾选对输出结果有影响时,适合使用判定表法
例如 若登录一个网站的身份有管理员和普通用户两种身份,若账户包含admin字符 或者 有内部连接进入注册界面时,提交的注册信息会被认为是管理员身份,其余的方式登录则被认为是普通用户身份。据此设计测试用例
步骤:
1.确认输入条件和输出组合
输入条件:账户包含admin字符,内部链接直接进入注册页面,提交注册信息
输出组合:管理员,普通用户
2.通过对输入条件的组合找到对应的结果
3.画判定表
5.2编写测试用例的五个方面
功能测试+性能测试+界面测试+易用性测试+兼容性测试+安全测试
6.如何通过公证机构避免中间人攻击
明文:要传输的数据 密文:经过加密后得到的数据 密钥:进行加密和解密过程的重要道具
对称加密:加密和解密采用同一个密钥
非对称加密:存在一对密钥(公钥和私钥),当使用其中一个加密时,另一个就作为解密密钥
https如何保证安全?
客户端服务器之间的数据使用对称加密,所产生的密钥的传输使用非对称加密
1.服务器生成一个公钥和私钥,客户端连上服务器的时候,服务器就把自己的公钥发送给客户端,私钥自己保存
2.客户端生成对称密钥
3.客户端通过 收到的公钥 针对 该 对称密钥进行加密,形成密文,再把该密文传输给服务器
中间人攻击
客户端和服务器之间出现一个黑客,将 服务器发送给客户端的公钥pub拦截,并发送自己的公钥pub1 给客户端,客户端用该公钥(pub1)将要发送的数据进行加密,再发送,同样被黑客拦截后,黑客对收到的数据用私钥pri1 进进行解密后,再用pri 进行加密发送至服务器,这样,便可获得数据造成不安全
公正机构
1.收到服务器提交的材料后,针对证书的一些字段计算出一个 校验和1 用 工证机构的私钥进行 加密,形成数字签名
2客户端 通过工作机构的公钥 针对数字签名进行解密 得到校验和2
3.客户端来比较 校验和1 与校验和2 是否相同,若相同,则说明证书是可信的
7.NAT机制下内网IP访问外网IP的过程
如果我们要使用QQ发送一些信息,此时我们的电脑就会先构造一个IP数据包,该数据包 包含源IP 目的IP,源IP最初是我们发送方电脑的IP,处于局域网之中,我们所使用的电脑是没有公网IP的,也不能直接和QQ服务器相连,IP数据包会经过运营商路由器,从而间接到达QQ服务器,其中运营商会将发送IP数据包的源IP替换为运营商路由器的外网IP,再进行下一步发送,这样做可以节省外网IP,以至于一个运营商拥有一个外网IP后就可以表示几千甚至上万台内网设备
运营商路由器也可以被视为一个NAT设备,它会对中间经过的数据包进行网络地址转换,当内网设备经过运营商路由器访问外网时,就会把IP数据包中的源IP替换成它自己的IP
当服务器返回响应时,服务器构造的IP数据包的目的IP任然是路由器IP,但是运营商路由器内部维护了一个“映射关系”,其中记录当前相应的请求是从哪个内网设备发送,从而找到对应的内网IP
映射关系的建立
映射关系可以理解为一个表,其中包含了 替换前IP,替换前端口号,目的IP,目的端口号,客户端发送数据包被运营商路由器捕获时该信息即被添加进表,服务器响应后发送的数据包又经运营商路由器时,通过查表,就可以知道 替换前IP和替换前端口号
8.简述TCP可靠传输是靠什么撑着?
1.确认应答机制
tcp在传输 应答数据 时会对数据按照字节进行编号
当接收方收到该应答数据时,返回的应答报文中报头的确认序号就是需要应答的数据的最后一个字节的序号再加1,理解为 传输数据的最后一个字节以前的信息都已经收到了
2.超时重传
通俗来说就是发送方没有收到来自接收方的ACK(应答报文),就会进行等待,当时间超过了某个阈值,就会重新发送一份数据
3.TCP建立连接管理的三次握手和四次挥手
首先客户端发送一个带有SYN标志的同步报文,服务器收到后会返回一个SYN和一个带有ACK标志的应答报文,客户端收到后,再次返回ACK,三次握手就完成了。端口绑定成功,服务器会进入LISTEN状态,准备随时有客户端可以连上,连接建立完成进入ESTABLISHED状态,随时等待进行数据通信。三次握手 不含有任何数据载荷,可以确保通信链路的畅通,验证发送方和接收方能力是否正常,并且也能提前商量一些核心数据。
断开连接时,客户端发送带有FIN标志的同步报文,服务器收到后返回AKC,并且发送FIN(两种标志类型的报文没有合并,原因是触发因素不一样,服务器返回的ACK是内核收到来自客户端的FIN后立即返回的,而服务器自主发送的FIN是代码中调用close触发的,只有当TCP延迟应答时才能合并)
除了握手挥手,还有滑动窗口,流量控制,拥塞控制,延迟应答,捎带应答等机制来控制传输
9.mybatis中#和$的区别
1.${}存在SQL注入问题,#{}可以防止SQL注入的风险
2.${}是及时SQL(参数直接拼接)
#{}是预编译SQL(参数通过占位符方式)可缓存,性能更高
3.#{}会自动添加单引号 ' ' , 一些场景#{}不能完成,比如 排序功能,表名,表字段 作为参数时,需要使用${}
4.模糊查询虽然可以使用${}完成,但是因为存在SQL注入的问题,所以通常使用mysql的内置函数concat来完成