面经整理(一)

(1)浏览器输入URL发生什么?

1.浏览器中输入网址
2.域名解析(DNS),找到IP服务器
3.发起TCP连接,HTTP三次握手,发送请求(Request)
4.服务器响应HTTP(Response)
5.浏览器下载资源 html css js images等
6.浏览器解析代码(如果服务器有gzip压缩,浏览器先解压)
7.浏览器渲染呈现给用户

(2)TCP & UDP

UDP协议和TCP协议都是传输层协议。

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

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

TCP三次握手过程

  1. 主机A通过向主机B 发送一个含有同步序列号标志位的数据段(SYN)给主机B ,向主机B 请求建立连接,通过这个数据段,主机A告诉主机B 两件事:我想要和你通信;你可以用哪个序列号作为起始数据段来回应我。
  2. 主机B 收到主机A的请求后,用一个带有确认应答(ACK)和同步序列号(SYN)标志位的数据段响应主机A,也告诉主机A两件事:我已经收到你的请求了,你可以传输数据了;你要用哪个序列号作为起始数据段来回应我。
  3. 主机A收到这个数据段后,再发送一个确认应答,确认已收到主机B 的数据段:“我已收到回复,我现在要开始传输实际数据了”。

这样3次握手就完成了,主机A和主机B 就可以传输数据了。

TCP四次挥手过程

  1. 当主机A完成数据传输后,将控制位FIN置1,提出停止TCP连接的请求。
  2. 主机B收到FIN后对其作出响应,确认这一方向上的TCP连接将关闭,将ACK置1。
  3. 由B 端再提出反方向的关闭请求,将FIN置1。
  4. 主机A对主机B的请求进行确认,将ACK置1,双方向的关闭结束。

 

(3)TCP 保证 可靠传输

1、序列号

2、确认应答

3、超时重传

4、拥塞控制

  1. 确认应答机制&序列号

    TCP将每个字节的数据都进行了编号,即为序列号。 
    每一个ACK都带有对应的确认序列号,意思是告诉发送者,我已经收到了哪些数据;;下一次你从哪里开始发。

  2. 超时重传&序列号

    主机A发送数据给B之后, 可能因为网络拥堵等原因, 数据无法到达主机B; 如果主机A在一个特定时间间隔内没有收到B发来的确认应答, 就会进行重发; 
    主机A未收到B发来的确认应答,也可能是因为ACK丢失了,因此主机B会收到很多重复数据.。那么TCP协议需要能够识别出那些包是重复的包,,并且把重复的丢弃掉.,这时候我们可以利用序列号, 就可以很容易做到去重的效果。

  3. 拥塞控制

    每次发送数据包的时候, 将拥塞窗口和接收端主机反馈的窗口大小做比较, 取较小的值作为实际发送的窗口。 
    拥塞控制, 归根结底是TCP协议想尽可能快的把数据传输给对方, 但是又要避免给网络造成太大压力的折中方案。

    提高传输效率:滑动窗口、流量控制、延迟应答、捎带应答

    滑动窗口机制

    1. 窗口大小指的是无需等待确认应答而可以继续发送数据的最大值.
    2. 发送窗口内字段的时候, 不需要等待任何ACK, 直接发送;
    3. 收到第一个ACK后, 滑动窗口向后移动, 继续发送下一个窗口字段的数据; 依次类推;
    4. 操作系统内核为了维护这个滑动窗口, 需要开辟发送缓冲区来记录当前还有哪些数据没有应答; 只有确认应答过的数据, 才能从缓冲区删掉;
    5. 窗口越大, 则网络的吞吐率就越高
    

    流量控制 
    接收端处理数据的速度是有限的. 如果发送端发的太快, 导致接收端的缓冲区被打满, 这个时候如果发送端继续发送, 就会造成丢包, 继而引起丢包重传等等一系列连锁反应。

    1.接收端将自己可以接收的缓冲区大小放入TCP首部中的 "窗口大小" 字段, 通过ACK端通知发送端; 
    2.窗口大小字段越大, 说明网络的吞吐量越⾼高; 
    3.接收端一旦发现自己的缓冲区快满了, 就会将窗口大小设置成一个更小的值通知给发送端; 
    4.发送端接受到这个窗口之后, 就会减慢自己的发送速度; 
    5.如果接收端缓冲区满了, 就会将窗口置为0; 这时发送⽅方不再发送数据, 但是需要定期发送一个窗口
    

    延迟应答 
    如果接收数据的主机立刻返回ACK应答, 这时候返回的窗口可能比较小. 
    窗口越大, 网络吞吐量就越大, 传输效率就越高. 我们的目标是在保证网络不拥塞的情况下尽量提高传输效率;

    捎带应答 
    在延迟应答的基础上, 我们发现, 很多情况下, 客户端服务器在应用层也是 “一发一收” 的. 
    意味着客户端给服务器说了 “How are you”, 服务器也会给客户端回一个 “Fine, thank you”; 那么这个时候ACK就可以搭顺风车, 和服务器回应的 “Fine, thank you” 一起回给客户端。

 4、树

      https://blog.csdn.net/qq_38873248/article/details/109721373

 5、栈

      https://blog.csdn.net/qq_38873248/article/details/109721260

