2020最新JAVA核心面试知识整理283页(带详解)
2020-04-01 本文已影响0人
C语言中文社区
部分目录预览
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
部分内容预览
JVM 类加载机制
JVM 类加载机制分为五个部分:加载,验证,准备,解析,初始化,下面我们就分别来看一下这五个过程。
在这里插入图片描述
- 加载
加载是类加载过程中的一个阶段,这个阶段会在内存中生成一个代表这个类的java.lang.Class
对象,作为方法区这个类的各种数据的入口。注意这里不一定非得要从一个Class 文件获取,这里既可以从ZIP 包中读取(比如从jar 包和war 包中读取),也可以在运行时计算生成(动态代理),也可以由其它文件生成(比如将JSP 文件转换成对应的Class 类)。 - 验证
这一阶段的主要目的是为了确保Class 文件的字节流中包含的信息是否符合当前虚拟机的要求,并且不会危害虚拟机自身的安全。 - 准备
准备阶段是正式为类变量分配内存并设置类变量的初始值阶段,即在方法区中分配这些变量所使用的内存空间。注意这里所说的初始值概念,比如一个类变量定义为:
public static int v = 8080;
实际上变量v 在准备阶段过后的初始值为0 而不是8080,将v 赋值为8080 的put static 指令是程序被编译后,存放于类构造器<client>方法之中。
但是注意如果声明为:
public static final int v = 8080;
在编译阶段会为v 生成ConstantValue 属性,在准备阶段虚拟机会根据ConstantValue 属性将v赋值为8080。 - 解析
解析阶段是指虚拟机将常量池中的符号引用替换为直接引用的过程。符号引用就是class 文件中的:
CONSTANT_Class_info
CONSTANT_Field_info
-
CONSTANT_Method_info
等类型的常量。
volatile关键字的作用(变量可见性、禁止重排序)
Java 语言提供了一种稍弱的同步机制,即volatile 变量,用来确保将变量的更新操作通知到其他线程。volatile 变量具备两种特性,volatile 变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile 类型的变量时总会返回最新写入的值。
- 变量可见性
其一是保证该变量对所有线程可见,这里的可见性指的是当一个线程修改了变量的值,那么新的值对于其他线程是可以立即获取的。 - 禁止重排序
volatile 禁止了指令重排。
比 sychronized 更轻量级的同步锁
在访问volatile 变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile 变量是一种比sychronized 关键字更轻量级的同步机制。volatile 适合这种场景:一个变量被多个线程共享,线程直接给这个变量赋值。
在这里插入图片描述
当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU 缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU 上被处理,这意味着每个线程可以拷贝到不同的 CPUcache 中。而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache这一步。
适用场景
值得说明的是对volatile 变量的单次读/写操作可以保证原子性的,如long 和double 类型变量,但是并不能保证i++这种操作的原子性,因为本质上i++是读、写两次操作。在某些场景下可以代替Synchronized。但是,volatile 的不能完全取代Synchronized 的位置,只有在一些特殊的场景下,才能适用volatile。总的来说,必须同时满足下面两个条件才能保证在并发环境的线程安全:
(1)对变量的写操作不依赖于当前值(比如 i++),或者说是单纯的变量赋值(booleanflag = true)。
(2)该变量没有包含在具有其他变量的不变式中,也就是说,不同的volatile 变量之间,不能互相依赖。只有在状态真正独立于程序内其他内容时才能使用 volatile。
Spring MVC 原理
Spring 的模型-视图-控制器(MVC)框架是围绕一个DispatcherServlet 来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。
Http 请求到 DispatcherServlet
(1) 客户端请求提交到DispatcherServlet。
HandlerMapping 寻找处理器
(2) 由DispatcherServlet 控制器查询一个或多个HandlerMapping,找到处理请求的
Controller。
调用处理器 Controller
(3) DispatcherServlet 将请求提交到Controller。
Controller 调用业务逻辑处理后,返回 ModelAndView
(4)(5)调用业务处理和返回结果:Controller 调用业务逻辑处理后,返回ModelAndView。
DispatcherServlet 查询 ModelAndView
(6)(7)处理视图映射并返回模型: DispatcherServlet 查询一个或多个ViewResoler 视图解析器,找到ModelAndView 指定的视图。
ModelAndView 反馈浏览器 HTTP
(8) Http 响应:视图负责将结果显示到客户端。
由于内容太多,这里就不一一列举了,还是将整个文件送给各位吧,希望能帮助到大家!
获取完整PDF文件,请在微信公众号【Java技术精选】的后台回复“面试”两个字
如果您觉得本篇文章对您有帮助,请点赞,转发给更多的人吧