软件测试开发面经看到的题目

软件测试开发面经看到的题目

说明:本文所有内容非本人自创,都是查找资源,然后附上相应的链接,侵权删
本文主要是为了复习方便

浏览器搜索到页面显示的过程

  1. DNS解析成网络IP
  2. 建立TCP连接
  3. 发送HTTP请求
  4. 服务器处理HTTP请求,返回HTTP响应
  5. 浏览器渲染显示HTML文件
  6. 连接关闭
    参考:https://blog.csdn.net/wlk2064819994/article/details/79756669

GET和POST请求方式的区别:

  1. get请求参数是直接显示在地址栏的,而post在地址栏不显示。

  2. get方式不安全,post安全。

  3. get请求参数是有长度限制的,post没有长度限制。

数据库 连接

参考:https://jingyan.baidu.com/article/60ccbceb9578f164cab197f4.html

查询收入超过其经理的员工姓名

select e.name as Employee
from Employee as e JOIN Employee as ecopy
ON e.ManagerId = ecopy.id where e.Salary > ecopy.Salary

参考

合并两个有序数组,B合并到A上

 public void merge(int[] nums1, int m, int[] nums2, int n) {
 		//合并后最后一个数的索引为m+n-1
        int i = m-1;int j = n-1;int k = m+n-1;
        while(i >= 0 && j >= 0){
        	//将两个数组中从最后一位开始比较,较大的先插入
        	//当j先等于0时,说明nums2的数字已经全部复制到nums1中,此时合并完成(说明nums1中最小的元素比nums2小)
        	//当i先等于0时,说明nums1中原来的所有数字已经复制完毕,此时进入下面的循环(说明nums1中最小的元素比nums2大)
            nums1[k--] = nums1[i] > nums2[j] ? nums1[i--] : nums2[j--]; 
        }
        while(j >= 0){
            nums1[k--] = nums2[j--];
        }
    }
}

参考: https://blog.csdn.net/htt789/article/details/80020249
https://blog.csdn.net/qq_39240270/article/details/88552799

测试样例设计

参考 设计样例方法

登录
a.用户名和密码是否大小写敏感;

b.页面上的密码框是否加密显示;

c.用户名和密码是否大小写敏感;

d.忘记用户名和忘记密码的功能是否可用;

e.前端页面是否根据设计要求限制用户名和密码长度;

f.点击验证码图片是否可以更换图片验证码,更换的图片验证码是否可用;

g.刷新页面是否会刷新图片验证码;

h.如果图片验证码具有时效性,需要分别验证时效内和时效外验证码的有效性;

i.用户登录成功但是会话超时后,继续操作是否会重定向到用户登录界面;

j.不同级别的用户,比如管理员用户和普通用户,登录系统后的权限是否符合要求。

兼容性测试用例:

a.在相同浏览器的不同版本中,验证用户登录页面的显示以及功能是否正确;

b.在不同浏览器中,验证用户登录页面的显示以及功能是否正确;

c.在不同移动设备的不同浏览器中,验证用户登录页面的显示以及功能是否正确;

d.在不同分辨率的界面下,验证用户登录页面的显示以及功能是否正确;

性能压力测试用例:

a.单用户登录的响应时间是否小于3秒;

b.单用户登录时,后台请求数量是否过多;

c.高并发场景下用户登录的响应时间是否小于5秒;

d.高并发场景下服务端的监控指标是否符合预期;

e.高集合点并发场景下,是否存在资源死锁和不合理的资源等待;

f.长时间大量用户连续登录和登出,服务器端是否存在内存泄漏。

安全性测试用例:

a.用户密码在网络传输过程中是否加密;

b.后台数据库存储的密码是否加密;

c.密码是否具有有效期,密码有效期到期后,是否提示需要修改密码;

d.密码输入框内输入的密码是否可以在页面源码模式下被查看;

e.密码输入框是否不支持复制和粘贴;

f.用户名和密码的输入框中分别输入典型的“SQL注入攻击”字符串,验证系统的返回页面;

g.不登录的情況下,在浏览器中直接输入需要登录后才能访问的URL地址,验证是否会重新定向到用户登录界面;