6、JVM 内存模型

Java内存模型中规定了所有的变量都存储在主内存中,每条线程还有自己的工作内存(可以与前面将的处理器的高速缓存类比),线程的工作内存中保存了该线程使用到的变量到主内存副本拷贝,线程对变量的所有操作(读取、赋值)都必须在工作内存中进行,而不能直接读写主内存中的变量。不同线程之间无法直接访问对方工作内存中的变量,线程间变量值的传递均需要在主内存来完成、

7、常见的垃圾回收器

1. Stop-the-world

它是指 JVM 由于要执行 GC 而停止了应用程序的执行,并且这种情形会在任何一种 GC 算法中发生。当 Stop-the-world 发生时,除了 GC 的线程以外,其他的线程均处于等待的状态,直到 GC 任务完成。

实际上,很多 GC 优化都是通过减少 Stop-the-world 的时间来提高程序的性能。

1、serial/serial old

串行回收器,特点是单线程,独占式,适合单CPU,一般在客户端模式下使用。(实际一般是当做CMS的替补使用

2、paraller Scaven/paraller old

平行回收器,多线程,

回收依然出现stw

3、parNew

多线程垃圾回收器,与CMS进行配合。对于CMS而言,其本身回收老年代,与之配对的新生代垃圾回收器有Serial与ParNew可选。ParNew和Paraller Scaven基本没区别,多线程,多CPU的,停顿时间比Serial少。

4、CMS

ConcurrentMark Sweep

CMS收集器是基于”标记-清除”算法实现的

初始标记

短暂,仅仅标记一下GC Roots能直接关联到的对象。速度很快。(这么做的目的是把垃圾分拨了。初始标记之后的过程中还会产生新的GC Roots,已经对应的引用链,但是之后的引用产生的垃圾留给下一次垃圾回收了)。

并发标记

较长,和用户线程同时进行。标记所有GCRoots(初始标记的)所关联的跟可达对象。这里的时间比较长,所以采用并发处理。

重新标记

短暂,为了修正并发标记期间因为用户继续运作而导致产生变动的那一部分对象的标记记录。这个阶段停顿时间会比初始标记稍微长一些,但远比并发标记的时间短。此处很多第一次学习的朋友可能有些想不通。(反正我第一次没咋搞明白,现在也不确定是不是理解对了)。首先,用户线程与GC线程并发执行会操作什么情况呢?GC线程在标记垃圾的时候对于它本身的线程也是串行的。也就是当它已经标记过的对象之后的引用发生过任何改变他都无法在标记过程中回过头去处理。

好了,那么现在又分了两种情况:用户线程把GC 线程已经标记存活的对象标记为了死亡,此时会发生什么情况?答案是这一波这个实际死亡的对象GC线程不处理,让它多活一阵子,等到下次垃圾回收再处理。这也就是我们说的浮动垃圾。

那么还有一种,是GC线程把它当做垃圾了,但是这个对象偏偏又被其他已经被GC线程判定存活的对象所引用,此时根据可达性分析,这个对象就不是垃圾了,却又无法被继续进行并发标记中的GC线程标记为复活。这有点像我们电影里演的,医生在治一个病人时,看病人没了心跳,就判定病人死亡。但是这个病人后来偏偏又被人救活了。此时这个医生还不知道。最后医生下达了死亡通知,这个有着脉搏却昏迷的无助病人就这么被活埋了!这绝对是不可以的!故事里这样做惨无人道。对于系统而言也会造成系统崩溃。那么如何避免这个问题呢?就需要重新标记来处理。

简而言之,并发标记标记了百分之90甚至99的正确的存活垃圾。重新标记就是在”医生火化病人”之前再次确认一下患者是否死透了,也就是将我们漏标的存活垃圾也给他标记存活。那么具体是如何做的,之后的文章会提到三色标记的漏标问题以及处理方案。

并发清除

由于整个标记中耗时最长的并发标记和并发清除过程,垃圾回收线程和用户线程都是一起工作的。所以总的来说,CMS收集器的内存回收过程是与用户线程一起并发执行的。

5、G1

化整为零”的思想

G1将堆内存”化整为零”,将堆内存划分成多个大小相同的独立区域(Region),每个Region都可以根据需要,扮演新生代的Eden区,Survivor区,老年区,甚至大对象区。回收器能对扮演不同角色的Region采用不同的策略去处理。

Region有可能是Eden,也有可能是Survivor,还有可能是一类特殊的Humongous区域,专门用来存储大对象。G1认为只要大小超过了一个Region容量大小一半的对象即可判定为大对象。而那些超过了整个Region容量的超级大对象,将会被存放在N个连续的Humobgous的Region之中。G1进行回收大多是情况下都把Humongous的Region当做老年代的一部分处理。 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值