2025最全最细Java面试八股文,再也不用担心找不到工作了!

B站影视 内地电影 2025-04-18 16:55 1

摘要:为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、 和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一 步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编 程。

Java 概述 何为编程

编程就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并 终得到结果的过程。

为了使计算机能够理解人的意图,人类就必须要将需解决的问题的思路、方法、 和手段通过计算机能够理解的形式告诉计算机,使得计算机能够根据人的指令一 步一步去工作,完成某种特定的任务。这种人和计算机之间交流的过程就是编 程。

什么是 Java

Java 是一门面向对象编程语言,不仅吸收了 C++ 语言的各种优点,还摒弃了 C++ 里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易 用两个特征。 Java 语言作为静态面向对象编程语言的代表,极好地实现了面向对 象理论,允许程序员以优雅的思维方式进行复杂的编程 。

JDK1.5 之后的三大版本

Java SE ( J2SE , Java 2 Platform Standard Edition ,标准版) Java SE 以前称为 J2SE 。它允许开发和部署在桌面、服务器、嵌入式环境和实时环境中使 用的 Java 应用程序。 Java SE 包含了支持 JavaWeb 服务开发的类,并为 Java EE 和 Java ME 提供基础。

Java EE ( J2EE , Java 2 Platform Enterprise Edition ,企业版) Java EE 以前称为 J2EE 。企业版本帮助开发和部署可移植、健壮、可伸缩且安全的服务器 端 Java 应用程序。 Java EE 是在 Java SE 的基础上构建的,它提供 Web 服务、组件模型、 管理和通信 API ,可以用来实现企业级的面向服务体系结构( service-oriented architecture , SOA )和 Web2.0 应用程序。

2018 年 2 月, Eclipse 宣布正式将 JavaEE 更名 为 JakartaEEJava ME ( J2ME , Java 2 Platform Micro Edition ,微型版) Java ME 以前称为 J2ME 。 Java ME 为在移动设备和嵌入式设备(比如手机、 PDA 、电视 机顶盒和打印机)上运行的应用程序提供一个健壮且灵活的环境。 Java ME 包括灵活的用 户界面、健壮的安全模型、许多内置的网络协议以及对可以动态下载的连网和离线应用程序 的丰富支持。基于 Java ME 规范的应用程序只需编写一次,就可以用于许多设备,而且可 以利用每个设备的本机功能。

JVM 、 JRE 和 JDK 的关系

JVM

Java Virtual Machine 是 java 虚拟机, Java 程序需要运行在虚拟机上,不同的平 台有自己的虚拟机,因此Java 语言可以实现跨平台。

JRE

Java Runtime Environment 包括 Java 虚拟机和 Java 程序所需的核心类库等。核 心类库主要是 java.lang包:包含了运行 Java 程序必不可少的系统类,如基本数 据类型、基本数学函数、字符串处理、线程、异常处理类等,系统缺省加载这个包如果想要运行一个开发好的 Java 程序,计算机中只需要安装 JRE 即可。

JDK

Java Development Kit 是提供给 Java 开发人员使用的,其中包含了 Java 的开发 工具,也包括了 JRE 。所以安装了 JDK ,就无需再单独安装 JRE 了。其中的开发工 具:编译工具 (javac.exe) ,打包工具(jar.exe)等。

什么是跨平台性?原理是什么

所谓跨平台性,是指 java 语言编写的程序,一次编译后,可以在多个系统平台上 运行。

实现原理: Java 程序是通过 java 虚拟机在系统平台上运行的,只要该系统可以安 装相应的 java 虚拟机,该系统就可以运行 java 程序。

Java 语言有哪些特点

简单易学( Java 语言的语法与 C 语言和 C++ 语言很接近)

面向对象(封装,继承,多态)

平台无关性( Java 虚拟机实现平台无关性)

支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的)

支持多线程(多线程机制使应用程序在同一时间并行执行多项任)

健壮性( Java 语言的强类型机制、异常处理、垃圾的自动收集等)

安全性

什么是字节码?采用字节码的大好处是什么

字节码 : Java 源代码经过虚拟机编译器编译后产生的文件(即扩展为 .class 的文 件),它不面向任何特定的处理器,只面向虚拟机。

