Java面试题总结——JVM问题、网络基础

1. JVM运行时内存区域划分

JVM内存管理

2. 内存溢出OOM和堆栈溢出SOE的示例及原因、如何排查与解决

OOM 和SOE

3.如何判断对象是否可以回收或存活
4.常见的GC回收算法及其含义
5.强引用、软引用、弱引用、虚引用
垃圾回收机制

6.类加载器、双亲委派模型、一个类的生命周期、类是如何加载到JVM中的
类加载过程

7.类加载的过程:加载、验证、准备、解析、初始化

  • 加载:JVM的主要目的是将字节码从各个位置转化为二进制字节流加载到内存中,接着会为这个类在JVM的方法区创建一个对应的Class对象,这个Class对象就是这个类各种数据的访问入口;

  • 验证:当JVM加载完Class字节码文件并在方法区创建对应的Class对象之后,JVM便会启动对该字节码流的校验,只有符合JVM字节码规范的文件才能被JVM正确执行。包括JVM对规范校验、代码逻辑校验。

  • 准备:当完成字节码文件的校验之后,JVM便会开始为类变量分配内存并初始化。

    • 内存分配的对象:Java中由类变量和类成员变量,类变量是指被static所修饰的变量,其他的都属于类成员变量,在这个阶段JVM只会为类变量分配内存,而不会为类成员变量分配内存。
    • 初始化的类型:这里的初始化指的是为变量赋予Java语言中该数据类型的零值,而不是用户代码里的初始化值;但是如果这个变量是常量即被static final修饰时,则会直接赋程序员所希望的那个值。
  • 解析:当准备阶段之后,JVM针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符引用进行解析,这个阶段的主要任务是将其在常量池中的符号替换成在内存中的直接引用;

  • 初始化:JVM会根据语句执行顺序对类对象进行初始化;下面是触发初始阿虎的情况:

    • 遇到new、getstatic、setstatic、invokestatic即(new创建对象,读取或设置一个类的静态字段、以及调用一个类的静态方法的是时候)如果类没有进行过初始化则需要先触发其初始化;
    • 进行反射调用的时候;
    • 虚拟机启动时包含main方法的那个类;
  • 使用:当JVM完成初始化阶段之后,JVM便开始从入口方法执行用户的程序代码;

  • 卸载:当用户程序代码执行完毕之后,JVM便开始销毁创建的Class队形,最后负责运行的JVM也退出内存。

8. CMS收集的过程
9. G1收集的过程
垃圾收集器收集的过程

10. Java内存模型JMM
内存模型

网络基础

BIO、NIO、AIO的概念

  • BIO同步阻塞IO:一个socket连接一个处理线程,操作系统允许的线程数量是有限的,多个socket申请与服务端建立连接时,服务端不能提供相应数量的处理线程,没有分配到处理线程的连接就会阻塞等待或被拒绝;
  • NIO同步非阻塞IO:对BIO的改进,在连接到服务端的众多socket中,只有需要进行IO操作的才能获取服务端的处理线程进行IO,这样就不会因为线程不够而限制socket的接入;客户端的socket连接到服务端时,就会在事件分离器注册一个IO请求事件和IO事件处理器,**在该连接发生IO请求时,IO事件处理器就会启动一个线程来处理这个IO请求,**不断尝试获取系统的IO使用权限一旦成功,则通知这个socket进行IO数据传输。
  • AIO异步阻塞IO:每个socket连接在事件分离器注册Io完成事件和Io完成事件处理器,程序需要进行IO时,向分离器发出Io请求并把所用的Buffer区域告知分离器,分离器通知操作系统进行IO操作,操作系统会自己不断尝试获取IO权限并进行IO操作将数据保存在Buffer区,操作完成后通知分离器,分离器检测到IO事件完成,则激活IO完成事件处理器,处理器会通知程序IO已经完成,程序知道后就直接从Buffer区进行数据的读写;

