09 Java面试总结
文章
17.MySQL 的优化方案有哪些?
MySQL 的优化方案有哪些?性能优化(Optimize)指的是在保证系统正确性的前提下,能够更快速响应请求的一种手段。而且有些性能问题,比如慢查询等,如果积累到一定的程度或者是遇到急速上升的并发请求之后,会导致严重的后果,轻则造成服务繁忙,重则导致应用不可用。它对我们来说就像一颗即将被引爆的定时炸弹一样,时刻威胁着我们。因此在上线项目之前需要严格的把关,以确保 MySQL 能够以最优的状态进行运行。同时,在实际工作中还有面试中关于 MySQL 优化的知识点,都是面试官考察的重点内容。 我们本课时的面试题是,MySQL 的优化方案有哪些? 典型回答MySQL 数据库常见的优化手段分为三个层面:SQL和索引优化、数据库结构优化、系统硬件优化等,然而每个大的方向中又包含多个小的优化点,下面我们具体来看看。 1.SQL 和索引优化此优化方案指的是通过优化 SQL 语句以及索引来提高 MySQL 数据库的运行效率,具体内容如下。 1.使用正确的索引索引是数据库中最重要的概念之一,也是提高数据库性能最有效的手段之一,它的诞生本身就是为了提高数据查询效率的,就像字典的目录一样,通过目录可以很...
18.关系型数据和文档型数据库有什么区别?
关系型数据和文档型数据库有什么区别?关系数据库(Relational Database)是建立在关系模型基础上的数据库,借助于几何代数等数学概念和方法来处理数据库中的数据。所谓关系模型是一对一、一对多或者多对多等关系,常见的关系型数据库有 Oracle、SQL Server、DB2、MySQL 等。 而文档型数据库是一种非关系型数据库,非关系型数据库(Not Only SQL,NoSQL)正好与关系型数据库相反,它不是建立在“关系模型”上的数据库。文档型数据库的典型代表是 MongoDB。 我们本课时的面试题是,关系型数据库和文档型数据库有什么区别? 典型回答关系型数据库属于早期的传统型数据库,它有着标准化的数据模型,以及事务和持久化的支持、例如,关系型数据库都会支持的 ACID 特性,也就是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability),具体含义如下。 原子性(Atomicity):是指一个事务中的所有操作,要么全部完成、要么全部不完成,不会存在中间的状态。也就是说事务在正常的情况下会执行完成;异常...
19.Redis的过期策略和内存淘汰机制有什么区别?
Redis 的过期策略和内存淘汰机制有什么区别?Redis 和 MySQL 是面试绕不过的两座大山,他们一个是关系型数据库的代表(MySQL),一个是键值数据库以及缓存中间件的一哥。尤其 Redis 几乎是所有互联网公司都在用的技术,比如国内的 BATJ、新浪、360、小米等公司;国外的微软、Twitter、Stack Overflow、GitHub、暴雪等公司。有的公司用 MySQL、有的用 SQL Server、甚至还有的用 Oracle 和 DB2,但缓存无一例外使用的都是 Redis,从某种程度上来讲 Redis 是普及率最高的技术,没有之一。 我们本课时的面试题是,Redis 是如何处理过期数据的?当内存不够用时 Redis 又是如何处理的? 典型回答我们在新增 Redis 缓存时可以设置缓存的过期时间,该时间保证了数据在规定的时间内失效,可以借助这个特性来实现很多功能。比如,存储一定天数的用户(登录)会话信息,这样在一定范围内用户不用重复登录了,但为了安全性,需要在一定时间之后重新验证用户的信息。因此,我们可以使用 Redis 设置过期时间来存储用户的会话信息。 对于...
20.Redis怎样实现的分布式锁?
Redis 怎样实现的分布式锁?“锁”是我们实际工作和面试中无法避开的话题之一,正确使用锁可以保证高并发环境下程序的正确执行,也就是说只有使用锁才能保证多人同时访问时程序不会出现问题。 我们本课时的面试题是,什么是分布式锁?如何实现分布式锁? 典型回答第06篇时讲了单机锁的一些知识,包括悲观锁、乐观锁、可重入锁、共享锁和独占锁等内容,但它们都属于单机锁也就是程序级别的锁,如果在分布式环境下使用就会出现锁不生效的问题,因此我们需要使用分布式锁来解决这个问题。 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。是为了解决分布式系统中,不同的系统或是同一个系统的不同主机共享同一个资源的问题,它通常会采用互斥来保证程序的一致性,这就是分布式锁的用途以及执行原理。 分布式锁示意图,如下图所示: 分布式锁的常见实现方式有四种: 基于 MySQL 的悲观锁来实现分布式锁,这种方式使用的最少,因为这种实现方式的性能不好,且容易造成死锁; 基于 Memcached 实现分布式锁,可使用 add 方法来实现,如果添加成功了则表示分布式锁创建成功; 基于 Redis 实现分布式锁,这也是本课...
21.Redis中如何实现的消息队列?实现的方式有几种?
Redis 中如何实现的消息队列?实现的方式有几种?细心的你可能发现了,本系列课程中竟然出现了三篇都是在说消息队列,第10篇时讲了程序级别的消息队列以及延迟消息队列的实现,而第15篇讲了常见的消息队列中间件 RabbitMQ、Kafka 等,由此可见消息队列在整个 Java 技术体系中的重要程度。本课时我们将重点来看一下 Redis 是如何实现消息队列的。 我们本课时的面试题是,在 Redis 中实现消息队列的方式有几种? 典型回答早在 Redis 2.0 版本之前使用 Redis 实现消息队列的方式有两种: 使用 List 类型实现使用 ZSet 类型实现其中使用List 类型实现的方式最为简单和直接,它主要是通过 lpush、rpop 存入和读取实现消息队列的,如下图所示: lpush 可以把最新的消息存储到消息队列(List 集合)的首部,而 rpop 可以读取消息队列的尾部,这样就实现了先进先出,如下图所示: 命令行的实现命令如下: 12345678127.0.0.1:6379> lpush mq "java" #推送消息 java(inte...
22.Redis是如何实现高可用的?
Redis是如何实现高可用的?高可用是通过设计,减少系统不能提供服务的时间,是分布式系统的基础也是保障系统可靠性的重要手段。而 Redis 作为一款普及率最高的内存型中间件,它的高可用技术也非常的成熟。 我们本课时的面试题是,Redis 是如何保证系统高可用的?它的实现方式有哪些? 典型回答Redis 高可用的手段主要有以下四种: 数据持久化 主从数据同步(主从复制) Redis 哨兵模式(Sentinel) Redis 集群(Cluster) 其中数据持久化保证了系统在发生宕机或者重启之后数据不会丢失,增加了系统的可靠性和减少了系统不可用的时间(省去了手动恢复数据的过程);而主从数据同步可以将数据存储至多台服务器,这样当遇到一台服务器宕机之后,可以很快地切换至另一台服务器以继续提供服务;哨兵模式用于发生故障之后自动切换服务器;而 Redis 集群提供了多主多从的 Redis 分布式集群环境,用于提供性能更好的 Redis 服务,并且它自身拥有故障自动切换的能力。 考点分析高可用的问题属于 Redis 中比较大的面试题了,因为很多知识点都和这个面试题有关,同时也属于比较难的面...
23.JVM 的内存布局和运行原理
说一下 JVM 的内存布局和运行原理?JVM(Java Virtual Machine,Java 虚拟机)顾名思义就是用来执行 Java 程序的“虚拟主机”,实际的工作是将编译的 class 代码(字节码)翻译成底层操作系统可以运行的机器码并且进行调用执行,这也是 Java 程序能够“一次编写,到处运行”的原因(因为它会根据特定的操作系统生成对应的操作指令)。JVM 的功能很强大,像 Java 对象的创建、使用和销毁,还有垃圾回收以及某些高级的性能优化,例如,热点代码检测等功能都是在 JVM 中进行的。因为 JVM 是 Java 程序能够运行的根本,因此掌握 JVM 也已经成了一个合格 Java 程序员必备的技能。 我们本课时的面试题是,说一下 JVM 的内存布局和运行原理? 典型回答JVM 的种类有很多,比如 HotSpot 虚拟机,它是 Sun/OracleJDK 和 OpenJDK 中的默认 JVM,也是目前使用范围最广的 JVM。我们常说的 JVM 其实泛指的是 HotSpot 虚拟机,还有曾经与 HotSpot 齐名为“三大商业 JVM”的 JRockit 和...
24.垃圾回收算法有哪些?
垃圾回收算法有哪些?说到 Java 虚拟机不得不提的一个词就是**“垃圾回收”(GC,Garbage Collection)**,而垃圾回收的执行速度则影响着整个程序的执行效率,所以我们需要知道更多关于垃圾回收的具体执行细节,以便为我们选择合适的垃圾回收器提供理论持。 我们本课时的面试题是,如何判断一个对象是否“死亡”?垃圾回收的算法有哪些? 典型回答垃圾回收器首先要做的就是,判断一个对象是存活状态还是死亡状态,死亡的对象将会被标识为垃圾数据并等待收集器进行清除。 判断一个对象是否为死亡状态的常用算法有两个:引用计数器算法和可达性分析算法。 引用计数算法(Reference Counting) 属于垃圾收集器最早的实现算法了,它是指在创建对象时关联一个与之相对应的计数器,当此对象被使用时加 1,相反销毁时 -1。当此计数器为 0 时,则表示此对象未使用,可以被垃圾收集器回收。 引用计数算法的优缺点很明显,其优点是垃圾回收比较及时,实时性比较高,只要对象计数器为 0,则可以直接进行回收操作;而缺点是无法解决循环引用的问题,比如以下代码: 1234567891011121314151...
25.你用过哪些垃圾回收器?它们有什么区别?
你用过哪些垃圾回收器?它们有什么区别?上一课时我们讲了垃圾回收的理论知识,而本课时将介绍这些理论知识的具体实践。垃圾回收器也叫垃圾收集器,不同的厂商对垃圾收集器的实现也是不同的,这里主要介绍目前使用最广泛的 OracleJDK 中自带的 HotSpot 虚拟机中的几个垃圾收集器。 我们本课时的面试题是,你用过哪些垃圾回收器?它们有什么区别? 典型回答《Java 虚拟机规范》并没有对垃圾收集器的具体实现做任何的规定,因此每家垃圾收集器的实现方式都不同,但比较常用的垃圾回收器是 OracleJDK 中自带的 HotSpot 虚拟机。HotSpot 中使用的垃圾收集器主要包括 7 个:Serial、ParNew、Parallel Scavenge、Serial Old、Parallel Old、CMS 和 G1(Garbage First)收集器。 Serial 收集器属于最早期的垃圾收集器,也是 JDK 1.3 版本之前唯一的垃圾收集器。它是单线程运行的垃圾收集器,其单线程是指在进行垃圾回收时所有的工作线程必须暂停,直到垃圾回收结束为止,如下图所示: Serial 收集器的特点是...
27.单例的实现方式有几种?它们有什么优缺点?
单例的实现方式有几种?它们有什么优缺点?单例模式是 Java 中最简单的设计模式之一,它是指一个类在运行期间始终只有一个实例,我们就把它称之为单例模式。它不但被应用在实际的工作中,而且还是面试中最常考的题目之一。通过单例模式我们可以知道此人的编程风格,以及对于基础知识的掌握是否牢固。 我们本课时的面试题是,单例的实现方式有几种?它们有什么优缺点? 典型回答单例的实现分为饿汉模式和懒汉模式。 饿汉模式顾名思义,饿汉模式就好比他是一个饿汉,而且有一定的危机意识,他会提前把食物囤积好,以备饿了之后直接能吃到食物。对应到程序中指的是,在类加载时就会进行单例的初始化,以后访问时直接使用单例对象即可。 饿汉模式的实现代码如下: 12345678910111213141516171819202122public class Singleton { // 声明私有对象 private static Singleton instance = new Singleton(); // 获取实例(单例对象) public static Singleton get...