采用字节码的好处:

Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的 问题,同时又保留了解释型语言可移植的特点。所以 Java 程序运行时比较高效, 而且,由于字节码并不专对一种特定的机器,因此, Java 程序无须重新编译便可 在多种不同的计算机上运行。

先看下 java 中的编译器和解释器:

Java 中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟机 器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程 序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代 码转换为特定系统的机器码执行。在 Java 中,这种供虚拟机理解的代码叫做字节 码(即扩展为 .class 的文件),它不面向任何特定的处理器,只面向虚拟机。每 一种平台的 解释器是不同的,但是实现的虚拟机是相同的。 Java 源程序经过编译 器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节 码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运 行,这就是上面提到的 Java 的特点的编译与解释并存的解释。

什么是 Java 程序的主类?应用程序和小程序的主类有何不同?

一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主 类是指包含 main 方法的类。而在 Java 小程序中,这个主类是一个继承自系统 类 Japplet 或 Applet 的子类。应用程序的主类不一定要求是 public 类,但小程序 的主类要求必须是 public 类。主类是 Java 程序执行的入口点。

Java 应用程序与小程序之间有那些差别?

简单说应用程序是从主线程启动 ( 也就是 main 方法 ) 。 applet 小程序没有 main 方法,主要是嵌在浏览器页面上运行 ( 调用 init 线程或者 run 来启动 ) ,嵌入浏 览器这点跟 flash 的小游戏类似。

Java 和 C++ 的区别

我知道很多人没学过 C++ ,但是面试官就是没事喜欢拿咱们 Java 和 C++ 比呀! 没办法!!!就算没学过C++ ,也要记下来!

都是面向对象的语言,都支持封装、继承和多态

Java 不提供指针来直接访问内存,程序内存更加安全

Java 的类是单继承的, C++ 支持多重继承;虽然 Java 的类不可以多继承,但是 接口可以多继承。

Java 有自动内存管理机制,不需要程序员手动释放无用内存

Oracle JDK 和 OpenJDK 的对比

1. Oracle JDK 版本将每三年发布一次,而 OpenJDK 版本每三个月发布一 次;

2. OpenJDK 是一个参考模型并且是完全开源的,而 Oracle JDK 是 OpenJDK 的一个实现,并不是完全开源的;

3. Oracle JDK 比 OpenJDK 更稳定。 OpenJDK 和 Oracle JDK 的代码几乎 相同,但 Oracle JDK 有更多的

类和一些错误修复。因此,如果您想开发企 业 / 商业软件,我建议您选择 Oracle JDK ,因为它经过了彻底的测试和稳 定。某些情况下,有些人提到在使用 OpenJDK 可能会遇到了许多应用程 序崩溃的问题,但是,只需切换到 Oracle JDK 就可以解决问题;

4. 在响应性和 JVM 性能方面, Oracle JDK 与 OpenJDK 相比提供了更好的 性能;

5. Oracle JDK 不会为即将发布的版本提供长期支持,用户每次都必须通过 更新到最新版本获得支持来获取最新版本;

6. Oracle JDK 根据二进制代码许可协议获得许可,而 OpenJDK 根据 GPL v2 许可获得许可。

JVM 2025

说一下 JVM 的主要组成部分及其作用?

JVM 包含两个子系统和两个组件,两个子系统为 Class loader( 类装载 ) 、 Execution engine( 执行引擎 ) ;

两个组件为 Runtime data area( 运行时数据 区 ) 、 Native Interface( 本地接口 ) 。

Class loader( 类装载 ) :根据给定的全限定名类名 ( 如: java.lang.Object) 来装载 class 文件到Runtime data area 中的 method area 。 Execution engine (执行引擎):执行 classes 中的指令。

Native Interface( 本地接口 ) :与 native libraries 交互,是其它编程语 言交互的接口。

Runtime data area( 运行时数据区域 ) :这就是我们常说的 JVM 的内 存。

作用 : 首先通过编译器把 Java 代码转换成字节码,类加载器( ClassLoader ) 再把字节码加载到内存中,将其放在运行时数据区( Runtime data area )的方 法区内,而字节码文件只是 JVM 的一套指令集规范,并不能直接交给底层操作 系统去执行,因此需要特定的命令解析器执行引擎( ExecutionEngine ),将 字节码翻译成底层系统指令,再交由 CPU 去执行,而这个过程中需要调用其他 语言的本 地库接口( Native Interface )来实现整个程序的功能。