什么是长连接和短连接

  • 长连接:在TCP握手成功之后,不立即断开连接,并在此连接的基础上进行多次消息交互,直至连接的任意一方主动断开连接,此过程称为一次完整的长连接。在http中的表现为打开一次网页完成后,客户端和服务端之间用于HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接。

  • 短连接:客户端收到服务端的相应之后,立刻发送FIN消息,主动释放连接,也有服务端主动断开连接的情况,凡是再一次消息交互之后立刻断开连接的情况都称为短连接。

  • 使用场合:需要频繁交互的场景如即时通信工具微信、QQ,而短连接适用于web网站;

TCP保活功能:目的是检测到半开放的连接(如果长时间没有动作将会处于半连接状态);
如果一个给定的链接在两个小时内没有任何动作,就会向对方发送一个探测报文段,根据对方的响应来判断是否保活:

  • 对方依然正常运行,且服务器可达,TCP响应正常,服务器将保活定时器复位;
  • 对方已经崩溃,并且关闭或者正在重启,所以不能响应,无法收到探测的响应,然后会每隔75秒发一次探测,一共发十次,若没有受到任何一次探测响应就会认为对方已经关闭并终止了连接;
  • 客户端崩溃并已经重新启动,服务器将收到一个对保活的探测响应,这个响应是一个重置报文段,请求端将会断开连接。
  • 对方主机仍在工作,但是由于某些原因不能到达请求端;与状态2相同。

Http1.0和2.0相比有什么区别

  • http2有多路复用,允许单一的连接同时发起多重的请求;使用的是二进制分帧,在二进制分帧层中,HTTP/2会将所有传输的信息分割为帧,并对他们采用二进制格式的编码。TCP连接会随着时间进行自我调谐,起初会限制连接的最大速度,如果数据传输成功,会随着各时间的推移提高传输速度,称为TCP的慢启动,而Http原本就是突发性的短时性的http连接,TCP的这种机制会使Http十分低效,而用了多路复用的话,可以更高效的使用TCP连接,同时让高带宽也能真正服务于性能提升;减少了服务端的连接压力,内存占用更少了,连接吞吐量更大。
  • 首部压缩:在Http1中请求的状态行和头部都没有经过任何压缩,直接以纯文本传输,随着Web功能的越来越复杂,每个页面产生的请求数越来越多,导致消耗在头部的流量越来越多。
    • 维护一份相同的静态字典,包含常见头部名称,以及常见头部名称与值的组合;
    • 维护一份相同的动态字典,可添加内容;
    • 支持基于静态哈夫曼码表的哈夫曼编码;

静态字典的作用:对完全匹配的头部键值对,可直接时用一个字符表示;对头部名称可以匹配的键值对,也可以使用一个字符表示。

  • Http2支持服务器推送,它允许服务端推送资源给浏览器,在浏览器明确地请求之前,一个服务器经常知道一个页面所需的附加资源,所以它在浏览器第一次请求的时候就把这些资源都响应给浏览器,即使在第一次请求中没有要求的资源,但是服务器知道以后肯定会请求这种资源。

在这里插入图片描述

Https的基本概念

https是以安全为目标的Http通道,就是HTTP的安全版,在Http的基础上加入SSl层;
https的主要作用分为两种:简历一个信息安全的通道来保证数据传输的安全;确认网站的真实性。

与http的区别:

  • https协议需要申请证书;
  • http是超文本传输协议是明文传输,而https则是具有安全性的ssl加密传输协议;
  • http使用端口为80;https使用端口为443,而且使用的是完全不同的连接方式;
  • http连接简单无状态,https由ssl+http协议构建的,比http安全;

缺点:

  • 握手阶段比较费时,页面加载时间延长功能50%,增加10%-20%的耗电;
  • 会增加开销和功耗,甚至已有的安全措施也会因此而受到影响;
  • ssl证书需要钱;
  • ssl证书通常要绑定IP,不能再同一IP上绑定多个域名。
  • 加密范围比较有限;

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/88410768