h.用户名和密码的输入框中分別输入典型的“XSS跨站脚本攻击”字符串,验证系统行为是否被篡改,连续多次登录失败情況下,系统是否会阻止后续的尝试,以防止暴力破解;

i.同一用户先后在多台终端的浏览器上登录,验证登录是否具有互斥性;

j.同一用户在同一终端的多种浏览器上登录,验证登录功能的互斥性是否符合设计预期。
参考

测试中提bug的流程

在这里插入图片描述
参考

手机app性能测试介绍,用什么工具

服务器端性能测试

有10万个数据,选出前100个最大的数据

https://blog.csdn.net/sky_100/article/details/77675792

界面展示的数据来自表SP,每页展示10条数据,请写一条sql,查询出第3页的数据

select * from table limit 20,10;
select * from table limit (start-1)*limit,limit; 其中start是页码,limit是每页显示的条数。
https://www.cnblogs.com/quietwalk/p/6472438.html

linux 命令

https://blog.csdn.net/luansj/article/details/97272672

简单叙述服务端如何维护一个session

https://blog.csdn.net/m0_37905429/article/details/76472709

快排

public class QuickSort {
    public static void main(String[] args) {
        int [] a = {1,6,8,7,3,5,16,4,8,36,13,44};
        QKSourt(a,0,a.length-1);
        for (int i:a) {
            System.out.print(i + " ");
        }
    }
    private static void QKSourt(int[] a, int start, int end) {
        if (a.length < 0){
            return ;
        }
        if (start >= end){
            return ;
        }
        int left = start;
        int right = end;
        int temp = a[left];
        while (left < right){
            while (left < right && a[right] > temp){
                right -- ;
            }
            a[left] = a[right];
            while (left < right && a[left] < temp){
                left ++ ;
            }
            a[right] = a[left];
        }
        a[left] = temp;
        System.out.println(Arrays.toString(a));
        QKSourt(a, start, left -1);
        QKSourt(a,left+1,end);v
    }
}

https://www.jianshu.com/p/e4369c66d4a5v

https://blog.csdn.net/shujuelin/article/details/82423852

链表交叉

https://blog.csdn.net/seanyxie/article/details/6247071

索引的作用

优点:

①通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性

②大大加快数据的检索速度,这也是创建索引的最主要原因

③加快表与表之间的连接,在实现数据的参考完整性方面特别有意义

④在使用分组和排序,子句进行数据检索时,同样可以显著减少查询中分组和排序的时间

⑤通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。

缺点:

①创建索引和维护索引需要时间,这种时间随着数据量的增加而增加

②索引需要占物理空间,除了数据表占数据空间之外,每一个索引还要占物理空间,如果要建立聚簇索引,需要的空间更大

③当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,这就降低了数据的维护速度。

索引是创建在数据库的表中的列上。因此,在创建索引的时候,要考虑哪些列上适合加索引,那些列上不适合加索引

https://www.cnblogs.com/daisyyang/p/10907817.html

数据库索引有哪几种

https://www.cnblogs.com/sessionbest/articles/8689255.html
https://zhidao.baidu.com/question/261511657.html

MySql存储引擎介绍

InnoDB和MyISAM的区别

https://www.jianshu.com/p/d2ac26ca6525

Java当中有哪几种锁
自旋锁: 自旋锁在JDK1.6之后就默认开启了。基于之前的观察,共享数据的锁定状态只会持续很短的时间,为了这一小段时间而去挂起和恢复线程有点浪费,所以这里就做了一个处理,让后面请求锁的那个线程在稍等一会,但是不放弃处理器的执行时间,看看持有锁的线程能否快速释放。为了让线程等待,所以需要让线程执行一个忙循环也就是自旋操作。在jdk6之后,引入了自适应的自旋锁,也就是等待的时间不再固定了,而是由上一次在同一个锁上的自旋时间及锁的拥有者状态来决定。