下面是 Java 程序运行机制详细说明

Java 程序运行机制步骤

首先利用 IDE 集成开发工具编写 Java 源代码,源文件的后缀为 .java ;

再利用编译器 (javac 命令 ) 将源代码编译成字节码文件,字节码文件的后缀名 为 .class ;

运行字节码的工作是由解释器 (java 命令 ) 来完成的。

从上图可以看, java 文件通过编译器变成了 .class 文件,接下来类加载器又将这 些 .class 文件加载到JVM 中。

其实可以一句话来解释:类的加载指的是将类的 .class文件中的二进制数据读入 到内存中,将其放在运 行时数据区的方法区内,然后在堆区创建一个 java.lang.Class对象,用来封装类在方法区内的数据结 构。

说一下 JVM 运行时数据区

Java 虚拟机在执行 Java 程序的过程中会把它所管理的内存区域划分为若干个 不同的数据区域。这些区 域都有各自的用途,以及创建和销毁的时间,有些区域 随着虚拟机进程的启动而存在,有些区域则是依 赖线程的启动和结束而建立和销 毁。 Java 虚拟机所管理的内存被划分为如下几个区域:

不同虚拟机的运行时数据区可能略微有所不同,但都会遵从 Java 虚拟机规范, Java 虚拟机规范规定的区域分为以下 5 个部分:

程序计数器( Program Counter Register ):当前线程所执行的字节码的行号 指示器,字节码解析器的工作是通过改变这个计数器的值,来选取下一条需要执行的 字节码指令,分支、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个 计数器来完成;

Java 虚拟机栈( Java Virtual Machine Stacks ):用于存储局部变量表、操作 数栈、动态链接、方法出口等信息;

本地方法栈( Native Method Stack ):与虚拟机栈的作用是一样的,只不过虚 拟机栈是服务 Java方法的,而本地方法栈是为虚拟机调用 Native 方法服务的;

Java 堆( Java Heap ): Java 虚拟机中内存大的一块,是被所有线程共享 的,几乎所有的对象实例都在这里分配内存;

方法区( Methed Area ):用于存储已被虚拟机加载的类信息、常量、静态变 量、即时编译后的代码等数据。

简述线程,程序、进程的基本概念。以及他们之间关系是什 么 线程 与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,

或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。

程序 是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。

进程 是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。

系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如 CPU 时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。

线程有哪些基本状态 ?

Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种不同状态的其中一个状态。

线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态 变迁如下图所示:

如何理解内存泄漏问题?有哪些情况会导致内存泄露?如何解决?

详解 java 内存泄露和如何避免内存泄漏

一直以来 java 都占据着语言排行榜的头把交椅。这是与 java 的设计密不可分的,其中最令大家喜欢的不是面向对象,而是垃圾回收机制。你只需要简单的创建对象而不需要负责释放空间,因为 Java 的垃圾回收器会负责内存的回收。然而,情况并不是这样简单,内存泄露还是经常会在 Java 应用程序中出现。

下面我们将详细的学习什么是内存泄露,为什么会发生,以及怎样阻止内存泄露。

什么是内存泄露

内存泄露的定义:对于应用程序来说,当对象已经不再被使用,但是 Java 的垃圾回收器不能回收它们的时候,就产生了内存泄露。

要理解这个定义,我们需要理解对象在内存中的状态。如下图所示,展示了哪些对象是无用对象,哪些是未被引用的对象;

数据库基础知识

为什么要使用数据库

数据保存在内存

优点:存取速度快

缺点:数据不能永久保存

数据保存在文件

优点:数据永久保存

缺点: 1 )速度比内存操作慢,频繁的 IO 操作。

数据保存在数据库

1 )数据永久保存

2 )使用 sql 语句,查询方便效率高。

3 )管理数据方便

什么是 SQL ?

结构化查询语言 (StructuredQueryLanguage) 简称 SQL ,是一种数据库查询语言。

作用:用于存取数据、查询、更新和管理关系数据库系统。

什么是 Mysql?

MySQL 是一个关系型数据库管理系统,由瑞典 MySQLAB 公司开发,属于 Oracle 旗下产品。 MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面, MySQL 是最好的RDBMS(
RelationalDatabaseManagementSystem ,关系数据库管理系统 ) 应用软件之一。在 Java 企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。

