BAJT 中高级 Java 面试题答案

1、请问你做过哪些JVM优化?使用什么方法达到什么效果???
vm调优主要也就是内存空间的分配
最终策略:提高系统性能
主要策略有
1.增加eden空间,让更多的对象留在年轻代。
2.大对象直接放到老年代,以免扰乱年轻代高频率的gc。(XX:PetenureSizeThreshold设置大对象直接进入年老代的阈值)
并且尽量避免使用短时间存在的大对象。
3.合理调整进入老年代的年龄
4.稳定的堆大小对垃圾回收是有利的。获得一个稳定的堆大小的方法是使-Xms 和-Xmx 的大小一致,即最大堆和最小堆 (初始堆) 一样。如果这样设置,系统在运行时堆大小理论上是恒定的,稳定的堆空间可以减少 GC 的次数。
5.调整内存分页(真实内存虚拟内存)
6.选用合适的gc

2、探查Tomcat的运行机制即框架?

3、Tomcat系统参数认识和调优?
4、SQL执行计划详解,SQL语句如如如何优化?
5、常见的有b tree b+tree 散列 通讯R-树
B+tree和B Tree的区别
** B Tree索引结构:
一个根节点 可以有数据可以没有 且根节点只能储存一个数据
设定一个宽度 作为每个节点存储的数据 设为d
每个子节点有d/2到d-1个数据 有对应数据数+1的指针(孩子节点)
每个个节点储存的数据都是从左到右按大小排列的

6、MySQL有哪些存储引擎啊?都有啥区别? 要详细!
MyISAM
这种引擎是mysql最早提供的。这种引擎又可以分为静态MyISAM、动态MyISAM 和压缩MyISAM三种:
** 静态MyISAM:如果数据表中的各数据列的长度都是预先固定好的,服务器将自动选择这种表类型。因为数据表中每一条记录所占用的空间都是一样的,所以这种表存取和更新的效率非常高。当数据受损时,恢复工作也比较容易做。
** 动态MyISAM:如果数据表中出现varchar、xxxtext或xxxBLOB字段时,服务器将自动选择这种表类型。相对于静态MyISAM,这种表存储空间比较小,但由于每条记录的长度不一,所以多次修改数据后,数据表中的数据就可能离散的存储在内存中,进而导致执行效率下降。同时,内存中也可能会出现很多碎片。因此,这种类型的表要经常用optimize table 命令或优化工具来进行碎片整理。
** 压缩MyISAM:以上说到的两种类型的表都可以用myisamchk工具压缩。这种类型的表进一步减小了占用的存储,但是这种表压缩之后不能再被修改。另外,因为是压缩数据,所以这种表在读取的时候要先时行解压缩。
MyISAM Merge引擎:这种类型是MyISAM类型的一种变种。合并表是将几个相同的MyISAM表合并为一个虚表。常应用于日志和数据仓库。
InnoDB:InnoDB表类型可以看作是对MyISAM的进一步更新产品,它提供了事务、行级锁机制和外键约束的功能。
memory(heap):这种类型的数据表只存在于内存中。它使用散列索引,所以数据的存取速度非常快。因为是存在于内存中,所以这种类型常应用于临时表中。
archive:这种类型只支持select 和 insert语句,而且不支持索引。常应用于日志记录和聚合分析方面。

