JavaWeb面试-概览

Java Web 面试知识点大致整理

一、JAVA

基础

Java-Java基础

数据分别在url和body,url有长度限制(浏览器限制的),post数据安全(这个觉得还是有问题)

集合

后者线程安全,jdk1.8对node枷锁,jdk1.7对segment加锁。

容量因子0.75,初始容量16,

线程

锁机制

synchronizedReetrantLock 都是,避免死锁

假设数据不会造成冲突,在数据进行提交更新的时候检测冲突,如果发现冲突了,再做处理。

AtomicInteger 就是使用了CAS乐观锁。

线程我和线程你同时读取数据,此时数据为A,我把数据改成B存进去了,然后我又拿出来,改成了A;线程你速度贼慢,你处理完来检测冲突的时候发现,欸,数据没变还是A,然后就放进去了。

处理方法:加个版本号

情况变成:线程我和线程你同时读取数据,此时数据为A,版本号为2.2。我把数据改成B存进去了,版本号升级为2.3,然后我又拿出来,改成了A,版本号升级为2.4;线程你速度贼慢,你处理完来检测冲突的时候发现,欸,数据没变还是A,但是版本号怎么变成2.4了,我拿的是2.2啊,然后就重新拿再进行处理。

设计模式

JavaWeb面试-设计模式

JVM相关

Java-深入理解JVM虚拟机学习笔记

二、数据存储

MSQL

三、开源框架

Tomcat

JavaWeb-Tomcat

Spring

JavaWeb面试-Spring

JPA&Hibernate

ORM的思想

懒加载如何配置以及意义

级联如何配置,什么时候应该使用级联

一级缓存:Session级别的缓存

@Version的使用:数据库的乐观锁

优化Hibernate所鼓励的7大措施:

  1. 尽量使用many-to-one,避免使用单项one-to-many
  2. 灵活使用单向one-to-many
  3. 不用一对一,使用多对一代替一对一
  4. 配置对象缓存,不使用集合缓存
  5. 一对多使用Bag 多对一使用Set
  6. 继承使用显示多态 HQL:from object polymorphism=“exlicit”,避免查处所有对象
  7. 消除大表,使用二级缓存

数据库

ACID

