JAVA系列:
-
聊一下类加载器
类加载器是用于加载类文件的类。Java源码通过javac编译器编译成类文件, 然后JVM来执行类文件中的字节码来执行程序。 类加载负责加载文件系统、网络或其他来源的类文件。有三种默认使用的类加载器: Bootstrap类加载器、Extension类加载器和System类加载器(又称Application类加载器) 1. Bootstrap类加载器负责加载JDK类文件,是所有类加载器的父加载器。 另外Bootstrap类加载器是唯一一个大部分是由C语言实现的,其他类加载器都是通过java实现的 2. Extension类加载器将加载类的请求先委托Bootstrap,若未成功加载, 再从其他目录进行加载。 3. System类加载器,负责从classpath环境中加载应用相关的类 类加载器的工作原理基于三个机制:委托、可见性和一致性 委托: 假设有一个类需要加载,首先由System类加载器委托Extension类加载器加载, Extension再委托Bootstrap类加载器进行加载。Bootstrap进行查找,若存在这个类则加载, 若没有这个类可以加载,再回到Extenstion类加载器查找,若找不到再回到System类加载器加载 可见机制:子类加载器可以看到父类加载器加载的类,反之不行 单一性:父类加载器加载过的类不能被子加载器加载第二次
-
介绍restfult规范
1. 使用标准方法(GET、POST、PUT、PATCH、DELETE)操作资源 2. 尽量采用https协议 3. 请求体与响应体 统一使用json格式承载,json使用驼峰命名, 媒体类型媒体类型需设置为 ”application/json" 4. 请求响应统一使用UTF8格式,时间使用UTC格式:年月日时分秒 5. 消息响应对应的状态码
-
介绍整个JAVA虚拟机的构造(知道多少说多少)
-
介绍一下GC机制
-
聊一下Java中的数据结构
Java中常见的数据结构,主要分为Collection 和 map 两个主要接口 1. 常用类: a. ArrayList b. Vector (线程安全) c. LinkedList d. HashMap e. HashTable(线程安全) 2. 区分Vector、ArrayList和LinkedList 性能上来说ArrayList最好,但如果集合中元素需要频繁插入删除时LinkedList表现会更好, Vector适合用于线程同步的: a. 如果能用数组尽量用数组 b. 如果没有频繁增删,优先用ArrayList c. 多线程时,考虑用Vector d. 频繁增删考虑用LinkedList
-
SpingCloud组件
-
客户端和服务端使用socket进行连接,客户端向服务端发送一条信息,并显示发送成功,服务端收到了吗
-
讲一下Java的HashMap实现
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。 HashMap底层是一个数组结构,数组中的每一项又是一个链表, 当新建一个HashMap时,就会初始化一个数组。 进入Map的KV,会根据hash值得到这个元素在数组中的位置(数组下标), 若该位置已存放了其他元素,那么这个位置上的元素将以链表形式存放, 新加入的放在链头(头插法)。 当用户试图将一个KV存入HashMap中时,程序首先根据key的hashCode返回值决定Entry的存储位置。 先遍历该位置链表的key,是否存在相同的key,若存在则进销覆盖value,不存在则插入
-
线程之间如何进行通讯
1. 同步:通过Synchronized关键字来实现线程通信。 线程A和线程B需要调用同一个类中两个不同的Synchronized方法, 尽管调用的方法不同,但是需要等待其中一个线程执行完对应方法,其他线程才能执行(相当于共享变量) 3. while轮询:线程A在使用资源,线程B不断使用while循环去查看资源是否到位 4. wait/notify:线程A需要调用资源1,而资源1未到位,则线程A调用wait()放弃CPU, 当资源1到位了,线程B调用notify()唤醒线程A,线程A进入就绪状态 5. 管道通信
-
进程之间的通信:
1. 管道(Pipe) 2. 命名管道(FIFO) 3. 消息队列 4. 信号量 5. 共享内存
-
简介Volatile
1. volatile是一种比sychronized更轻量的同步机制 2. 当一个变量定义为volatile后, 此变量对所有线程可见当一个变量定义为volatile后, 此变量对所有线程可见 3. 用volatile修饰的变量会被存到内存中而非cpu缓存中,相当于多了一层内存屏障
-
ThreadLocal
-
跨域问题
跨域问题即同源问题,解决方法有jsonp、利用nginx反向代理、修改请求头等
-
比较int和Integer
1. Integer是int 类型的包装类,int则是java的基本数据类型 2. Integer必须实例化后才能使用,int不需要 3. 当new一个Integer时,实际上是生成一个指针指向对象,而int则是直接存储数据值 4. Integer默认值为null, int 默认值为0 5. Integer通过new生成两个值相同的对象是不相等的,因为内存地址不同 6. java对-128到127之间的数会进行缓存,即Integer i = 127时会进行缓存, 下一次再写Integer j = 127会直接从缓存中取出,不会再new一次
-
一个进程可以允许最大的线程数
默认情况下,一个线程栈大概要预留1M的空间,而一个进程可用的内存空间为2G,理论上 一个进程中最多可以开2048个线程,但是内存不可能完全用于做线程栈,所以实际数目应该 比这个值要小。
计算机网络系列:
-
七层OSI及对应的协议
-
三次握手和四次挥手
-
如果客户端和服务端建立了tcp连接,突然将客户端网线拔掉,服务器端知道吗?
当客户端与服务端建立正常TCP连接后,若客户端主机断开网线、电源掉电或系统崩溃, 服务器进程将永远不会知道(通过我们常用的select,epoll监控不到断开或错误时间), 如果不主动处理或重启系统的话服务端会一直维持这个连接,这种情况称为半开连接。 除非我们配置了系统的SO_KEEPALIVE选项,或应用层的心跳检测。 若网线断开时间短暂,在SO_KEEPALIVE探测时间内,当连上网线此TCP连接会自动恢复。 反之,连上网线后要重新建立连接
-
聊一下常见的状态码
302重定向、304服务器无法满足请求资源、400参数错误、401鉴权失败、404无法找到网页、 403服务器拒绝访问、500服务器响应错误、503服务器故障
-
一条请求从浏览器发出后经过什么到达服务器(假设后端使用SpringMVC):
浏览器请求 -> 应用层 -> 显示层 -> 会话层 -> 传输层 -> 网络层 -> 链路层 -> 物理层 -> 链路层 -> 网络层 -> 传输层 -> 会话层 -> 显示层 -> 应用层 -> dispatch Servlet -> Controller -> Model -> View -> 回流
操作系统系列:
-
进程、线程、协程之间的关系
1. 进程是操作系统资源分配的最小单位 2. 线程是CPU调度的最小单位。一个进程可以由多个线程,多个线程共享进程资源 3. 协程被称为轻量级线程, 调度完全由用户控制,拥有自己的寄存器上下文和栈 4. 线程的执行过程可以理解为一个自上而下执行的程序,可以将这个程序切分成多个部分, 如A 、B、C.而协程,可以认为一个程序由A、B、C多个部分组成。 现在执行到A的某一行,先暂停执行将其保存,转而去执行B,如A 、B、C.而协程, 可以认为一个程序由A、B、C多个部分组成。现在执行到A的某一行,先暂停执行将其保存, 转而去执行B,等一定时间再回来接着执行A
-
死锁场景
MySQL :
-
数据库为什么要用B+树:
文件很大,需要存储到磁盘,使用B+树可以减少访问磁盘的次数