数据库三大范式是什么

第一范式:每个列都不可以再拆分。

第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。

第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。

在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。比如性能。事实上我们经常会为了性能而妥协数据库的设计。

mysql 有关权限的表都有哪几个

MySQL 服务器通过权限表来控制用户对数据库的访问,权限表存放在 mysql 数据库里,由mysql_install_db 脚本初始化。这些权限表分别 user , db , table_priv , columns_priv 和 host 。下面分别介绍一下这些表的结构和内容:

user 权限表:记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。

db 权限表:记录各个帐号在各个数据库上的操作权限。

table_priv 权限表:记录数据表级的操作权限。

2 )查询数据不方便 columns_priv 权限表:记录数据列级的操作权限。

host 权限表:配合 db 权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受 GRANT 和REVOKE 语句的影响。

MySQL 的 binlog 有有几种录入格式?分别有什么区别?

有三种格式, statement , row 和 mixed 。

statement 模式下,每一条会修改数据的 sql 都会记录在 binlog 中。不需要记录每一行的变化,减少了 binlog 日志量,节约了 IO ,提高性能。由于 sql 的执行是有上下文的,因此在保存的时候需要保存相关的信息,同时还有一些使用了函数之类的语句无法被记录复制。

row 级别下,不记录 sql 语句上下文相关信息,仅保存哪条记录被修改。记录单元为每一行的改动,基本是可以全部记下来但是由于很多操作,会导致大量行的改动 ( 比如 altertable) ,因此这种模式的文件保存的信息太多,日志量太大。

mixed ,一种折中的方案,普通操作使用 statement 记录,当无法使用 statement 的时候使用 row 。

此外,新版的 MySQL 中对 row 级别也做了一些优化,当表结构发生变化的时候,会记录语句而不是逐行记录。

数据类型

mysql 有哪些数据类型

Spring 原理

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可

以和其他的框架无缝整合。

Spring 特点

轻量级

控制反转

面向切面

容器

框架集合

Spring Boot 概述

什么是 Spring Boot ?

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

Spring Boot 有哪些优点?

Spring Boot 主要有如下优点:

1. 容易上手,提升开发效率,为 Spring 开发提供一个更快、更广泛的入门体验。

2. 开箱即用,远离繁琐的配置。

3. 提供了一系列大型项目通用的非业务性功能,例如:内嵌服务器、安全管理、运行数据监控、运行状况检查和外部化配置等。

4. 没有代码生成,也不需要 XML 配置。

5. 避免大量的 Maven 导入和各种版本冲突。

Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

启动类上面的注解是 @SpringBootApplication ,它也是 Spring Boot 的核心注解,主要组合包含了以下3 个注解:

@SpringBootConfiguration :组合了 @Configuration 注解,实现配置文件的功能。

@EnableAutoConfiguration :打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源

自动配置功能: @SpringBootApplication(exclude

= {
DataSourceAutoConfiguration.class }) 。

@ComponentScan : Spring 组件扫描。

配置

什么是 JavaConfig ?

Spring JavaConfig 是 Spring 社区的产品,它提供了配置 Spring IoC 容器的纯 Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的优点在于:

( 1 ) 面向对象的配置。由于配置被定义为 JavaConfig 中的类,因此用户可以充分利用 Java 中的面向对象功能。一个配置类可以继承另一个,重写它的@bean 方法等。

( 2 ) 减少或消除 XML 配置。基于依赖注入原则的外化配置的好处已被证明。

但是,许多开发人员不希望在 XML 和 Java 之间来回切换。 JavaConfig 为开发人员提供了一种纯 Java 方法来配置与 XML 配置概念相似的 Spring 容器。从技术角度来讲,只使用 JavaConfig 配置类来配置容器是可行的,但实际上很多人认为将 JavaConfig 与XML 混合匹配是理想的。

( 3 )类型安全和重构友好。 JavaConfig 提供了一种类型安全的方法来配置

Spring 容器。由于 Java 5.0 对泛型的支持,现在可以按类型而不是按名称检索 bean ,不需要任何强制转换或基于字符串的查找。

Spring Boot 自动配置原理是什么?

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,@EnableAutoConfiguration 给容器导入 META-INF/spring.factories 里定义的自动配置类。

