diff --git a/README.md b/README.md index 0bf99b1..afc78f8 100644 --- a/README.md +++ b/README.md @@ -2,14 +2,14 @@ 本文收录软件测试面试过程中常见的面试题。一些问题是从网上搜罗而来,剔除了不合时宜的;一些则是自己总结的面试题。很多的问题是开放性的,并没有确切的标准答案。 -[基础知识](posts/基础知识.md) -[测试用例设计](posts/测试用例设计.md) -[性能测试](posts/性能测试.md) -[安全测试](posts/安全测试.md) -[自动化测试](posts/自动化测试.md) -[测试管理](posts/测试管理.md) -[操作系统](posts/操作系统.md) -[数据库](posts/数据库.md) -[Java相关](posts/Java相关.md) -[算法](posts/算法.md) - 待添加 -[中间件](posts/中间件.md) - 待添加 +- [基础知识](posts/基础知识.md) +- [测试用例设计](posts/测试用例设计.md) +- [性能测试](posts/性能测试.md) +- [安全测试](posts/安全测试.md) +- [自动化测试](posts/自动化测试.md) +- [测试管理](posts/测试管理.md) +- [操作系统](posts/操作系统.md) +- [数据库](posts/数据库.md) +- [Java相关](posts/Java相关.md) +- [算法](posts/算法.md) - 待添加 +- [中间件](posts/中间件.md) - 待添加 diff --git "a/images/CMS\346\265\201\347\250\213.webp" "b/images/CMS\346\265\201\347\250\213.webp" new file mode 100644 index 0000000..2a7381b Binary files /dev/null and "b/images/CMS\346\265\201\347\250\213.webp" differ diff --git "a/posts/Java\347\233\270\345\205\263.md" "b/posts/Java\347\233\270\345\205\263.md" index 636c4fb..a35f4bb 100644 --- "a/posts/Java\347\233\270\345\205\263.md" +++ "b/posts/Java\347\233\270\345\205\263.md" @@ -1,5 +1,7 @@ # Java面试题 +一般而言,如果是面试的测试开发岗位,或者测试自动化岗位,可能会根据你简历上面的项目经历提问有关 Java 的问题;如果不是上述岗位可以不用深究,稍微看一下即可。 + ## 面向对象三特征 1. 继承:继承是使用已存在的类作为基础--建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率 @@ -63,19 +65,6 @@ Queue:队列,先进先出 使用场合:读多用A,增删多用L -## 内存溢出是怎么回事?请举几个可能出现内存溢出的场景? - -![JVM内存分布](images/JVM内存分布.png) - -`内存溢出`(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。 - -内存溢出场景: - -1. 堆内存溢出:启动JVM时,堆内存最大内存配置比较小,在对象初始化的时候,超过堆内存最大值(本来应该将对象放置于新生代,但是由于新生代内存不够放),导致堆内存溢出 -2. 堆内存泄露:正常情况下,对象如果没有被root路径引用,则会被GC,但是由于错误的引用而导致某些对象无法被GC,而无限期存在堆内存中 -3. 栈内存溢出:线程都有自己私有的栈,每一个方法都会在栈内创建栈帧,若是方法存在递归,则会导致栈顶部生成新的栈帧,从而可能导致栈内存溢出 -4. 直接内存溢出:非JVM内部内存,在程序内不断分配直接内存,而并未正常回收时会导致该问题 - ## ==和equals的区别? ==:基础数据类型比较数值是否相等;而引用类型比较的是两者的地址是否一样 @@ -112,9 +101,11 @@ char|2|16 - `boolean类型`被编译为int类型,等于是说JVM里占用字节和int完全一样,int是4个字节,于是boolean也是4字节 - `boolean数组`在Oracle的JVM中,编码为byte数组,每个boolean元素占用8位=1字节 +参考《[Java中boolean类型占几个字节,你知道吗?](https://amoschen.blog.csdn.net/article/details/97377833)》 + ## 创建一个类的实例都有哪些办法? -1. 用new 语句创建对象,这是最常用的创建对象方法 +1. 用 new 语句创建对象,这是最常用的创建对象方法 2. 运用反射手段,调用Java.lang.Class或者java.lang.reflect.Constructor类的newInstance()实例方法 3. 调用对象的clone()方法 4. 运用反序列化手段,调用java.io.ObjectInputStream对象的readObject()方法。 @@ -148,18 +139,100 @@ StringBuffer/StringBuilder:可变对象,前者线程安全,后者线程不 作者:9龙 链接:https://juejin.cn/post/6844903848167866375 -## JVM +## 内存溢出是怎么回事?请举几个可能出现内存溢出的场景? + +![JVM内存分布](images/JVM内存分布.png) + +`内存溢出`(Out Of Memory,简称OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。 + +内存溢出场景: + +1. 堆内存溢出:启动JVM时,堆内存最大内存配置比较小,在对象初始化的时候,超过堆内存最大值(本来应该将对象放置于新生代,但是由于新生代内存不够放),导致堆内存溢出 +2. 堆内存泄露:正常情况下,对象如果没有被root路径引用,则会被GC,但是由于错误的引用而导致某些对象无法被GC,而无限期存在堆内存中 +3. 栈内存溢出:线程都有自己私有的栈,每一个方法都会在栈内创建栈帧,若是方法存在递归,则会导致栈顶部生成新的栈帧,从而可能导致栈内存溢出 +4. 直接内存溢出:非JVM内部内存,在程序内不断分配直接内存,而并未正常回收时会导致该问题 ## JVM内存结构,为什么需要GC? -若不进行垃圾回收,则回导致内存溢出,是的系统无法正常运作 +内存结构参考上一个题目。 + +随着程序的运行,内存中的实例对象、变量等占据的内存越来越多,如果不及时进行回收,会降低程序运行效率,甚至引发系统异常。 + +## JVM的垃圾算法有哪几种? + +- 串行(Serial)回收器是单线程的一个回收器,简单、易实现、效率高。 +- 并行(ParNew)回收器是Serial的多线程版,可以充分的利用CPU资源,减少回收的时间。 +- 吞吐量优先(Parallel Scavenge)回收器,侧重于吞吐量的控制。 +- 并发标记清除(CMS,Concurrent Mark Sweep)回收器是一种以获取最短回收停顿时间为目标的回收器,该回收器是基于“标记-清除”算法实现的。 + +## CMS垃圾回收的基本流程? + +- 初始标记(CMS-initial-mark),会导致stop-the-world; +- 并发标记(CMS-concurrent-mark),与用户线程同时运行; +- 预清理(CMS-concurrent-preclean),与用户线程同时运行; +- 可被终止的预清理(CMS-concurrent-abortable-preclean) 与用户线程同时运行; +- 重新标记(CMS-remark) ,会导致swt; +- 并发清除(CMS-concurrent-sweep),与用户线程同时运行; +- 并发重置状态等待下次CMS的触发(CMS-concurrent-reset),与用户线程同时运行; + +其运行流程图如下所示: -## JVM堆的基本结构 +![CMS垃圾回收流程](images/CMS流程.webp) -## JVM的垃圾算法有哪几种?CMS垃圾回收的基本流程? +参考《[CMS垃圾收集器](https://juejin.cn/post/6844903782107578382)》 ## JVM有哪些常用启动参数可以调整,描述几个? +|参数|描述| +|--|--| +|\-Xmx512m|设置最大堆内存| +|\-Xms512m|设置初始堆内存| +|\-Xmn256m|设置年轻代内存| +|\-XX:+PrintGC 或者-verbose:gc|开启简单GC日志| +|\-XX:+PrintGCDetails|开启详细GC日志| +|\-XX:+PrintGCDateStamps|打印GC日期时间| +|\-XX:+PrintGCTimeStamps|打印GC基准时间,基于应用启动时间偏移| +|\-Xloggc:gc.log|GC日志存放目录| +|\-XX:NewRatio=2|老年代与新生代的比值为2,老年代是新生代的2倍,默认值是2| +|\-XX:SurvivorRatio=8|eden代与suvivor代的比值,默认值是8| +|\-ea|设置jvm启用断言assert机制,默认是关的| + ## 如何查看JVM的内存使用情况? +- jconsole:简易的JVM可视化工具 + +- jvisualvm:功能更强大的JVM可视化工具 + +VisualVM简介 + +VisualVM 是一个工具,它提供了一个可视界面,用于查看 Java 虚拟机 (Java Virtual Machine, JVM) 上运行的基于 Java 技术的应用程序(Java 应用程序)的详细信息。VisualVM 对 Java Development Kit (JDK) 工具所检索的 JVM 软件相关数据进行组织,并通过一种使您可以快速查看有关多个 Java 应用程序的数据的方式提供该信息。您可以查看本地应用程序以及远程主机上运行的应用程序的相关数据。此外,还可以捕获有关 JVM 软件实例的数据,并将该数据保存到本地系统,以供后期查看或与其他用户共享。 + +参考《[VisualVM](https://visualvm.github.io/documentation.html)》 + ## 你常用的JVM配置和调优参数都有哪些?分别什么作用? + +\-XX 参数被称为不稳定参数,因为不同的设置很容易会引起 JVM 性能上的差异,使得 JVM 存在极大的不稳定性。 + +1. 布尔型:-XX:+/-\