偏向锁: 在JDK1.之后引入的一项锁优化,目的是消除数据在无竞争情况下的同步原语。进一步提升程序的运行性能。 偏向锁就是偏心的偏,意思是这个锁会偏向第一个获得他的线程,如果接下来的执行过程中,改锁没有被其他线程获取,则持有偏向锁的线程将永远不需要再进行同步。偏向锁可以提高带有同步但无竞争的程序性能,也就是说他并不一定总是对程序运行有利,如果程序中大多数的锁都是被多个不同的线程访问,那偏向模式就是多余的,在具体问题具体分析的前提下,可以考虑是否使用偏向锁。

轻量级锁: 为了减少获得锁和释放锁所带来的性能消耗,引入了“偏向锁”和“轻量级锁”,所以在Java SE1.6里锁一共有四种状态,无锁状态,偏向锁状态,轻量级锁状态和重量级锁状态,它会随着竞争情况逐渐升级。锁可以升级但不能降级,意味着偏向锁升级成轻量级锁后不能降级成偏向锁。
https://blog.csdn.net/weixin_37766296/article/details/80483649

在这里插入图片描述

java各种锁

MySQL-查询成绩为第二名(第N名)的所有学生数据

select * from score where grade =
(select distinct(grade) from score order by grade desc limit 1,1);

https://blog.csdn.net/weixin_43230063/article/details/105985374

输出A表中有但B表中没有的ID

select A表.ID
from A表 left join B表 on A表.ID=B表.ID
where B表.ID IS NULL

共享单车扫码测试用例

作者:测试开发Guide
链接
来源:牛客网

  1. 功能测试:
    (1)扫码摄像头识别清晰
    (2)远距离扫码自动放大
    (3)夜晚扫码可以开手电筒
    (4)扫码识别出来的自行车定位准确
    (5)扫码之后能够正常跳转到开锁页
  2. 异常测试:
    (1)扫码失败之后,提示友好
    (2)自行车有故障之后,扫码完成后有提示
    (3)自行车二维码模糊,也可以准确识别
    (4)弱网状态下,测试扫码识别
  3. 专项测试:
    (1)扫码识别速度
    (2)扫码接口响应速度
    (3)扫码识别准确度

TCP和UDP的区别

TCP(Transmission Control Protocol,传输控制协议)提供的是面向连接可靠的字节流服务。即客户和服务器交换数据前,必须现在双方之间建立一个TCP连接,之后才能传输数据。并且提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

UDP(User Data Protocol,用户数据报协议)是一个简单的面向数据报的运输层协议。它不提供可靠性,只是把应用程序传给IP层的数据报发送出去,但是不能保证它们能到达目的地。由于UDP在传输数据报前不用再客户和服务器之间建立一个连接,且没有超时重发等机制,所以传输速度很快。
https://blog.csdn.net/sifanchao/article/details/82285018

TCP与UDP区别总结:

1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接

2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付

3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的

UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等)

4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信

5、TCP首部开销20字节;UDP的首部开销小,只有8个字节
6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道

UDP应用场景:
1.面向数据报方式
2.网络数据大多为短消息
3.拥有大量Client
4.对数据安全性无特殊要求
5.网络负担非常重,但对响应速度要求高

https://www.cnblogs.com/williamjie/p/9390164.html

mysql把A表数据插入到B表数据的几种方法

https://www.cnblogs.com/superming/p/11780971.html

insert into insertTest2
(id,name)
select id,name
from insertTest
where not exists (select * from insertTest2
where insertTest2.id=insertTest.id);

http和https的区别

1、HTTPS 协议需要到 CA (Certificate Authority,证书颁发机构)申请证书,一般免费证书较少,因而需要一定费用。(以前的网易官网是http,而网易邮箱是 https 。)

2、HTTP 是超文本传输协议,信息是明文传输,HTTPS 则是具有安全性的 SSL 加密传输协议。

3、HTTP 和 HTTPS 使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。

4、HTTP 的连接很简单,是无状态的。HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议,比 HTTP 协议安全。(无状态的意思是其数据包的发送、传输和接收都是相互独立的。无连接的意思是指通信双方都不长久的维持对方的任何信息。)

