Skip to content

Commit

Permalink
新增内容
Browse files Browse the repository at this point in the history
  • Loading branch information
amosnothing committed Jan 22, 2021
1 parent d17f4e5 commit bab1dd0
Show file tree
Hide file tree
Showing 5 changed files with 224 additions and 31 deletions.
22 changes: 11 additions & 11 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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) - 待添加
Binary file added images/CMS流程.webp
Binary file not shown.
109 changes: 91 additions & 18 deletions posts/Java相关.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Java面试题

一般而言,如果是面试的测试开发岗位,或者测试自动化岗位,可能会根据你简历上面的项目经历提问有关 Java 的问题;如果不是上述岗位可以不用深究,稍微看一下即可。

## 面向对象三特征

1. 继承:继承是使用已存在的类作为基础--建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能,但不能选择性地继承父类。通过使用继承我们能够非常方便地复用以前的代码,能够大大的提高开发的效率
Expand Down Expand Up @@ -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的区别?

==:基础数据类型比较数值是否相等;而引用类型比较的是两者的地址是否一样
Expand Down Expand Up @@ -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()方法。
Expand Down Expand Up @@ -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:+/-\<option>: +表示启用该选项,-表示关闭该选项
2. 数值型:-XX:\<option>=\<number>:给选项设置一个数字类型的值
3. 字符串型:-XX:\<option>=\<string>:给选项设置一个字符串类型值,通常用于制定一个文件,路径或者一系列命令列表

参数示例:-Xmx4g –Xms4g –Xmn1200m –Xss512k -XX:NewRatio=4 -XX:SurvivorRatio=8 -XX:PermSize=100m -XX:MaxPermSize=256m -XX:MaxTenuringThreshold=15

-Xmx4g:设置堆内存最大值为 4g

-Xms4g:设置堆内存初始值为 4g

-Xmn1200m:设置年轻代大小为 1200MB;SUN 官方建议配置为整个堆内存大小的3/8

-Xss512k:设置每个线程的堆栈大小。JDK5.0以后每个线程堆栈大小为 1MB,以前每个线程堆栈大小为 256K。应根据应用程序所需内存大小进行调整。在相同物理内存下,减少这个值能生成更多的线程,但是操作系统对一个进程内线程的数量是有限制的,经验值是 3000~5000 个。

-XX:NewRatio=4:设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRatio=8:设置年轻代中Eden区与Survivor区的大小比值。设置为8,则两个Survivor区与一个Eden区的比值为2:8,一个Survivor区占整个年轻代的1/10

-XX:PermSize=100m:初始化永久代大小为100MB。

-XX:MaxPermSize=256m:设置持久代大小为256MB。

-XX:MaxTenuringThreshold=15:设置垃圾最大年龄。如果设置为0的话,则年轻代对象不经过Survivor区,直接进入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代即被回收的概率。
35 changes: 35 additions & 0 deletions posts/操作系统.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,23 @@

## 列出超过10个Linux常用的命令以及其作用?

- cd: 切换目录
- ls: 查看当前目录下文件和子目录
- ll: 等价于 ls -l
- grep: 常用于分析一行的信息,多用于管道命令中,将命令的输出进行筛选
- find: 指定目录,在该目录里查找目标,可以根据权限,名字,或者容量大小等查询
- cp: 复制命令,将源文件复制到目标目录
- mv: 移动命令,移动文件,目录或者改名
- rm: 删除命令,删除文件或者删除目录,慎用
- ps: 输出当前时间节点进程的运行情况
- kill: 结束某个进程
- cat: 输出文本文件的所有内容,可以和 more 或者 less 结合使用
- chgrp: 改变文件所属用户组
- chown: 改变文件的所有者
- chmod: 改变文件的权限
- tail: 输出文本文件末尾10行的信息,常用于日志动态查看: tail -f log.txt
- vi/vim: 文本编辑器,可用模式:命令模式,输入模式,底线命令模式

## 进程和线程是什么?它们有什么区别和联系?

|差别|进程|线程|
Expand All @@ -10,3 +27,21 @@
|角色|系统资源分配的单位|系统调度的单位|
|资源|不同进程资源不能共享|共享同一个进程地址空间和其他资源<br>线程有自己的栈和栈指针,程序计数器等寄存器|
|独立性|独立的地址空间|必须依赖进程而存在|

## linux 进程之间通信方式

- 管道,流管道,有名管道
- 信号
- 消息队列
- 共享内存
- 信号量
- 套接字

参考《[Linux进程间通信的几种方式总结--linux内核剖析(七)](https://blog.csdn.net/gatieme/article/details/50908749)

## 软连接,硬连接区别

inode: 存储文件元信息的区域就叫做 inode,中文名译作“索引节点”

- 硬连接:与普通文件没有什么不同,inode 都指向同一个文件在硬盘中的区块,删除文件的硬连接也会删除该文件本身(注意:如果该文件有多个硬连接,只有删除最后一个硬连接才会把源文件给删除)
- 软连接:保存了其代表文件的绝对路径,在硬盘上有独立的区块,访问时替代自身路径,删除软连接不会删除文件本身,类似 windows 系统的快捷方式
Loading

0 comments on commit bab1dd0

Please sign in to comment.