筛选有效的自动配置类。

每一个自动配置类结合对应的 xxxProperties.java 读取配置文件进行自动配置功能你如何理解 Spring Boot 配置加载顺序?

在 Spring Boot 里面,可以使用以下几种方式来加载配置。

1 ) properties 文件;

2 ) YAML 文件;

3 ) 系统环境变量;

等等 ……

4 )命令行参数; 什么是 YAML ?

YAML 是一种人类可读的数据序列化语言。它通常用于配置文件。与属性文件相比,如果我们想要在配置文件中添加复杂的属性, YAML 文件就更加结构化,而且更少混淆。可以看出 YAML 具有分层配置数据。 YAML 配置的优势在哪里 ?

YAML 现在可以算是非常流行的一种配置文件格式了,无论是前端还是后端,都可以见到 YAML 配置。

那么 YAML 配置和传统的 properties 配置相比到底有哪些优势呢?

1. 配置有序,在一些特殊的场景下,配置有序很关键

2. 支持数组,数组中的元素可以是基本数据类型也可以是对象

3. 简洁

相比 properties 配置文件, YAML 还有一个缺点,就是不支持 @PropertySource 注解导入自定义的YAML 配置。

Spring Boot 是否可以使用 XML 配置 ?

Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过@ImportResource 注解可以引入一个 XML 配置。 spring boot 核心配置文件是什么?

bootstrap.properties 和 application.properties 有何区别 ?

单纯做 Spring Boot 开发,可能不太容易遇到 bootstrap.properties 配置文件,但是在结合 Spring Cloud 时,这个配置就会经常遇到了,特别是在需要加载一些远程配置文件的时侯。

spring boot 核心的两个配置文件:

bootstrap (. yml 或者 . properties) : boostrap 由父 ApplicationContext 加载的,比 applicaton 优先加载,配置在应用程序上下文的引导阶段生效。一般来说我们在 Spring Cloud Config 或者 Nacos 中会用到它。且 boostrap 里面的属性不能被覆盖;

application (. yml 或者 . properties) : 由 ApplicatonContext 加载,用于 spring boot 项目的自动化配置。

什么是 Spring Profiles ?

Spring Profiles 允许用户根据配置文件( dev , test , prod 等)来注册 bean 。因此,当应用程序在开发中运行时,只有某些 bean 可以加载,而在PRODUCTION 中,某些其他 bean 可以加载。假设我们的要求是 Swagger 文档仅适用于 QA 环境,并且禁用所有其他文档。这可以使用配置文件来完成。 Spring Boot 使得使用配置文件非常简单。

如何在自定义端口上运行 Spring Boot 应用程序?

为了在自定义端口上运行 Spring Boot 应用程序,您可以在application.properties 中指定端口。 server.port = 8090安全

如何实现 Spring Boot 应用程序的安全性?

为了实现 Spring Boot 的安全性,我们使用
spring-boot-starter-security 依赖项,并且必须添加安全配置。它只需要很少的代码。配置类将必须扩展WebSecurityConfigurerAdapter 并覆盖其方法。 比较一下 Spring Security 和 Shiro 各自的优缺点 ?

由于 Spring Boot 官方提供了大量的非常方便的开箱即用的 Starter ,包括Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 变得更加容易,甚至只需要添加一个依赖就可以保护所有的接口,所以,如果是Spring Boot 项目,一般选择 Spring Security 。当然这只是一个建议的组合,单纯从技术上来说,无论怎么组合,都是没有问题的。 Shiro 和 Spring

Security 相比,主要有如下一些特点:

1. Spring Security 是一个重量级的安全管理框架; Shiro 则是一个轻量级的安全管理框架

2. Spring Security 概念复杂,配置繁琐; Shiro 概念简单、配置简单

3. Spring Security 功能强大; Shiro 功能简单

Spring Cloud 熔断机制介绍;

在 Spring Cloud 框架里,熔断机制通过 Hystrix 实现。 Hystrix 会监控微服务间调用的状况,当失 败的调用到一定阈值,缺省是 5 秒内 20 次调用失败,就会启动熔断机制。熔断机制的注解是@HystrixCommand , Hystrix 会找有这个注解的方法,并将这类方法关联到和熔断器连在一起 的代理上。当前, @HystrixCommand 仅当类的注解为 @Service 或 @Component 时才会发挥 作用。