7、设计高并发系统数据库层面该怎么设计??数据库锁有哪些类型?如何实现呀?
高并发设计
数据库层面随着并发量和访问量的增加,会经历一系列转型

  1. WEB应用和数据库部署在同一台服务器上:用户量、数据量、并发访问量都比较小
  2. WEB应用和数据库部署在各自独立的服务器上:在系统访问量增加的时候可以分别升级应用服务器和数据库服务器,这种部署方式是一般小规模网站的典型部署方式。
  3. 数据库服务器采用集群方式部署:数据库集群方式能承担的负载是比较大的,数据库物理介质为一个磁盘阵列,多个数据库实例以虚拟IP方式向外部应用服务器提供数据库连接服务。这种部署方式基本上可以满足绝大多数的常见WEB应用,但是还是不能满足大用户量、高负载、数据库读写访问非常频繁的应用。
  4. 数据库采用主从部署方式:在面向大众用户的博客、论谈、交友、CMS等系统中,有上百万的用户,有上千万的数据量,存在众多的数据库查询操作,也有较多的数据库写操作,并且在多数情况下都是读操作远大于写操作的。于是就有了主从不熟。
    ** 主从复制:
    几乎所有的主流数据库都支持复制,这是进行数据库简单扩展的基本手段。下面以Mysql为例来说明,它支持主从复制,配置也并不复杂,只需要开启主服务器上的二进制日志以及在主服务器和从服务器上分别进行简单的配置和授权。Mysql的主从复制是一句主服务器的二进制日志文件进行的,主服务器日志中记录的操作会在从服务器上重放,从而实现复制,所以主服务器必须开启二进制日志,自动记录所有对于主数据库的更新操作,从服务器再定时到主服务器取得二进制日志文件进行重放则完成了数据的复制。主从复制也用于自动备份。
    ** 读写分离:
    为保证数据库数据的一致性,我们要求所有对于数据库的更新操作都是针对主数据库的,但是读操作是可以针对从数据库来进行。大多数站点的数据库读操作比写操作更加密集,而且查询条件相对复杂,数据库的大部分性能消耗在查询操作上了。
    主从复制数据是异步完成的,这就导致主从数据库中的数据有一定的延迟,在读写分离的设计中必须要考虑这一点。以博客为例,用户登录后发表了一篇文章,他需要马上看到自己的文章,但是对于其它用户来讲可以允许延迟一段时间(1分钟/5分钟/30分钟),不会造成什么问题。这时对于当前用户就需要读主数据库,对于其他访问量更大的外部用户就可以读从数据库。
    ** 数据库反向代理:
    在读写分离的方式使用主从部署方式的数据库的时候,会遇到一个问题,一个主数据库对应多台从服务器,对于写操作是针对主数据库的,数据库个数是唯一的,但是对于从服务器的读操作就需要使用适当的算法来分配请求啦,尤其对于多个从服务器的配置不一样的时候甚至需要读操作按照权重来分配。
    对于上述问题可以使用数据库反向代理来实现。就像WEB反向代理服务器一样,MYsql Proxy同样可以在SQL语句转发到后端的Mysql服务器之前对它进行修改。
  5. 数据库垂直分割:主从部署数据库中,当写操作占了主数据库的CPU消耗的50%以上的时候,我们再增加从服务器的意义就不是很大了,因为所有的从服务器的写操作也将占到CPU消耗的50%以上,一台从服务器提供出来查询的资源非常有限。数据库就需要重新架构了,我们需要采用数据库垂直分区技术啦。
    最简单的垂直分区方式是将原来的数据库中独立的业务进行分拆(被分拆出来的部分与其它部分不需要进行Join连接查询操作),比如WEB站点的BLOG和论坛,是相对独立的,与其它的数据的关联性不是很强,这时可以将原来的的数据库拆分为一个BLog库,一个论坛库,以及剩余的表所组成的库。这三个库再各自进行主从数据库方式部署,这样整个数据库的压力就分担啦。
    另外查询扩展性也是采用数据库分区最主要的原因之一。将一个大的数据库分成多个小的数据库可以提高查询的性能,因为每个数据库分区拥有自己的一小部分数据。假设您想扫描1亿条记录,对一个单一分区的数据库来讲,该扫描操作需要数据库管理器独立扫描一亿条记录,如果您将数据库系统做成50个分区,并将这1亿条记录平均分配到这50个分区上,那么每个数据库分区的数据库管理器将只扫描200万记录。
  6. 数据库水平分割:在数据库的垂直分区之后,假如我们的BLOG库又再次无法承担写操作的时候,我们又该怎么办呢?数据库垂直分区这种扩展方式又无能为力了,我们需要的是水平分区。
    水平分区意味着我们可以将同一个数据库表中的记录通过特定的算法进行分离,分别保存在不同的数据库表中,从而可以部署在不同的数据库服务器上。很多的大规模的站点基本上都是主从复制+垂直分区+水平分区这样的架构。水平分区并不依赖什么特定的技术,完全是逻辑层面的规划,需要的是经验和业务的细分。
    如何分区呢?对于大型的WEB站点来说,必须分区,并且对于分区我们没有选择的余地,对于那些频繁访问导致站点接近崩溃的热点数据,我们必须分区。
    在对数据分区的时候,我们必须要存在一个分区索引字段,比如USER_ID,它必须和所有的记录都存在关系,是分区数据库中的核心表的主键,在其它表中作为外键,并且在使用主键的时候,该主键不能是自增长的,必须是业务主键才可以。
    数据库锁
    共享(S)锁:多个事务可封锁一个共享页;任何事务都不能修改该页; 通常是该页被读取完毕,S锁立即被释放。
    排它(X)锁:仅允许一个事务封锁此页;其他任何事务必须等到X锁被释放才能对该页进行访问;X锁一直到事务结束才能被释放。
    更新(U)锁:用来预定要对此页施加X锁,它允许其他事务读,但不允许再施加U锁或X锁;当被读取的页将要被更新时,则升级为X锁;U锁一直到事务结束时才能被释放。

8、数据库事务有哪些?
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列操作,要么完全地执行,要么完全地不执行。

  1. 事务是作为一个逻辑单元执行的一系列操作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,只有这样才能成为一个事务:
    原子性
  2. 事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。
    一致性
  3. 事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。
    隔离性
  4. 由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它 之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态 相同。
    持久性
  5. 事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。
    开启事务start transaction
    回滚事务rollback
    提交事务commit
    多线程事务问题
  6. 脏读:A事务读取B事务尚未提交的更改数据
  7. 不可重复读:不可重复读是指A事务读取了B事务已经提交的更改数据
  8. 幻读:A事务读取B事务提交的新增数据
  9. 第一类丢失更新:A事务撤销时,把已经提交的B事务的更新数据覆盖了。
  10. 第二类丢失更新:A事务覆盖B事务已经提交的数据,造成B事务所做的操作丢失
    事务隔离级别