HTTPS 的缺点(对比优点)

  • HTTPS 协议握手阶段比较费时,会使页面的加载时间延长近。
  • HTTPS 连接缓存不如 HTTP 高效,会增加数据开销,甚至已有的安全措施也会因此而受到影响。
  • HTTPS 协议的安全是有范围的,在黑客攻击、拒绝服务攻击和服务器劫持等方面几乎起不到什么作用。
  • SSL 证书通常需要绑定 IP,不能在同一 IP 上绑定多个域名,IPv4 资源不可能支撑这个消耗。
  • 成本增加。部署 HTTPS 后,因为 HTTPS 协议的工作要增加额外的计算资源消耗,例如 SSL 协议加密算法和 SSL交互次数将占用一定的计算资源和服务器成本。
  • HTTPS 协议的加密范围也比较有限。最关键的,SSL 证书的信用链体系并不安全,特别是在某些国家可以控制 CA根证书的情况下,中间人攻击一样可行。

HTTPs连接过程

① 客户端的浏览器向服务器发送请求,并传送客户端 SSL 协议的版本号,加密算法的种类,产生的随机数,以及其他服务器和客户端之间通讯所需要的各种信息。

② 服务器向客户端传送 SSL 协议的版本号,加密算法的种类,随机数以及其他相关信息,同时服务器还将向客户端传送自己的证书。

③ 客户端利用服务器传过来的信息验证服务器的合法性,服务器的合法性包括:证书是否过期,发行服务器证书的 CA 是否可靠,发行者证书的公钥能否正确解开服务器证书的 “发行者的数字签名”,服务器证书上的域名是否和服务器的实际域名相匹配。如果合法性验证没有通过,通讯将断开;如果合法性验证通过,将继续进行第四步。

④ 用户端随机产生一个用于通讯的 “对称密码”,然后用服务器的公钥(服务器的公钥从步骤②中的服务器的证书中获得)对其加密,然后将加密后的“预主密码”传给服务器。

⑤ 如果服务器要求客户的身份认证(在握手过程中为可选),用户可以建立一个随机数然后对其进行数据签名,将这个含有签名的随机数和客户自己的证书以及加密过的密钥一起传给服务器。

⑥ 如果服务器要求客户的身份认证,服务器必须检验客户证书和签名随机数的合法性,具体的合法性验证过程包括:客户的证书使用日期是否有效,为客户提供证书的 CA 是否可靠,发行 CA 的公钥能否正确解开客户证书的发行 CA 的数字签名,检查客户的证书是否在证书废止列表(CRL)中。检验如果没有通过,通讯立刻中断;如果验证通过,服务器将用自己的私钥解开加密的私钥,然后执行一系列步骤来产生主通讯密码(客户端也将通过同样的方法产生相同的主通讯密码)。

⑦ 服务器和客户端用相同的对称加密密钥,对称密钥用于 SSL 协议的安全数据通讯的加解密通讯。同时在 SSL 通讯过程中还要完成数据通讯的完整性,防止数据通讯中的任何变化。

⑧ 客户端向服务器端发出信息,指明后面的数据通讯将使用的步骤 ⑦ 中的主密码为对称密钥,同时通知服务器客户端的握手过程结束。

⑨ 服务器向客户端发出信息,指明后面的数据通讯将使用的步骤 ⑦ 中的主密码为对称密钥,同时通知客户端服务器端的握手过程结束。

⑩ SSL 的握手部分结束,SSL 安全通道的数据通讯开始,客户和服务器开始使用相同的对称密钥进行数据通讯,同时进行通讯完整性的检验。
https://blog.csdn.net/qq_38289815/article/details/80969419

Https介绍通信流程,数字证书和数字签名如何验证

Http常见问题

请求方法
post和get的区别
常用请求头部

计算机网络通信框架

七层
TCP/IP协议框架

DNS协议

