前言
2019年还有不到2个月的时间就结束了,这一你,你收获了多少? java
前段时间一直有粉丝问我,有没有今年一些大厂Java面试题总结?最新抽时间整理了一些,分享给你们,你们一块儿共享学习!
1、性能调优系列
1.Tomcat性能调优
JVM参数调优: -Xms<size> 表示JVM初始化堆的大小,一Xmx<size>表示JVM堆的最大值。这两个值的大小通常根据须要进行设置。当应用程序须要的内存超出堆的最大值时虚拟机就会提示内存溢出,而且致使应用服务崩溃。所以- -般建议堆的最大值设置为可用内存的最大值的80%。在catalina.bat中,设置JAVA _0PTS='-Xms256m-Xmx512m',表示初始化内存为256MB,可使用的最大内存512MB。
2.JVM性能调优
Java类加载过程
Java类加载须要经历一下7个过程: node
1.加载 程序员
加载是类加载的第一个过程,在这个阶段,将完成一下三件事情
(1)经过一个类的全限定名获取该类的二进制流。
(2)将该二进制流中的静态存储结构转化为方法去运行时数据结构。
(3)在内存中生成该类的Class对象,做为该类的数据访问入口。 web
验证的目的是为了确保Class文件的字节流中的信息不回危害到虚拟机.在该阶段主要完成如下四钟验证:
(1)文件格式验证:验证字节流是否符合Class文件的规范,如主次版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型.
(2)元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否集成了不被继承的类等。
(3)字节码验证:是整个验证过程当中最复杂的一个阶段,经过验证数据流和控制流的分析,肯定程序语义是否正确,主要针对方法体的验证。如:方法中的类型转换是否正确,跳转指令是否正确等。
(4)符号引用验证:这个动做在后面的解析过程当中发生,主要是为了确保解析动做能正确执行。
3.MySQL性能调优
1. 主:binlog 线程——记录下全部改变了数据库数据的语句,放进 master 上的 binlog 中;
2. 从:io 线程——在使用 start slave 以后,负责从 master 上拉取 binlog 内容,放进 本身的 relay log 中;
3. 从:sql 执行线程——执行 relay log 中的语句;
MySQL 的复制是基于以下 3 个线程的交互( 多线程复制里面应该是 4 类线程):
1. Master 上面的 binlog dump 线程,该线程负责将 master 的 binlogevent 传到 slave;
2. Slave 上面的 IO 线程,该线程负责接收 Master 传过来的 binlog,并写入relay log;
3. Slave 上面的 SQL 线程,该线程负责读取 relay log 并执行;
4. 若是是多线程复制,不管是 5.6 库级别的假多线程仍是 MariaDB 或者 5.7的真正的多线程复制, SQL 线程只作 coordinator,只负责把 relay log 中的binlog 读出来而后交给 worker 线程, woker 线程负责具体 binlog event 的执行;
2、微服务系列
1.Spring Cloud面试
什么是 Spring Cloud?面试
Spring cloud 流应用程序启动器是基于 Spring Boot 的 Spring 集成应用程序,提供与外部系统的集成。Spring cloud Task,一个生命周期短暂的微服务框架,用于快速构建执行有限数据处理的应用程序。
使用 Spring Boot 开发分布式微服务时,咱们面临如下问题
1.与分布式系统相关的复杂性-这种开销包括网络问题,延迟开销,带宽问题,安全问题。
2.服务发现-服务发现工具管理群集中的流程和服务如何查找和互相交谈。它涉及一个服务目录,在该
目录中注册服务,而后可以查找并链接到该目录中的服务。
4. 负载平衡 --负载平衡改善跨多个计算资源的工做负荷,诸如计算机,计算机集群,网络链路,中央
2.spring boot面试
多年来,随着新功能的增长,spring 变得愈来愈复杂。页面,咱们就会看到能够在咱们的应用程序中使用的全部 Spring 项目的不一样功能。若是必须启动一个新的 Spring 项目,咱们必须添加构建路径或添加 Maven 依赖关系,配置应用程序服务器,添加 spring 配置。所以,开始一个新的 spring 项目须要不少努力,由于咱们如今必须从头开始作全部事情。Spring Boot 是解决这个问题的方法。Spring Boot 已经创建在现有 spring 框架之上。使用spring 启动,咱们避免了以前咱们必须作的全部样板代码和配置。所以,Spring Boot 能够帮助咱们以最少的工做量,更加健壮地使用现有的 Spring 功能。
2.使用 JavaConfig 有助于避免使用 XML。
6.没有单独的 Web 服务器须要。这意味着你再也不须要启动 Tomcat,Glassfish 或其余任何东
7.须要更少的配置 由于没有 web.xml 文件。只需添加用@ Configuration 注释的类,而后添加
用@Bean 注释的方法,Spring 将自动加载对象并像之前同样对其进行管理。您甚至能够将
@Autowired 添加到 bean 方法中,以使 Spring 自动装入须要的依赖关系中。
8.基于环境的配置 使用这些属性,您能够将您正在使用的环境传递到应用程序:-
Dspring.profiles.active = {enviornment}。在加载主应用程序属性文件后,Spring 将在
(application{environment} .properties)中加载后续的应用程序属性文件。
3.Dubbo面试
Dubbo 支持哪些协议,每种协议的应用场景,优缺点?
1.dubbo : 单一长链接和 NIO 异步通信,适合大并发小数据量的服务调用,以及消费者远大于提供者。传输协议 TCP,异步,Hessian 序列化;
2. rmi : 采用 JDK 标准的 rmi 协议实现,传输参数和返回参数对象须要实现Serializable 接口,使用 java 标准序列化机制,使用阻塞式短链接,传输数据包大小混合,消费者和提供者个数差很少,可传文件,传输协议 TCP。多个短链接,TCP 协议传输,同步传输,适用常规的远程服务调用和 rmi 互操做。在依赖低版本的 Common-Collections 包,java 序列化存在安全漏洞;
3. webservice : 基于 WebService 的远程调用协议,集成 CXF 实现,提供和原生 WebService 的互操做。多个短链接,基于 HTTP 传输,同步传输,适用系统集成和跨语言调用;
4. http : 基于 Http 表单提交的远程调用协议,使用 Spring 的 HttpInvoke 实现。多个短链接,传输协议 HTTP,传入参数大小混合,提供者个数多于消费者,须要给应用程序和浏览器 JS 调用;
5. hessian : 集成 Hessian 服务,基于 HTTP 通信,采用 Servlet 暴露服务,Dubbo 内嵌 Jetty 做为服务器时默认实现,提供与 Hession 服务互操做。多个短链接,同步 HTTP 传输,Hessian 序列化,传入参数较大,提供者大于消费者,提供者压力较大,可传文件;
6. memcache : 基于 memcached 实现的 RPC 协议
7. redis : 基于 redis 实现的 RPC 协议
3、并发编程系列
1.Synchronized原理
synchronized和ReentrantLock的区别?
synchronized是和if、else、for、while同样的关键字,ReentrantLock是类,这是两者的本质区别。既然ReentrantLock是类,那么它就提供了比synchronized更多更灵活的特性,能够被继承、能够有方法、能够有各类各样的类变量,ReentrantLock比synchronized的扩展性体如今几点上:
(1)ReentrantLock能够对获取锁的等待时间进行设置,这样就避免了死锁
(2)ReentrantLock能够获取各类锁的信息
(3)ReentrantLock能够灵活地实现多路通知
另外,两者的锁机制其实也是不同的。ReentrantLock底层调用的是Unsafe的park方法加锁,synchronized操做的应该是对象头中mark word,这点我不能肯定。
2.AQS框架
AQS是AbustactQueuedSynchronizer的简称,它是一个Java提升的底层同步工具类,用一个int类型的变量表示同步状态,并提供了一系列的CAS操做来管理这个同步状态。
AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效地构造出应用普遍的大量的同步器,好比咱们提到的ReentrantLock,Semaphore,其余的诸如ReentrantReadWriteLock,SynchronousQueue,FutureTask等等皆是基于AQS的。
这样方便使用者实现不一样类型的同步组件,独占式如ReentrantLock,共享式如Semaphore,CountDownLatch,组合式的如ReentrantReadWriteLock。总之,AQS为使用提供了底层支撑,如何组装实现,使用者能够自由发挥。
3.Java线程池
若是你提交任务时,线程池队列已满,这时会发生什么?
若是使用的是无界队列LinkedBlockingQueue,也就是无界队列的话,不要紧,继续添加任务到阻塞队列中等待执行,由于LinkedBlockingQueue能够近乎认为是一个无穷大的队列,能够无限存听任务 若是使用的是有界队列好比ArrayBlockingQueue,任务首先会被添加到ArrayBlockingQueue中,ArrayBlockingQueue满了,会根据maximumPoolSize的值增长线程数量,若是增长了线程数量仍是处理不过来,ArrayBlockingQueue继续满,那么则会使用拒绝策略RejectedExecutionHandler处理满了的任务,默认是AbortPolicy
4、开源框架系列
1.spring面试
什么是 Spring 框架,Spring 框架有哪些主要模块
Spring 框架是一个为 Java 应用程序开发提供综合、普遍的基础性支持的 Java 平台。
Spring 帮助开发者解决了开发中基础性的问题,使得开发人员能够专一于应用程序的开发。
Spring 框架自己也是按照设计模式精心打造的,这使得咱们能够在开发环境中安心地集成
Spring 框架,没必要担忧 Spring 是如何在后台工做的。
2.springMVC面试
SpringMvc 是 spring 的一个模块,基于 MVC 的一个框架,无需中间整合层来整合。
1.它是基于组件技术的.所有的应用对象,不管控制器和视图,仍是业务对象之类的都是 java
组件.而且和 Spring 提供的其余基础结构紧密集成.
2.不依赖于 Servlet API(目标虽是如此,可是在实现的时候确实是依赖于 Servlet 的)
3.能够任意使用各类视图技术,而不只仅局限于 JSP
1..客户端发送请求到 DispatcherServlet
2.DispatcherServlet 查询 handlerMapping 找处处理请求的 Controller
3.Controller 调用业务逻辑后,返回 ModelAndView
4.DispatcherServlet 查询 ModelAndView,找到指定视图
3.MyBatis面试
1. Mybatis是一个半ORM(对象关系映射)框架,它内部封装了 JDBC,开发时只须要关注 SQL 语句自己,不须要花费精力去处理加载驱动、建立链接、建立 Statement 等繁杂的过程。程序员直接编写原生态 SQL,能够严格控制 SQL 执行性能,灵活度高。
2. MyBatis 可使用 XML 或注解来配置和映射原生信息,将 POJO 映射成数据库中的记录,避免了几乎全部的 JDBC 代码和手动设置参数以及获取结果集。
3. 经过 XML 文件或注解的方式将要执行的各类 Statement 配置起来,并经过 Java 对象和 Statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL并将结果映射为 Java 对象并返回。(从执行 SQL到返回 Result 的过程)。
5、分布式专题
1.分布式限流面试
谈下你对 Zookeeper 的认识?
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
ZooKeeper 的目标就是封装好复杂易出错的关键服务,将简单易用的接口和性能高效、功能稳定的系统提供给用户。
2. 主节点选举:主节点挂掉了以后能够从备用的节点开始新一轮选主,主节点选举说的就是这个选举的过程,使用 Zookeeper 能够协助完成这个过程;
3. 分布式锁:Zookeeper 提供两种锁:独占锁、共享锁。独占锁即一次只能有一个线程使用资源,共享锁是读锁共享,读写互斥,便可以有多线线程同时读同一个资源,若是要使用写锁也只能有一个线程使用。Zookeeper 能够对分布式锁进行控制。
4. 命名服务:在分布式系统中,经过使用命名服务,客户端应用可以根据指定名字来获取资源或服务的地址,提供者等信息。
2.分布式通信面试
RabbitMQ 中的 broker 是指什么?cluster 又是指什么?
broker 是指一个或多个 erlang node 的逻辑分组,且 node 上运行着 RabbitMQ 应用程序。cluster 是在 broker 的基础之上,增长了 node 之间共享元数据的约束。
什么是元数据?元数据分为哪些类型?包括哪些内容?与 cluster 相关的元数据有哪些?元数据是如何保存的?元数据在 cluster 中是如何分布的?
在非 cluster 模式下,元数据主要分为 Queue 元数据(queue 名字和属性等)、Exchange 元数据(exchange 名字、类型和属性等)、Binding 元数据(存放路由关系的查找表)、Vhost 元数据(vhost 范围内针对前三者的名字空间约束和安全属性设置)。在cluster 模式下,还包括 cluster 中 node 位置信息和 node 关系信息。元数据按照 erlangnode 的类型肯定是仅保存于 RAM 中,仍是同时保存在 RAM 和 disk 上。元数据在 cluster中是全 node 分布的。
3.分布式数据库面试
哨兵(Sentinel)和复制(Replication)
Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就须要哨兵和复制。
Sentinel能够管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能,Replication则是负责让一个Redis服务器能够配备多个备份的服务器。
Redis也是利用这两个功能来保证Redis的高可用的
不少状况下咱们须要一次执行不止一个命令,并且须要其同时成功或者失败。redis对事务的支持也是源自于这部分需求,即支持一次性按顺序执行多个命令的能力,并保证其原子性。
读者福利:资料太多,一共100多页pdf,就不一一展现了,欢迎你们关注个人公众号【程序员追风】,文章都会在里面更新,整理的资料也会放在里面。
最后
领取资料的朋友们,记得帮做者点赞转发哟,感谢支持!