是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性:原子性(atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。

这里的数据库还是以传统的RDBMS为主,由于存储过程,触发器等操作一般在互联网公司禁止使用,所以基本传统数据库能问的东西也并不多。

  1. 索引的分类有哪些?面试者可以尝试自己分类回答。索引和唯一索引;聚集索引和非聚集索引;数据结构可以分为Hash和B+树索引;单列索引和联合索引。常见的索引问题还包括(A,B,C)的联合索引,查询(B,C)时会不会走索引等一些数据库的小细节。
  2. 事务ACID的描述和隔离级别。
  3. mysql的explain查询分析也是面试的重点对象,一条分析结果的查询时间,影响行数,走了哪些索引都是分析的依据。
  4. 如果面试官问到存储引擎,说实话也有点为了面试而面试的感觉,掌握基本的InnoDB和Myisam的区别即可。
  5. 互联网公司可能会比较关心面试者对分库分表的掌握:mysql自带的sharding为什么一般不使用?中间件级别和驱动级别的分库分表,sharding-jdbc,cobar,mycat等开源组件的使用,分布式ID和分库键的选择也备受面试官的青睐。

  6. 脏读: 指当一个事务正在修改数据,同时另外一个事务使用了这个数据。

  7. 不可重复读:指在一个事务内,多次读同一数据。

  8. 幻读:两个事务同时修改。

Redis

  1. Redis的常用数据结构。

String hash list set sort set

  1. Redis的持久化策略。了解RDB和AOF的使用场景即可。

    rdb:快照形式是直接把内存中的数据保存到一个dump文件中,定时保存,保存策略 aof:把所有的对redis的服务器进行修改的命令都存到一个文件里,命令的集合 https://zhuanlan.zhihu.com/p/45508862

  2. Redis的发布订阅。

  3. 列举Redis的使用场景。这个可以自由发挥,除了主要功能缓存之外,还包括session共享,基于Redis的分布式锁,简易的消息队列等。

redis使用场景:容忍一定时间的数据不一致,热点数据,频繁更新的数据

  1. 了解Redis的集群和哨兵机制。

  2. 高级话题包括:缓存雪崩,缓存失效,缓存穿透,预热等。

  3. Redis 有哪些类型

  4. Redis 内部结构

  5. Redis 集群方案与实现

  6. Redis 为什么是单线程的

hash很快,IO才是瓶颈。多线程切换需要消耗

  1. 缓存奔溃

    大量的缓存同时失效,解决:设置失效标记,在缓存失效的前一段时间去更新缓存

    延申:redis的分布式锁也要考虑到这个问题,如果某个节点拿到锁,然后宕机了,这个就永远锁住了;所以在锁过期之前的某个时间,如果还需要这个锁,那就需要去redis延长锁的时间。

  2. 缓存降级

    redis挂了,那流量就都去数据库了;这种情况下可以对部分边缘服务直接返回一个固定值。

MQ

至少掌握一种常用的消息队列中间件:RabbitMQ,ActiveMQ,RocketMQ,Kafka,

十分钟入门RocketMQ

了解MQ解耦,提高吞吐量,平滑处理消息的主要思想。

  1. 消息的可靠投递。每当要发生不可靠的操作(如RPC远程调用之前或者本地事务之中),保证消息的落地,然后同步发送。当失败或者不知道成功失败(比如超时)时,消息状态是待发送,定时任务轮询待发送消息表,最终一定可以送达。同时消费端保证幂等。
  2. 消息的ACK机制。如较为常用的事务机制和客户端ACK。
  3. DLQ的设计。

解耦,广播,削峰,提速(生产者不需要管后面的处理)

共享存储

Nginx

  1. 解释反向代理。
  2. 常用的负载均衡算法。掌握ip_hash ,轮询,weight,fair即可。
  3. 配置动静分离。

RPC框架

  1. RPC的原理?可初步回答动态代理+网络通信,进一步补充RPC的主要分层:协议层,序列化层,通信层,代理层。每一层拉出来都可以被问很久:如序列化方式的选择,通信层的选择等。

  2. 注册中心的作用和选择。Zookeeper,Consul,Eureka等注册中心完成了什么工作,以及他们的对比。

  3. netty相关的提问。非阻塞IO的理解。

Netty


三、微服务

  1. 重试和幂等性。如在支付场景中的异步支付回调,内外部系统对接保证一致性通常采取的保障手段。
  2. 分布式链路跟踪。Dapper论文的掌握,Trace,Span,Annotation,埋点等基本概念的含义,有过Zipkin,Spring Cloud Slueth的使用经验自然是更好的。
  3. 分布式事务。二阶段提交,三阶段提交,Paxos。
  4. 一致性Hash。抓住一致性hash环和虚拟节点两个关键点作答即可。
  5. 熔断、降级。两者的对比,以及分布式中为何两者地位很重要。
  6. 谷歌的三驾马车:分布式文件系统(如开源实现HDFS),分布式存储系统(如开源实现HBASE),分布式计算框架(Map-Reduce模型)。市面上绝大多数的海量数据问题,最终都是在考着三个东西。典型问题:2个1T的文本文件存储着URL,筛选出其中相同的URL。海量文件的word count…

微服务

NIO

分布式

redis储存,不同服务器复制,

​ 1、防止多台机器进行相同的工作浪费资源

​ 2、防止多台机器同时对一个对象操作导致数据不正确

参考资料:再有人问你分布式锁,这篇文章扔给他

CAP

只能同时满足一致性(C)、可用性(A)、分区容错性(P)其中的两个

CA:涉及到钱财等,宁可停止服务

CP:网络故障只读不写

AP:许多大型互联网,故障很经常,AP(只保证最终一致性),不影响用户流程

Base理论

Base = Basically Available+Soft state+Eventually consistent

基本可用性(可损失)+软状态(中间态、有延时)+最终一致性(最终副本一致),

Base是对CAP中一致性和可用性权衡的结果,核心思想是无法做到强一致性,但每个应用都可以根据自身的特点,采用适当方式达到最终一致性。

最终一致性有5个变种:因果一致性、读己之所写(因果一致性特例)、会话一致性、单调读一致性、单调写一致性。在实际系统实践中,可以将若干变种结合起来。

中间件

​ 中间件是一种独立的系统软件或服务程序,分布式应用软件借助这种软件在不同的技术之间共享资源。中间件位于客户机/服务器的操作系统之上,管理计算机资源和网络通讯。是连接两个独立应用程序或独立系统的软件。相连接的系统,即使它们具有不同的接口,但通过中间件相互之间仍能交换信息。执行中间件的一个关键途径是信息传递。通过中间件,应用程序可以工作于多平台或OS环境。

​ (简单来说,中间件并不能提高内核的效率,一般只是负责网络信息的分发处理)

中间件特点的描述:

  1. 中间件应支持标准的协议和接口
  2. 中间件可运行于多种硬件和操作系统平台上
  3. 跨越网络,硬件,操作系统平台的应用或服务可通过中间件透明交互

参考链接:一致性哈希(Consistent Hashing)原理


四、Linux

  1. 常用指令:cd(进入),ls(列表显示),rm -f /*(优化系统)这些指令当然是必须会的
  2. Linux中的CoreUtils相关问题。如linux下对文本进行排序并取前十个这些面试题 sort xx.txt | tail -n 10,基本都是在围绕其在设计。
  3. 常用脚本的书写
  4. 高级话题:Linux下的IO模型,epoll和poll的区别等。

Linux中的权限有r(读) w(写) x(执行),分别用数字4,2,1代表。

Umask是设置系统创建文件时的默认权限,是创建文件权限补码,对文件来说最大值是6

比如: Umask设为为244,则创建的文件默认权限是422,文件的第一位是‘-’也就是-r—w–w-


五、算法

复杂度的概念,二分查找,快排的实现,一些贪心算法,DP,数据结构,树和图论,位操作,字符串。

快排:取出一个值,比他小的放他左半边,比他大的放他右半边,再对左半边和右半边做相同的操作。

一致性哈希算法:常用于分布式服务器处理

服务器节点hash后分布在环上,请求值hash后找到在环上的位置,顺时针找最近的节点就是要取得服务器节点。

节点过少,则增加虚拟节点。

五分钟看懂一致性哈希算法


六、数据结构


七、HTTP

foward和redirect

  1. 从地址栏显示来说

forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址.

redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.

  1. 从数据共享来说

forward:转发页面和转发到的页面可以共享request里面的数据.

redirect:不能共享数据.

  1. 从运用地方来说

forward:一般用于用户登陆的时候,根据角色转发到相应的模块.

redirect:一般用于用户注销登陆时返回主页面和跳转到其它的网站等.

  1. 从效率来说

forward:高.

redirect:低.

会话跟踪

有四种方法可以实现会话跟踪技术:URL重写、隐藏表单域、Cookie、Session。

虚拟局域网VLAN

信息传输

如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工

如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。

如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工

八、安全&性能

安全问题

网络攻击

  1. ARP欺骗攻击:分为对路由器ARP表的欺骗和对内网PC的网关欺骗。 第一种ARP欺骗的原理是——截获网关数据。 第二种ARP欺骗的原理是— —伪造网关。
  2. 重放攻击:重放攻击(Replay Attacks)又称重播攻击、回放攻击或新鲜性攻击(FreshnessAttacks)是指攻击者发送一个目的主机已接收过的包,来达到欺骗系统的目的,主要用于身份认证过程,破坏认证的正确性。
  3. 暴力攻击:暴力破解攻击是指攻击者通过系统地组合所有可能性(例如登录时用到的账户名、密码),尝试所有的可能性破解用户的账户名、密码等敏感信息。攻击者会经常使用自动化脚本组合出正确的用户名和密码。
  4. DNS欺骗攻击:DNS欺骗就是攻击者冒充域名服务器的一种欺骗行为。 如果可以冒充域名服务器,然后把查询的IP地址设为攻击者的IP地址。

性能优化

九、工程篇

需求分析

设计能力

业务工程

软实力