成员无法按期完成任务怎么办

  • 无法按期完成任务原因分析: 任务安排不合理:
  • 多发生在对人员的能力理解不足,任务分解结构(WBS)不够细致,导致一些隐藏的需求没有在前期识别出来。
  • 对任务理解失误:多发生在项目人员刚刚加入项目,对项目了解不深导致任务理解有问题。
  • 任务技术难度大:任务的难度远远超出团队成员的现有能力范围。 人员能力不足:
  • 项目成员对完成任务的技术掌握不够,导致预估的时间跟实际的时间相差比较大。
  • 项目成员有消极心理:多发生在项目计划安排不合理,有多次返工或者范围蔓延的情景。团队成员对项目目标和进度持悲观的情况。
  • 团队中存在出工不出力的老油条: 团队成员仗着老资格,出工不出力。特别是IT行业对于任务的预估基本上是根据之前的经验来判断,没有有效的评判标准。

https://blog.csdn.net/bruesz/article/details/82699678

java基础

i++是否线程安全

volatile关键字

HashMap\HashTable\CurrentHashMap区别介绍

多态

多态是同一个行为具有多个不同表现形式或形态的能力。

多态就是同一个接口,使用不同的实例而执行不同操作

多态的优点

  1. 消除类型之间的耦合关系
  2. 可替换性
  3. 可扩充性
  4. 接口性
  5. 灵活性
  6. 简化性

多态存在的三个必要条件
继承
重写
父类引用指向子类对象

多态的实现方式
方式一:重写:
这个内容已经在上一章节详细讲过,就不再阐述,详细可访问:Java 重写(Override)与重载(Overload)。
方式二:接口
8. 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。

  1. java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。具体可以看 java接口 这一章节的内容。

方式三:抽象类和抽象方法

当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。

多态的好处:可以使程序有良好的扩展,并可以对所有类的对象进行通用处理。

https://www.runoob.com/java/java-polymorphism.html

接口

一个类只能继承一个父类,但是可以继承N个接口。

接口的目的是指明相关或者不相关类的多个对象的共同行为,跟抽象类很相似,可以说接口是更加抽象的抽象类。

接口体现了程序设计的多态和高内聚低耦合的设计思想。

Java 接口
接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。

接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

除非实现接口的类是抽象类,否则该类要定义接口中的所有方法。

接口无法被实例化,但是可以被实现。一个实现接口的类,必须实现接口内所描述的所有方法,否则就必须声明为抽象类。另外,在 Java 中,接口类型可用来声明一个变量,他们可以成为一个空指针,或是被绑定在一个以此接口实现的对象。

接口与类相似点:
一个接口可以有多个方法。
接口文件保存在 .java 结尾的文件中,文件名使用接口名。
接口的字节码文件保存在 .class 结尾的文件中。
接口相应的字节码文件必须在与包名称相匹配的目录结构中。

接口与类的区别:
接口不能用于实例化对象。
接口没有构造方法。
接口中所有的方法必须是抽象方法。
接口不能包含成员变量,除了 static 和 final 变量。
接口不是被类继承了,而是要被类实现。
接口支持多继承。

接口特性
接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 public abstract(只能是 public abstract,其他修饰符都会报错)。
接口中可以含有变量,但是接口中的变量会被隐式的指定为 public static final 变量(并且只能是 public,用 private 修饰会报编译错误)。
接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。

抽象类和接口的区别

  1. 抽象类中的方法可以有方法体,就是能实现方法的具体功能,但是接口中的方法不行。
  2. 抽象类中的成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的。
  3. 接口中不能含有静态代码块以及静态方法(用 static 修饰的方法),而抽象类是可以有静态代码块和静态方法。
  4. 一个类只能继承一个抽象类,而一个类却可以实现多个接口。
    https://www.runoob.com/java/java-interfaces.html

static关键字怎么用的

static是java中非常重要的一个关键字,而且它的用法也很丰富,主要有四种用法:

  • 用来修饰成员变量,将其变为类的成员,从而实现所有对象对于该成员的共享;
  • 用来修饰成员方法,将其变为类方法,可以直接使用“类名.方法名”的方式调用,常用于工具类;
  • 静态块用法,将多个类成员放在一起初始化,使得程序更加规整,其中理解对象的初始化过程非常关键;
  • 静态导包用法,将类的方法直接导入到当前类中,从而直接使用“方法名”即可调用类方法,更加方便。

