1、CMS与stop-the-world
STOP THE WORLD
stop the world意味着从应用中停下来并进入到GC过程中去,一旦stop-the-world发生,除了GC所需要的线程外,其他线程都将停止工作,中断了的线程直到GC任务结束才继续它们的任务。
CMS收集器是一种以获取最短回收停顿时间为目标的收集器,CMS收集器是基于“”标记–清除”(Mark-Sweep)算法实现的,整个过程分为四个步骤:
- ①、初始标记,会引起stop-the-world,只标注对象是否到GC-Roots存在引用链,速度很快。
- ②、并发标记,收集垃圾和用户线程一起执行。
- ③、预清理,GC线程与用户线程一起执行。
- ④、可被终止的预清理,GC线程与用户线程一起执行。
- ⑤、重新标记,为了检测在上述几个步骤过程中产生新的可回收对象,会导致stop-the-world
- ⑥、并发清除,GC线程与用户线程一起执行。
推荐阅读:
图解 CMS 垃圾回收机制原理,-阿里面试题
2、http状态码
分类 | 描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 操作被成功接受并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生错误 |
http状态码详解
状态码 | 含义 | 描述 |
---|---|---|
100 | 继续 | 初始的请求已接受,请客户端继续发送剩余的部分 |
101 | 切换协议 | 服务器根据客户端的请求切换协议,但只能切换更高级的协议 |
200 | OK | 一般用于GET和POST请求 |
202 | Accepted | 服务端已接受请求,但尚未处理完成 |
204 | No Content | 服务器已经处理完了请求,但无内容返回 |
301 | Moved Permanently | 永久移动,请求的资源已被永久的移动到新的URI,返回信息会包含新的URI,浏览器会自动定向到新的URI |
302 | Found | 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI |
400 | Bad Request | 客户端请求有语法错误,服务端无法解析 |
403 | Forbidden | 服务器理解请求客户端的请求,但是拒绝执行此请求 |
404 | Not Found | 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 |
500 | Internal Server Error | 服务器内部错误 |
502 | Bad Gateway | 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 |
503 | Service Unavailable | 服务器目前无法使用 |
504 | Gateway Time-out | 超时 |
3、进程的调度算法
- ①、先来先服务
- ②、时间片轮转算法
- ③、最短作业优先
- ④、最短剩余时间优先
- ⑤、最高相应比优先,R=(w+s)/s (R为响应比,w为等待处理的时间,s为预计的服务时间)
4、redis集群(主从)脑裂及解决方案
redis的集群脑裂是指因为网络问题,导致redis master节点跟redis slave节点和sentinel集群处于不同的网络分区,此时因为sentinel集群无法感知到master的存在,所以将slave节点提升为master节点。此时存在两个不同的master节点,就像一个大脑分裂成了两个。
集群脑裂问题中,如果客户端还在基于原来的master节点继续写入数据,那么新的master节点将无法同步这些数据,当网络问题解决之后,sentinel集群将原先的master节点降为slave节点,此时再从新的master中同步数据,将会造成大量的数据丢失。
解决方案
redis的配置文件中,存在两个参数
min-slaves-to-write 3
min-slaves-max-lag 10
第一个参数表示连接到master的最少slave数量
第二个参数表示slave连接到master的最大延迟时间
按照上面的配置,要求至少3个slave节点,且数据复制和同步的延迟不能超过10秒,否则的话master就会拒绝写请求,配置了这两个参数之后,如果发生集群脑裂,原先的master节点接收到客户端的写入请求会拒绝,就可以减少数据同步之后的数据丢失。
注意:较新版本的redis.conf文件中的参数变成了
min-replicas-to-write 3
min-replicas-max-lag 10
5、JVM类加载为什么要使用双亲委派
在Java中任何一个类都需要加载他的类加载器和这个类本身一起确定在虚拟机中的唯一性,也就是说判定两个类是否相等需要两个类的类加载器和两个类都相等才行。
以Object类为例,基于双亲委派模型,Java中的基础类经过层层传递都会被Java中的启动类加载器所响应。这样Object类也就只有一个,如果不采用双亲委派模型,我们自定义一个Object类放在classpath下,我们自定义的这个Object类是被系统类加载器加载的,此时就会存在两个Object类,系统就裂了。
双亲委派模型的好处:
- 主要是为了安全性,避免用户自己编写的类动态替换JAVA的一些核心类,比如String。
- 同时也避免了类的重复加载,因为JVM中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类。