美文网首页
百度面试题JVM+算法+Redis+数据库

百度面试题JVM+算法+Redis+数据库

作者: Lmson | 来源:发表于2018-08-13 07:41 被阅读0次

一面:

1.    Java中的多态

面向对象编程有三大特性:封装、继承、多态

多态:指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)

2.  为什么要同时重写hashcode和equals

1)、如果两个对象相同(即用equals比较返回true),那么它们的hashCode值一定要相同;

2)、如果两个对象的hashCode相同,它们并不一定相同(即用equals比较返回false)

由于为了提高程序的效率才实现了hashcode方法,先进行hashcode的比较,如果不同,那没就不必在进行equals的比较了,这样就大大减少了equals比较的次数,这对比需要比较的数量很大的效率提高是很明显的

3.  Hashmap的原理

HashMap由数组+链表组成的,数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表(当前entry的next指向null),那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

4.    Hashmap如何变线程安全,每种方式的优缺点

通过以下三种方法来实现:

1).替换成Hashtable,Hashtable通过对整个表上锁实现线程安全,因此效率比较低

2).使用Collections类的synchronizedMap方法包装一下。方法如下:

public static Map synchronizedMap(Map m)  返回由指定映射支持的同步(线程安全的)映射

3).使用ConcurrentHashMap,它使用分段锁来保证线程安全

通过前两种方式获得的线程安全的HashMap在读写数据的时候会对整个容器上锁,而ConcurrentHashMap并不需要对整个容器上锁,它只需要锁住要修改的部分就行了

5.    垃圾回收机制

图解Java 垃圾回收机制

Java 虚拟机内存模型分为:

      一部分是线程共享的,其中,线程共享的数据区包括方法区和堆,Java 堆的唯一目的就是存放对象实例,几乎所有的对象实例(和数组)都在这里分配内存。方法区与Java堆一样,也是线程共享的并且不需要连续的内存,其用于存储已被虚拟机加载的 类信息、常量、静态变量、即时编译器编译后的代码等数据。

      一部分则是线程私有的。线程私有的数据区包括虚拟机栈、本地方法栈和程序计数器。

6.    Jvm的参数你知道的说一下

7.    设计模式了解的说一下啊

8.    手写java多线程

9.    手写java的soeket编程,服务端和客户端

二面:

1.    服务器如何负载均衡,有哪些算法,哪个比较好,一致性哈希原理,怎么避免DDOS攻击请求打到少数机器。

2.  TCP连接中的三次握手和四次挥手,四次挥手的最后一个ack的作用是什么,为什么要time wait,为什么是2msl。

三次握手

第一次握手:主机A发送位码为syn=1,随机产生seq number=10001的数据包到服务器,主机B由SYN=1知道,A要求建立联机,此时状态为SYN_SENT; 

第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=20001的包,此时状态由LISTEN变为SYN_RECV; 

第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功,双方状态ESTABLISHED。

完成三次握手,主机A与主机B开始传送数据

为什么要time wait,为什么是2msl:而且握手的4个报文也都发送完毕,按理可以直接回到CLOSED 状态(就好比从SYN_SENT 状态到ESTABLISH 状态那样),但是我们必须假想网络是不可靠的,你无法保证你(客户端)最后发送的ACK报文一定会被对方收到,就是说对方处于LAST_ACK 状态下的SOCKET可能会因为超时未收到ACK报文,而重发FIN报文,所以这个TIME_WAIT 状态的作用就是用来重发可能丢失的ACK报文。

3.  数据库的备份和恢复怎么实现的,主从复制怎么做的,什么时候会出现数据不一致,如何解决。

数据不一致:1.网络的延迟;2.主从两台机器的负载不一致;3.max_allowed_packet设置不一致;4.key自增键开始的键值跟自增步长设置不一致引起的主从不一致;5.mysql异常宕机情况下,如果未设置sync_binlog=1或者innodb_flush_log_at_trx_commit=1很有可能出现binlog或者relaylog文件出现损坏,导致主从不一致;6.mysql本身的bug引起的主从不同步;7.版本不一致,特别是高版本是主,低版本为从的情况下,主数据库上面支持的功能,从数据库上面不支持该功能。

解决办法:方法一:忽略错误后,继续同步 该方法适用于主从库数据相差不大,或者要求数据可以不完全统一的情况,数据要求不严格的情况 方式二:重新做主从,完全同步 该方法适用于主从库数据相差较大,或者要求数据完全统一的情况;1.先进入主库,进行锁表,防止数据写入 mysql> flush tables with read lock; 2.进行数据备份 

主从复制 读取分离

4.  Linux查看cpu占用率高的进程

top 命令:查看进程级别的cpu使用情况。vmstat 命令:查看系统级别的cpu使用情况

9.    设计模式讲一下熟悉的

10. 会不会滥用设计模式

11. 多线程条件变量为什么要在while体里

12. 你遇到什么挫折,怎么应对和处理

三面:

1.    Redis的特点

redis是一个基于内存的高性能key-value数据库,支持string(字符串)  ,list(列表),hash(散列),sets (集合),sorted set(有序集合);

redis支持集群,分布式,支持主从的模式;

原则:

Master会将数据同步到slave,而slave不会将数据同步到master。Slave启动时会连接master来同步数据。

典型的读写分离模型。利用master来插入数据,slave提供检索服务。有效减少单个机器的并发访问数量。

  读写分离模型:

通过增加Slave DB的数量,读的性能可以线性增长,为了避免Master DB的单点故障,集群一般都会采用两台Master DB 做双机热备,所以整个集群的读和写的可用性都非常高。

  缺陷:

不管是Master还是Slave,每个节点都必须保存完整的数据,如果在数据量很大的情况下,集群的扩展能力是受限于单个节点的存储能力,而且对于Write-intensive类型的应用,读写分离架构并不适合。

为了解决读写分离模型的缺陷,可以将数分片模型应用进来。可以将每个节点看成都是master,然后通过业务实现数据分片。结合两种模型,可以将每个master设计成由一个master和多个slave组成的模型。

redis优点

  a.单线程,利用redis队列技术并将访问变为串行访问,消除了传统数据库串行控制的开销

  b.redis具有快速和持久化的特征,速度快,因为数据存在内存中。

  c.分布式 读写分离模式

  d.支持丰富数据类型

  e.支持事务,操作都是原子性,所谓原子性就是对数据的更改要么全部执行,要不全部不执行。

  f.可用于缓存,消息,按key设置过期时间,过期后自动删除

回收策略

  从最近最少使用的数据淘汰,挑选将要过期的数据淘汰。

redis和memcache相比,有哪些优势?

  a.memcache所有的值均是简单的字符串,redis支持更为丰富的数据类型

  b.redis速度比memcached快很多

  c.redis支持持久化

redis与memcache区别

  a.存储方式 memcache存在内存中,redis存在硬盘中,保证数据持久化

  b.数据类型 memcache对数据类型支持相对简单,redis有复杂的数据类型

  c.使用底层模型不同:底层实现方式以及客户端之间通信的应用协议不一样

  d.redis最大可以达到1G而memcache只有1MB

2.  Redis的持久化怎么做,aof和rdb,有什么区别,有什么优缺点。

redis提供了不同级别的持久化方式,一种是RDB,一种AOF。可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.

RDB:在指定的时间间隔能对数据进行快照存储(隔一段时间,把内存里的数据转存在硬盘里的文件)

 优点:

1)RDB是一个非常紧凑的文件,它保存了某个时间点得数据集,非常适用于数据集的备份,比如您可以在每个小时报保存一下过去24小时内的数据,同时每天保存过去30天的数据,这样即使出了问题您也可以根据需求恢复到不同版本的数据集.

2)与AOF相比,在恢复大的数据集的时候,RDB方式会更快一些.

缺点:

如果您希望在redis意外停止工作(例如电源中断)的情况下丢失的数据最少的话,那么RDB不适合您.虽然您可以配置不同的save时间点(例如每隔5分钟并且对数据集有100个写的操作),是Redis要完整的保存整个数据集是一个比较繁重的工作,您通常会每隔5分钟或者更久做一次完整的保存,万一在Redis意外宕机,您可能会丢失几分钟的数据.

AOF:每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.

优点:

使用AOF 会让您的Redis更加耐久: 您可以使用不同的fsync策略:无fsync,每秒fsync,每次写的时候fsync.使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求),一旦出现故障,您最多丢失1秒的数据.

缺点:

对于相同的数据集来说,AOF 文件的体积通常要大于RDB 文件的体积。

根据所使用的 fsync 策略,AOF 的速度可能会慢于 RDB 。 在一般情况下, 每秒 fsync 的性能依然非常高, 而关闭 fsync 可以让 AOF 的速度和 RDB 一样快, 即使在高负荷之下也是如此。 不过在处理巨大的写入载入时,RDB 可以提供更有保证的最大延迟时间(latency)。

3.  Redis使用哨兵部署会有什么问题,我说需要扩容的话还是得集群部署。

4.  说一下JVM内存模型把,有哪些区,分别干什么的

5.  说一下gc算法,分代回收说下

6.  MySQL的引擎讲一下,有什么区别,使用场景呢

在MySQL数据库中,常用的引擎主要就是2个:Innodb和MyIASM。

Innodb引擎,1)Innodb引擎提供了对数据库ACID事务的支持。并且还提供了行级锁和外键的约束。它的设计的目标就是处理大数据容量的数据库系统。2)大容量的数据集时趋向于选择Innodb。因为它支持事务处理和故障的恢复。Innodb可以利用数据日志来进行数据的恢复。主键的查询在Innodb也是比较快的。3)Innodb引擎的索引的数据结构也是B+树,只不过数据结构中存储的都是实际的数据,这种索引有被称为聚集索引。4)Select count(*) from table指令的时候,需要进行扫描全表

MyIASM引擎,1)它是MySql的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行Insert插入和Update更新语句时,即执行写操作的时候需要锁定这个表。所以会导致效率会降低。2)大批量的插入语句时(这里是INSERT语句)在MyIASM引擎中执行的比较的快,但是UPDATE语句在Innodb下执行的会比较的快,尤其是在并发量大的时候。3)MyIASM引擎,B+树的数据结构中存储的内容实际上是实际数据的地址值。也就是说它的索引和实际数据是分开的,只不过使用索引指向了实际数据。这种索引的模式被称为非聚集索引。4)Select count(*) from table语句时,可以直接的读取已经保存的值而不需要进行扫描全表

分布式事务了解么

微服务架构下分布式事务解决方案——阿里GTS

相关文章

网友评论

      本文标题:百度面试题JVM+算法+Redis+数据库

      本文链接:https://www.haomeiwen.com/subject/ixpebftx.html