https://blog.csdn.net/shuyizhi/article/details/79700054

final关键字

final关键字是我们经常使用的关键字之一,它的用法有很多,但是并不是每一种用法都值得我们去广泛使用。它的主要用法有以下四种:

  • 用来修饰数据,包括成员变量和局部变量,该变量只能被赋值一次且它的值无法被改变。对于成员变量来讲,我们必须在声明时或者构造方法中对它赋值;
  • 用来修饰方法参数,表示在变量的生存期中它的值不能被改变;
  • 修饰方法,表示该方法无法被重写;
  • 修饰类,表示该类无法被继承

https://blog.csdn.net/u010938610/article/details/81511839

final有哪些用法
final也是很多面试喜欢问的地方,能回答下以下三点就不错了:
1.被final修饰的类不可以被继承
2.被final修饰的方法不可以被重写
3.被final修饰的变量不可以被改变。如果修饰引用,那么表示引用不可变,引用指向的内容可变。
4.被final修饰的方法,JVM会尝试将其内联,以提高运行效率
5.被final修饰的常量,在编译阶段会存入常量池中。

回答出编译器对final域要遵守的两个重排序规则更好:
1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

link

堆和栈的区别

1.栈内存存储的是局部变量而堆内存存储的是实体;

2.栈内存的更新速度要快于堆内存,因为局部变量的生命周期很短;

3.栈内存存放的变量生命周期一旦结束就会被释放,而堆内存存放的实体会被垃圾回收机制不定时的回收。

https://blog.csdn.net/pt666/article/details/70876410

java垃圾回收机制

垃圾回收算法需要做的基本事情:

  • 发现无用对象
  • 回收被无用对象占用的内存空间,使该空间可被程序再次使用

Java 中可作为 GC Root 的对象

  • 虚拟机栈中引用的对象(本地变量表)
  • 方法区中静态属性引用的对象
  • 方法区中常量引用的对象
  • 本地方法栈中引用的对象(Native对象)

垃圾收集算法

  • 标记-清除(Mark-Sweep)算法:不需要移动对象,但是存在较严重的问题:
    -算法过程需要暂停整个应用,效率不高
    标记清除后会产生大量不连续的内存碎片,碎片太多可能会导致后续过程中需要为大对象分配空间时无法找到足够的空间而提前触发新的一次垃圾收集动作。

  • 标记-复制(Copying)算法:复制算法将可用内存分为两块,每次只用其中一块,当这一块内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已经使用过的内存空间一次性清理掉。
    优点:实现简单,不易产生内存碎片,每次只需要对半个区进行内存回收。
    缺点:内存空间缩减为原来的一半;算法的效率和存活对象的数目有关,存活对象越多,效率越低。

  • 标记-整理(Mark-Compact)算法:该算法标记阶段和“标志-清除”算法一样,但是在完成标记之后,它不是直接清理可回收对象,而是将存活对象都向一端移动,然后清理掉端边界以外的内存。

  • 分代收集(Generational Collection)算法:据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。

垃圾收集器(GC)
新生代收集器使用的收集器:Serial、ParNew 、Parallel Scavenge。
老年代收集器使用的收集器:Serial Old、Parallel Old、CMS。

  • Serial 收集器(复制算法)
    新生代单线程收集器,标记和清理都是单线程,优点是简单高效。

  • Serial Old收集器(标记-整理算法) 老年代单线程收集器,Serial 收集器的老年代版本。

  • ParNew 收集器(停止-复制算法)   新生代收集器,可以认为是 Serial 收集器的多线程版本,在多核 CPU 环境下有着比
    Serial 更好的表现。

  • Parallel Scavenge 收集器(停止-复制算法) 并行收集器,追求高吞吐量,高效利用 CPU。吞吐量一般为 99%, 吞吐量
    = 用户线程时间 / (用户线程时间 + GC线程时间)。适合后台应用等对交互相应要求不高的场景。

  • Parallel Old 收集器(停止-复制算法) Parallel Scavenge 收集器的老年代版本,并行收集器,吞吐量优先。

  • CMS(Concurrent Mark Sweep) 收集器(标记-清理算法) 高并发、低停顿,追求最短 GC 回收停顿时间,cpu
    占用比较高,响应时间快,停顿时间短,多核 cpu 追求高响应时间的选择。