Spring Cloud 对比下 Dubbo ,什么场景下该使用 SpringCloud ?

两者所解决的问题域不一样: Dubbo 的定位始终是一款 RPC 框架, 而 Spring Cloud 的目的是微 服务架构下的一站式解决方案 。

Spring Cloud 抛弃了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式。

严格来说,这两种方式各有优劣。虽然在一定程度上来说,后者牺牲了服务调用的性能,但也避 免了上面提到的原生 RPC 带来的问题。而且 REST 相比 RPC 更为灵活,服务提供方和调用方的依赖 只依靠一纸契约,不存在代码级别的强依赖,这在强调快速演化的微服务环境下,显得更为合 适。

Dubbo 2025

基础知识

为什么要用 Dubbo ?

Dubbo

随着服务化的进一步发展,服务越来越多,服务之间的调用和依赖关系也越来越 复杂,诞生了面向服务的架构体系 (SOA) ,也因此衍生出了一系列相应的技术,如对服务提供、服务调用、连接处理、通信协议、序列化方式、服务发现、服务 路由、日志输出等行为进行封装的服务框架。就这样为分布式系统的服务治理框 架就出现了, Dubbo 也就这样产生了。

是什么?

Dubbo 是一款高性能、轻量级的开源 RPC 框架,提供服务自动注册、自动发 现等高效服务治理方案, 可以和 Spring 框架无缝集成。

Dubbo 的使用场景有哪些?

透明化的远程方法调用:就像调用本地方法一样调用远程方法,只需简单配置, 没有任何 API 侵入。

软负载均衡及容错机制:可在内网替代 F5 等硬件负载均衡器,降低成本,减少 单点。

服务自动注册与发现:不再需要写死服务提供方地址,注册中心基于接口名查询 服务提供者的 IP 地址,并且能够平滑添加或删除服务提供者。

Dubbo 核心功能有哪些?

Remoting :网络通信框架,提供对多种 NIO 框架抽象封装,包括 “ 同步转异 步 ” 和 “ 请求 - 响应 ” 模式的信息交换方式。

Cluster :服务框架,提供基于接口方法的透明远程过程调用,包括多协议支 持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。

Registry :服务注册,基于注册中心目录服务,使服务消费方能动态的查找服务 提供方,使地址透明,使服务提供方可以平滑增加或减少机器。

架构设计

Dubbo 核心组件有哪些?

Mybatis 2025

JPA 原理

事务

事务是计算机应用中不可或缺的组件模型,它保证了用户操作的原子性 ( Atomicity ) 、一致性

( Consistency ) 、隔离性 ( Isolation ) 和持久性 ( Durabilily ) 。

本地事务

紧密依赖于底层资源管理器(例如数据库连接 ) ,事务处理局限在当前事务资源内。此种事务处理方式不存在对应用服务器的依赖,因而部署灵活却无法支持多数据源的分布式事务。在数据库连接中使用本地事务示例如下:

分布式事务

public void transferAccount {

Connection conn = null; Statement stmt = null;

try{

conn = getDataSource.getConnection;

// 将自动提交设置为 false,若设置为 true 则数据库将会把每一次数据更新认定为一个事务并自动提交

conn.setAutoCommit(false); stmt = conn.createStatement;

// 将 A 账户中的金额减少 500

stmt.execute("update t_account set amount = amount - 500 where account_id = 'A'");

// 将 B 账户中的金额增加 500

stmt.execute("update t_account set amount = amount + 500 where account_id = 'B'");

// 提交事务

conn.commit;

// 事务提交:转账的两步操作同时成功

} catch(SQLException sqle){

// 发生异常,回滚在本事务中的操做

conn.rollback;

// 事务回滚:转账的两步操作完全撤销

stmt.close; conn.close;

}

}

Java 事务编程接口( JTA : Java Transaction API )和 Java 事务服务 (JTS ; Java Transaction Service) 为 J2EE 平台提供了分布式事务服务。分布式事务( Distributed Transaction )包括事务管理器( Transaction Manager )和一个或多个支持 XA 协议的资源管理器 ( ResourceManager ) 。我们可以将资源管理器看做任意类型的持久化数据存储;事务管理器承担着所有事务参与单元的协调与控制。