9、数据库类

(1)使用 mysql 索引都有哪些原则?索引什么数据结构? B+tree 和 B tree 什么区别?
(2)mysql 有哪些存储引擎啊?都有啥区别?要详细!
(3)设计高并发系统数据库层面该怎么设计?
(4)数据库锁有哪些类型?如何实现?
(5)数据库事务有哪些?

10、分库分表类

(1)如何设计可以动态扩容缩容的分库分表方案?
(2)过哪些分库分表中间件,有啥优点和缺点,讲一下你了解的分库分表中间件的底层实现原理?
(3)未分库分表的系统,以后系统需分库分表,如何设计,让未分库分表的系统动态切换到分库分表的系统
(4)分布式事务知道吗?你们怎么解决的? TCC?那若出现网络原因,网络连不通怎么办?
(5)为什么需要分库分表?
(6)分布式寻址方式都有哪些算法?知道一致性hash吗?手写一下java实现代码?你若 userId取摸分片,那我要查一段连续时间里的数据怎么办?
(7)如何解决分库分表主键问题?有什么实现方案?

11、分布式缓存
(1)redis 和 memcheched 什么区别?为什么单线程的 redis比多线程的 memched效率要高?
(2)redis 有哪几种数据类型?都在哪些场景下使用?
(3)reids 的主从复制是怎么实现的 redis 的集群模式是如何实现的?redis 的key是如何寻址的
(4)使用 redis 如何设计分布式锁使用zk可以吗?如何实现啊?这两种哪个效率更高?
(5)知道 redis 的持久化吗?都有什么缺点优点? 具体底层实现?
(6)redis 过期策略都有哪些? LRU?写一下java版本的代码吧

12、分布式服务框架
(1)说一下 dubbo 的实现过程?注册中心挂了可以继续通信吗?
(2)zk原理知道吗?zk都可以干什么? Paxos算法知道吗?说一下原理和实现?
(3)dubbo支持哪些序列化协议 ?hessian?hessian的数据结构知道吗?为啥PB效率是最高的?
(4)知道 netty 吗?netty 可以干什么呀 NIO,BIO,AIO都是什么?有什么区别?
(5)dubbo负载均衡策略和高可用策略都有哪些?动态代理策略?
(6)为什么要进行系统拆分啊拆分不用 dubbo 可以吗?dubbo 和 thrift 什么区别?

13、分布式消息队列

(1)为什么使用消息队列啊?消息队列有什么优点和缺点?
(2)如何保证消息队列的高可用啊?如何保证消息不被重复消费?
(3)kafka, activemq, rabbitmq, rocketmq都有什么优点,缺点?
(4)如果让你写个消息队列 ,该如何进行架构设计?说一下你的思路

14、分布式搜索引擎
(1)es的工作过程实现是如何的?如何实现分布式的
(2)es在数据量很大的情况下(数十亿级别)如何提高查询效率?
(3)es的查询是一个怎么的工作过程?底层的Lucence介绍一下呗?倒排索 引知道吗?
(4)es和mongdb什么区别?都在什么场景下使用?

15、高并发高可用架构设计
(1)如何设计一个高并发高可用系统?
(2)如何限流?工程中怎么做的,说一下具体实现?
缓存如何使用的?缓存使用不当会造成什么后果?
如何熔断啊?熔断框架都有哪些?具体实现原理知道吗?
如何降级?如何进行系统拆分,如何数据库拆分?

16、通信协议
(1)说一下TCP/IP四层?
(2)http的工作流程? http1.0 http1.1 http2.0具体哪些区别?
(3)TCP三次握手,四层分手的工作流程?画一下流程图?为什么不是四次五次或者二次?
(4)画一下https的工作流程?具体如何实现啊?如何防止被抓包?

17、JVM
(1)介绍一下JVM内存模型 ??用过什么垃圾回收器?
(2)线上发送频繁full gc如何处理? CPU 使用率过高怎么办?如何定位问题?如何解决?说一下解决思路和处理方法。
(3)知道字节码吗?字节码都有哪些? Integer X= 5,int y =5,比较X== y 都经过哪些步骤?
(4)讲讲类加载机制?都有哪些类加载器,这些类加载器都加载哪些文件?手写一下类加载Demo
你做过哪些JVM优化?使用什么方法?达到什么效果?
(5)class.forName(“java.lang.String”) 和 String.class.getClassLoader().LoadClass(“java.lang.String”) 什么区别?

75 道 BAJT 中高级 Java 面试题答案(2) :http://www.360linker.com/rjkf/742.jhtml

http://www.360linker.com/rjkf/740.jhtml
http://www.360linker.com/rjkf/741.jhtml

https://mp.weixin.qq.com/s/FahZnY1o61TntCuwbZl2tw

猜你喜欢

转载自blog.csdn.net/qq_40907977/article/details/88390997