四种引用状态

  • 强引用
    代码中普遍存在的类似"Object obj = new Object()"这类的引用,只要强引用还存在,垃圾收集器永远不会回收掉被引用的对象。
  • 软引用
    描述有些还有用但并非必需的对象。在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。Java 中的类 SoftReference 表示软引用。
  • 弱引用
    描述非必需对象。被弱引用关联的对象只能生存到下一次垃圾回收之前,垃圾收集器工作之后,无论当前内存是否足够,都会回收掉只被弱引用关联的对象。Java 中的类 WeakReference 表示弱引用。
  • 虚引用
    这个引用存在的唯一目的就是在这个对象被收集器回收时收到一个系统通知,被虚引用关联的对象,和其生存时间完全没关系。Java 中的类 PhantomReference 表示虚引用。

作者:安静的蓝孩子
链接:https://www.jianshu.com/p/b78ac4bf13ae
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

参考

创建一个对象的流程

OOM原因以及预防解决方案

进程和线程的区别

进程
一个在内存中运行的应用程序。每个进程都有自己独立的一块内存空间,一个进程可以有多个线程
线程
进程中的一个执行任务(控制单元),负责当前进程中程序的执行。一个进程至少有一个线程,一个进程可以运行多个线程,多个线程可共享数据。

与进程不同的是同类的多个线程共享进程的堆和方法区资源,但每个线程有自己的程序计数器、虚拟机栈和本地方法栈,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。
https://blog.csdn.net/ThinkWon/article/details/102021274

常见的安全性测试

https://www.jianshu.com/p/7a2cc286a937

异常测试

https://blog.csdn.net/wxyy7523/article/details/86761149

创建线程

https://blog.csdn.net/m0_37840000/article/details/79756932

进程间通信,通信方法,本地最快的是什么方法

共享内存原理介绍

java通信中解析json文件用到哪些类

测试用例

  1. 几个测试用例分析链接
    1、如果京东有一个购物网页给你,你要怎么进行测试?测试哪些主要功能?
    2、针对添加购物车这个测试点说一下你要怎么测试“添加购物车”
    3、网上银行转账是怎么测的,设计一下测试用例。
  2. 购物车模块该如何测试link
  3. 12306功能测试
  4. 微信抢红包
    link1
    这个全一点
  5. 微信朋友圈
  6. 直播弹幕设计用例
  7. 微博热搜

5

数据库锁

数据库锁机制–行级锁(悲观锁与乐观锁)与表级锁

数据库高并发处理

高并发处理6种方法
订单时常出现重复支付
如何避免下重复订单添加链接描述

登陆失败的可能原因有哪些

登陆功能如何保证用户信息安全

客户端与服务器端的通信协议是什么

软件测试开发的理解,对这个行业的理解

软件测试流程,项目流程

印象最深的项目,做了什么,遇到什么问题怎么解决,有什么收获,项目用什么数据库,为什么用这个

最有成就感的一件事

我的优点是什么,我的缺点是什么,我为什么能胜任这个职位

未来规划

为什么想做软件测试

java集合哪些实现类可以线程安全且高效

JVM介绍一下

多线程介绍

实习做了什么,有什么贡献,收获了什么,为什么没有留下

有什么优势要补充吗

毕业设计介绍,如何处理数据

app上线后遇到什么问题怎么解决

如何保证代码质量

开发过程中有制造什么大bug吗,怎么解决的,如何杜绝

遇到的算法题

1、找最长子序列
2、青蛙跳
3、判断两个字符串的字符种类和相应数量是否相等
4、输入n,输出nn的数组,顺时针放入数字1、2、、、、nn
5、判断一个链表有环

数据库代码

1、创建一个表,提供了字段

android 遇到的问题

通信框架

android列表框架,RecycleView和ListView区别

  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值