川石教育
全国咨询热线:136-9172-9932
  1. 首页 > 资讯与干货 > 常见问题

面试宝典|2021性能测试经典面试题(三)

作者:川石学院 日期:2021-08-15 13:43:09 点击数:

  上一期我们公布了性能测试经典面试题的第一部分第二部分,本期我们继续更新性能测试经典面试题的第三部分。

  51、GC回收的流程

  运行时有新的对象时,就会涉及到内在空间的使用问题,正常每个栈内存为4k,每个堆内存8k。

  GC回收时一般是按以下流程进行:

  •   a、判断Eden区是否有内存空间,如果此时有内存空间,则直接将新对象保存在伊甸园区。

  •   b、如果伊甸园区内存不足,那么会自动执行Minor GC回收 操作,将伊甸园区的无用内存空间进行清理,Minor GC的清理范围只在Eden园区,清理之后会继续判断Eden园区的内存空间是否充足?如果内存空间充足,则将新对象直接在Eden园区进行空间分配。

  •   c、如果Minor GC回收后伊甸园区的内存空间依然不足,则会判断存活区的空间,如果存活区还有剩余空间,那么会将Eden区部分活跃对象保存在存活区,随后继续判断Eden区的内存空间是否充足,如果内存充足怎则将新对象直接在Eden园区进行空间分配。

  •   d、如果存活区没有内存空间,则继续判断老年区。则将部分存活对象保存在老年代,而后存活区将有空余空间。

  •   e、如果老年代也满了,那么将产生Major GC(Full GC)回收,将进行老年代的清理

  •   f、如果老年代执行Full GC之后,无法进行对象的保存,则会产生OOM异常,OutOfMemoryError异常。

  52:JVM常见调优参数

  -Xms:初始堆大小

  -Xmx:最大堆大小 初始堆大小一般会设置为与最大堆大小一至,对于32位的操作一般-Xmx设置为1.5G-2.5G即可,如果是64位的操作系统,一般不做限制。 -XX:NewSize=n:设置年轻代大小 -XX:MaxNewSize设置新生代最大空间大小 -XX:NewRatio=n:设置年轻代和年老代的比值。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 -XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 -XX:MaxPermSize=n:设置持久代大小 -Xss:设置每个线程的堆大小总内存大小: Max memory = [-Xmx] + [-XX:MaxPermSize] + number_of_threads * [-Xss]

  53:JVM中内存为何分代

  通过分代可以更好的处理内存的使用以及内存的回收。

  54:如何判断一个对象是否应该被回收

  通常出现以下情况时,可以将这具对象回收:

  •   a、该对象没有与GC Roots相连

  •   b、该对象没有重写finalize()方法或finalize()已经被执行过则直接回收(第一次标记)、否则将对象加入

  到F-Queue队列中(优先级很低的队列)在这里finalize()方法被执行,之后进行第二次标记,如果对象

  仍然应该被GC则GC,否则移除队列。

  55:回收方法区回收对象

  方法区回收价值比较低,主要回收废弃的常量和无用的类。

  如何判断无效类:

  a、该类所有实例都被回收(Java堆中没有该类的对象)

  b、加载该类的ClassLoader已经被回收

  c、该类对应的java.lang.Class对象没有在任何地方被引用,无法在任何地方利用反射访问该类

  56:垃圾收集算法有哪些

  常见的垃圾收集算法有以下几种:

  •   a、标记 -清除算法,“标记-清除”(Mark-Sweep)算法,如它的名字一样,算法分为“标记”和“清除”两个阶段:首先标记出所有需要回收的对象,在标记完成后统一回收掉所有被标记的对象。

  •   b、复制算法,“复制”(Copying)的收集算法,它将可用内存按容量划分为大小相等的两块,每次只使用其中的一块。当这一块的内存用完了,就将还存活着的对象复制到另外一块上面,然后再把已使用过的内存空间一次清理掉。

  •   c、标记-压缩算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象进行清理,而是让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存

  •   d、分代收集算法,“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法。

  常用的垃圾回收器一般都采用分代收集算法。

  57:常见的垃圾回收器有哪些

  常见的垃圾回收器主要包括以下几种:

  1)串行:垃圾回收器 (Serial Garbage Collector)

  Serial收集器,串行收集器是最古老,最稳定以及效率高的收集器,可能会产生较长的停顿,只使用一个线程去回收。

  2)串行:ParNew收集器

  ParNew收集器,ParNew收集器其实就是Serial收集器的多线程版本。

  3)并行:Parallel收集器

  Parallel收集器,Parallel Scavenge收集器类似ParNew收集器,Parallel收集器更关注系统的吞吐量。

  4)并行:Parallel Old 收集器

  Parallel Old 收集器,Parallel Old是Parallel Scavenge收集器的老年代版本,使用多线程和“标记-整理”算法

  5)并发标记扫描CMS收集器

  CMS收集器,CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。

  6)G1收集器

  G1收集器,G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征

  面试宝典|2021性能测试经典面试题(三)(图1)

  58:类加载过程

  面试宝典|2021性能测试经典面试题(三)(图2)

  59:如何找到JVM中最大可使用内存

  Runtime类的freeMemory、totalMemory、maxMemory三个方法反映的都是java这个进程的内存情况,跟操作系统的内存有关系。

  a、maxMemory()方法

  获取java虚拟机可以从操作系统得到的最大的内存,以字节为单位。

  如果在运行java程序的时候,没有添加-Xmx参数,那么就是64MB,即maxMemory()返回的大约是64*1024*1024字节,这是java虚拟机默认情况下从操作系统获取的最大内存。如果添加了-Xmx参数,将以这个参数后面的值为准,例如java -cp ClassPath -Xmx512m ClassName,那么最大内存就是512x1024x1024字节。

  b、totalMemory()方法

  获取java虚拟机现在已经从操作系统挖过来的内存大小,即java虚拟机这个进程当时所占用的所有内存。如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里获取的,基本上是用多少挖多少,直挖到maxMemory()为止,所以totalMemory()是慢慢增大的。如果用了-Xms参数,程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,然后在这些内存用的差不多的时候,再去挖。

  c、freeMemory()方法

  获取JVM已经挖到但是还没有占用的内存大小,如果在运行java的时候没有添加-Xms参数,那么,在java程序运行的过程的,内存总是慢慢的从操作系统那里挖的,基本上是用多少挖多少,但是java虚拟机100%的情况下是会稍微多挖一点的,这些挖过来而又没有用上的内存,实际上就是freeMemory(),所以freeMemory()的值一般情况下都是很小的,但是如果你在运行java程序的时候使用了-Xms,这个时候因为程序在启动的时候就会无条件的从操作系统中挖-Xms后面定义的内存数,这个时候,挖过来的内存可能大部分没用上,所以这个时候freeMemory()可能会有些大。

  60:如何通过不同于80的端口开启Nginx?

  为了通过一个不同的端口开启Nginx ,你必须进入/etc/Nginx/sites-enabled/ ,如果这是默认文

  件,那么你必须打开名为“default” 的文件。编辑文件,并放置在你想要的端口:

  61:如何监控nginx服务器

  通常有两种方法可以监控:status和ngxtop两种监控方法。

  62:nginx中主进程与工作进程区别

  •   主进程:主要是配置和维护工作进程

  •   工作进程:主要是处理实际请求的进程

  63:ngx_http_upstream_module作用

  ngx_http_upstream_module用于定义可通过fastcgi传递、proxy传递、uwsgi传递、memcached传递和scgi传递指令来引用的服务器组。

  64:nginx中什么是C10K问题

  Like server 1 { listen 81; }

  C10K问题是指无法同时处理大量客户端(10,000)的网络套接字。

  65:Nginx是否支持将请求压缩到上游

  可以使用Nginx模块gunzip将请求压缩到上游。gunzip模块是一个过滤器,它可以对不支持“gzip”编码

  方法的客户机或服务器使用“内容编码:gzip”来解压缩响应。

  66:Nginx如何配置负载均衡

  在HTTP上下文中声明一个upstream指令

  •   #scshop只是一个名字的代号,可以随便写

  •   upstream ecshop {

  •   server 192.168.40.135:8081;

  •   server 192.168.40.129:80;

  •   }

  •   在server上下文中声明调用分发的upstream指令

  •   location / {

  •   root html;

  •   #下面这行代码是通过proxy_pass指令将客户端访问我们的请求分发到其它服务器上

  •   #http后面的ecshop应该也upstream后面ecshop一至

  •   proxy_pass http://ecshop;

  •   index index.php index.html index.htm;

  •   }

  67:Nginx负载均衡算法

  ginx负载均衡的算法通常包括:轮询、最少连接数、ip哈希、通用哈希、最少时间和随机

  68:HTTP协议的接口性能如何做

  HTTP协议接口性能通常用两个函数来实现:web_submit_data函数和web_custom_request函数

  69:类unix操作系统怎么监控系统资源

  关于unix操作系统监控的工具也很多,我们平常用的最多的是nmon工具

  70:CPU的工作原理

  面试宝典|2021性能测试经典面试题(三)(图3)

  71:CPU监控工具

  top、vmstat、sar、ps、iostat等

  72:CPU是否到达瓶颈的指标

  关于分析CPU是否到达瓶颈的指标如下:

  1.   队列长度直观的反应CPU是否存在瓶颈

  2.   CPU的使用率,建议阀值一般不超过85%

  3.   热密集应用程序,找出消耗CPU资源最多的进程

  4.   wa的值建议阀值不超过25%,否则表示磁盘不平衡

  73:VMM工作原理

  面试宝典|2021性能测试经典面试题(三)(图4)

  74:VMM阀值

  VMM有两个阀值:

  •   minfree:

  --->空闲列表中可接受的实内存页面帧的最小数量,当空闲列表的大小低于这个数时,VMM开始替换页

  面,它持续窃取页面,直到空闲列表的大小达到maxfree。

  •   maxfree:

  --->通过VMM页面替换空闲列表可达到的最大大小,当进程终止并释放它们的工作段页面或删除其页面

  在内存中的文件时,结果是空闲列表的大小可能会超过这个数。

  75:内存是否到达瓶颈的指标

  关于内存监控的主要指标:

  •   内存的使用率,一般阀值不超过85%,但即使超过85%也不能完全判断内存是不够用的

  •   swap的使用,一般swap的使用都为零,如果大于零,说明RAM不够

  •   pi与po的值,如果pi和po的值一直很小或者为0说明内存有问题

  •   监控每个进程所消耗的内存值

  •   RSS显示为每个进程所消耗的实内存

  •   CPU上下文切换次数

  本期的性能测试面试题以及答案的第三部分就到这里,下期继续更新第四部分,记得关注我们哟。


相关文章
  • 亚马逊运营成功转行软件测试,薪资13K表示很满意!2021-08-15 13:43:09
  • 西安川石的兰朋友喊你来当他的学弟学妹啦!2021-08-15 13:43:09
  • 国外的月亮也不一定比国内测试猿的年薪美~2021-08-15 13:43:09
  • 建筑工程专业朱同学成功转行为软件测试人!2021-08-15 13:43:09
  • 财务管理专业转行软件测试月薪甩会计几条街!2021-08-15 13:43:09
  • 只有技术沉淀才能成功上岸,深圳就业薪资13K!2021-08-15 13:43:09
  • 薪资11K!实现自我价值,从掌握一门IT技术开始...2021-08-15 13:43:09
  • 文科生转行软件测试照样拿下高薪15K!2021-08-15 13:43:09
  • 恭喜罗同学喜提19.5K,成功入行软件测试!2021-08-15 13:43:09
  • 毕业1年,迷茫的他最终选择转行软件测试2021-08-15 13:43:09