两阶段提交

两阶段提交主要保证了分布式事务的原子性:即所有结点要么全做要么全不做,所谓的两个阶段是指:第一阶段:准备阶段;第二阶段:提交阶段。

Redis 2025

该策略可以 大化地节省 CPU 资源,却对内存非常不友好。极端情况可能出现大量的过期 key 没有再次被访问,从而不会被清除,占用大量内存。定期过期:每隔一定的时间,会

扫描一定数量的数据库的 expires 字典中一定数量的 key ,并清除其中已过期的 key 。该策略是前两者的一个折中方案。通过调整定

时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得 CPU 和内存资源达到 优的平衡效果。

(expires 字典会保存所有设置了过期时间的 key 的过期时间数据,其中, key 是指向键空间中的某个键的指针, value 是该键的毫秒精度的 UNIX 时间戳表示的过期时间。键空间是指该

网络 2025

计算机网络体系结构

在计算机网络的基本概念中,分层次的体系结构是基本的。计算机网络体系结构的抽象概念较多,在学习时要多思考。这些概念对后面的学习很有帮助。网络协议是什么?

在十算机网络要做到有条不紊地交换数据,就必须遵守一些事先约定好的规则,比如交换数据的格式、是否需要发送一个应答信息。这些规则被称为网络协议。为什么要对网络协议分层?

·简化问题难度和复杂度。由于各层之间独立,我们可以分割大问题为小问题。

·灵活性好。当其中一层的技术变化时,只要层间接口关系保持不变,其他层不受影响。·易于实现和维护。

·倔进标准化工作。分开后,每层功能可以相对简单地被描述。

网络协议分层的缺点∶功能可能出现在多个层里,产生了额外开销。为了使不同体系结构的计算机网络都能互联,国际标准化组织ISO于1977年提出了一个试图使各种计算机在世界范围内互联成网的标准框架,即著名的开放系统互联基本参考模型OSI/RM,简称为OSl.

OSl的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用,TCPIP体系结构则不同,但它现在却得到了非常广泛的应用。TCPIP是一个四层体系结构,它包含应用层,运输层,网际层和网路接口层(用阿际层这个名字是强调这一层是为了解决不同网络的互连问题),不过从实质上讲,TCPIP只有上面的三层,因为下面的网络接口层并没有什么具体内容,因此在学习计算机网络的原理时性往采用折中的力法,即综合OSI和TCPIP的优点,采用一种只有五层协议的体系结构,这样既简洁又能将概念阐述清楚,有时为了方便,也可把底下两层称为网络接口层。

·四层协议,五层协议和七层协议的关系如下:

· TCP/IP是一个四层的体系结构,主要包括:应用层、运输层、网际层和网络接口层。·五层协议的体系结构主要包括:应用层、运输层、网络层,数据链路层和物理层。

·OSI七层协议摸型主要包括是:应用层(Application)、表示层(Presentation)、会话层(Session)、运输层(Transport)、网络层(Network)、数据链路层

(Data Link)、物理层(Physical) .

MQ 2025

为什么使用 MQ ? MQ 的优点

简答

异步处理 - 相比于传统的串行、并行方式,提高了系统吞吐量。

应用解耦 - 系统间通过消息通信,不用关心其他系统的处理。

流量削锋 - 可以通过消息队列长度控制请求量;可以缓解短时间内的高并发请 求。

日志处理 - 解决大量日志传输。

消息通讯 - 消息队列一般都内置了高效的通信机制,因此也可以用在纯的消息通 讯。比如实现点对点消息队列,或者聊天室等。

详答

主要是:解耦、异步、削峰。

解耦:A系统发送数据到 BCD三个系统,通过接口调用发送,如果E系统也要这个数据呢?那如果C系统现在不需要了呢?A系统负责人几乎崩s.…..系统跟其它各种乱七八糟的系统严重耦合,A系统产生一条比较关键的数据,很多系统都需要A系统将这个数据发送过来。如果使用MQ,A系统产生一条数据,发送到MQ里面去,哪个系统需要数据自己去MQ里面消费。如果新系统需要数据,直接从MQ里消费即可;如果某个系统不需要这条数据了,就取消对MQ消息的消费即可。这样下来,A系统压根儿不需要去考虑要给谁发送数据,不需要维护这个代码,也不需要考虑人家是否调用成功、失败超时等情况。就是一个系统或者一个模块,调用了多个系统或者模块,互相之间的调用很复杂,维护起来很麻烦。但是其实这个调用是不需要直接同步调用接口的,如果用MQ给它异步化解耦。

异步:A系统接收一个请求,需要在自己本地写库,还需要在BCD三个系统写库,自己本地写库要3ms,BCD三个系统分别写库要30ms、 45Oms、20ms。最终请求总延时是3+300+450+200=953ms,接近1s,用户感觉搞个什么东西,慢死了慢死了。用户通过浏览器发起请求。如果使用MQ,那么A系统连续发送3条消息到MQ队列中,假如耗时5ms,A系统从接受一个请求到返回响应给用户,总时长是3+5= 8ms。

削峰:减少高峰时期对服务器压力。

消息队列有什么优缺点? RabbitMQ有什么优缺点?

优点上面已经说了,就是在特殊场景下有其对应的好处,解耦、异步、削峰。

缺点有以下几个:

系统可用性降低

本来系统运行好好的,现在你非要加入个消息队列进去,那消息队列挂了,你的系统不是呵呵了。因此,系统可用性会降低;系统复杂度提高

加入了消息队列,要多考虑很多方面的问题,比如:一致性问题、如何保证消息不被重复消费、如何保证消息可靠性传输等。因此,需要考虑的东西更多,复杂性增大.一致性问题

大数据 2025

Hadoop概念

就是一个大数据解决方案。它提供了一套分布式系统基础架构。核心内容包含hdfs和mapreduce。hadoop2.0以后引入yarn.hdfs是提供数据存储的,mapreduce是方便数据计算的。

1. hdfs又对应 namenode和datanode.namenode负责保存元数据的基本信息,datanode直接存放数据本身;2. mapreduce对应jobtracker和tasktracker. jobtracker负责分发任务,tasktracker负责执行具体任务;

3.对应到masterlslave架构,namenode和jobtracker就应该对应到master, datanode和tasktracker就应该对应到slave.

HDFS

Client

Client(代表用户)通过与NameNode和DataNode交互访问HDFS中的文件。Client提供了一个类似POS风的文件系统接口供用户调用。NameNode

整个Hadoop集群中只有一个NameNode,它是整个系统的”·总管',负责管理HDS 的目录树和相关的文件元数据信息。这些信息是以"fsimage"(HDFS元数据镜像文件)和" edtog"(HDFS文件改动日志)两个文件形式存放在本地磁盘,当HDS重启时重新构造出来的,此外,NameNode还负责监控各个DataNode 的健康状态,一旦发现某个DataNode宕掉,则将该DataNode移出 HDFS并重新备份其上面的数据。

Secondary NameNode

Secondry NameNocde最重要的任务并不是为NameNocde元数据进行热备份,而是定期合并fsimage和edis日志,并传输给NameNode,这里需要注意的是,为了减小NameNode压力,NameNode自己并不会合并fsimage和edits,并将文件存储到磁盘上,而是交由

Secondary NameNode完成。

DataNode

一股而言,每个Slave 节点上安装一个DataNode,它负责实际的数据存储,并将数据信息定期汇报给NameNode,DataNode以固定大小的block为基本单位组织文件内容,默认情况下block 大小y为64MB,当用户上传一个大的文件到HDFS上时,该文件会被切分成若干个block,分别存储到不同的DataNode;同时,为了保证数据可靠,会将同一个block以流水线方式写到若干个(默认是3,该参数可配置)不同的 DataNode上。这种文件切割后存储的过程是对用户透明的。

MapReduce

同HDFS一样,Hadop MapReduce 也采用了MasterSlave(MIS)架构,具体如图所示、它主要由以下几个组件组成:Client,JobTracker、TaskTracker和Task,下面分别对这几个组件进行介绍。

算法 2025设计模式 2025

因包含的内容过多,这里就不多给大家介绍了,下面就只能给大家展示小册包含的内容了。

这份面试笔记包括了:Java基础、JVM、多线程&并发、spring、mybatis、springboot、MySQL、springcloud、Dubbo、Nginx、MQ、数据结构与算法、Linux、Zookeeper、Redis篇、分布式、网络篇、设计模式等;

来源:大数据架构师

相关推荐