彗安金科Java面试(部分)

  • JVM新生代为什么要有两个Survivor区?参考答案1:用复制算法回收的效率会更高,也不会产生内存碎片。而复制算法的代价就是要将内存折半。(我:为什么标记-整理算法不行?)

  • -Xms:堆的最小值。-Xmx:堆的最大值。-Xss:栈容量

  • G1的优点?答:更短的停顿时间,以及可预测的停顿时间。
    G1在后台维护了⼀个优先列表,每次根据允许的收集时间,优先选择回收价值最⼤的Region。这种使⽤ Region 划分内存空间以及有优先级的区域回收⽅式,保证了 G1 收集器在有限时间内尽可能⾼的收集效率。

  • 当查找hashmap的元素时,是如何使用equals和hashcode这两个方法的?
    答:定位到数组中的位置后,先比较hashcode,若相同再比较key是否==,若key==再看equals是否为true。一处相关源码如下:

 first.hash == hash && // first node为链表头
                ((k = first.key) == key || (key != null && key.equals(k)))
  • Concurrenthashmap的写方法是怎么利用CAS和synchronized来加锁的?
    CAS:当判断数组中当前位置为空,使用CAS来把这个新的Node写入;
    synchronized :否则,用synchronized对链表头加锁

  • Spring ioc是如何实现的?
    参考答案: Spring ioc的初始化可大致分为三步:23

Resource定位 (将指定位置的资源文件解析转化为Resource)。

将Resource解析为BeanDefinition。(BeanDefinition 中保存了我们的 Bean 信息,比如这个 Bean 指向的是哪个类、是否是单例的、是否懒加载、这个 Bean 依赖了哪些 Bean 等等。)

将BeanDefinition注册到IOC容器,最终保存在map中,即this.beanDefinitionMap.put(beanName, beanDefinition); 相关方法: loadBeanDefinitions(beanFactory),registerBeanDefinition(String beanName, BeanDefinition beanDefinition)

  • Mybatis的Mapper为什么只定义了接口,却可以被@Autowired注入?
    Mapper接口没有被实例化,是通过 FactoryBean 调用其getObject方法生成对象的4

  • Servlet规范定义的Filter与Spring的Interceptor有什么区别?
    Interceptor的拦截范围其实就是Controller方法,它实际上就相当于基于AOP的方法拦截。因为Interceptor只拦截Controller方法,所以要注意,返回ModelAndView后,后续对View的渲染就脱离了Interceptor的拦截范围。5

  • java中注解的作用

  • Netty的原理

  • SpringCloud用过哪些组件
    Feign: 提供声明式服务绑定功能来实现对该服务接口的调用6,7
    Ribbon:客户端负载均衡
    Hystrix:客户端的限流、熔断、降级8

  • Hystrix的工作流程9,10
    在这里插入图片描述

  • 比较zookeeper,Eureka作为注册中心的优缺点
    答:zk保证CP,而不保证可用性,如我在腾讯面试篇最后的总结中提到:Leader 宕机会导致不可用,leader选举期间不可用,选举时间还长;发生网络分区时,节点数少的那个分区的zk不可用。
    而Eureka保证AP。Eureka各个节点都是平等的,几个节点挂掉不会影响正常节点的工作,剩余的节点依然可以提供注册和查询服务。而Eureka的客户端在向某个Eureka注册或如果发现连接失败,则会自动切换至其它节点。只不过查到的信息可能不是最新的(不保证强一致性)
    向注册中心查询服务列表时,我们可以容忍返回的是几分钟以前的注册信息,但不能接受服务直接down掉不可用。也就是说,服务注册功能对可用性的要求要高于一致性。11

  • Seata-TCC中的Confirm 和Cancel操作都需满足幂等性12

  • 采用何种分库分表的规则?id取余,或者按时间范围

  • 怎么保证数据库连接池中的连接是可用的?知道mysq的wait_timeout参数吗?
    wait_timeout:The number of seconds the server waits for activity on a noninteractive connection before closing it.13
    方法1:调大wait_timeout。不佳,wait_timeout过大会造成Mysql的空闲连接堆积,甚至达到MySQL的连接数上限。1415
    方法2:添加空闲检测,目的是保活,即在连接空闲时间超过wait_timeout之前,向MySQL发送一个类似心跳的查询语句,让MySQL不会主动断开它。16

  • mysql有哪些常用的log, 以及它们的作用。答:binlog、redo log和undo log。问:redo log与binlog的区别?
    下表参考1718

redo log binlog
记录事务对数据页做了哪些修改 binlog是逻辑日志,其记录是写的SQL语句,即使操作本身并没有导致数据库发生变化
redo log 适用于崩溃恢复(crash-safe) binlog 适用于主从复制
redo log 是 InnoDB 引擎层实现的,并不是所有引擎都有。 所有引擎都可以使用 binlog 日志
redo log 采用循环写的方式记录,当写到结尾时,会回到开头循环写日志。 binlog通过追加的方式记录,当文件大小大于给定值后,后续的日志会记录到新的文件上
  • 问:怎样查看sql执行计划?答:explain。问:结果中type列对应哪些类型的索引扫描?
    参考答案19的一部分:依次从好到差:
    const:使用唯一索引或者主键,返回记录一定是1行记录的等值where条件
    range:索引范围扫描,常见于使用>,<,is null,between ,in ,like等运算符的查询中
    index:索引全表扫描,把索引从头到尾扫一遍,常见于使用索引列就可以处理不需要读取数据文件的查询、可以使用索引排序或者分组的查询。
    all: 全表扫描数据文件,然后再在server层进行过滤返回符合要求的记录。

  1. 知乎:JVM中新生代为什么要有两个Survivor(form,to)? ↩︎

  2. Spring IOC 容器源码分析 ↩︎

  3. Spring IOC 实现原理 ↩︎

  4. 接口不能被实例化,Mybatis的Mapper/Dao为什么却可以@Autowired注入? ↩︎

  5. 使用Interceptor - 廖雪峰的官方网站 ↩︎

  6. Spring Cloud Feign使用详解 ↩︎

  7. Feign Ribbon Hystrix 三者关系 ↩︎

  8. 熔断器Hystrix ↩︎

  9. Hystrix的用处、解决的问题、工作流程图、断路器流程 ↩︎

  10. Hystrix工作流程 ↩︎

  11. 服务注册中心,Eureka与Zookeeper比较 ↩︎

  12. 分布式事务 Seata TCC 模式深度解析 ↩︎

  13. Server System Variables in mysql8 ↩︎

  14. mysql连接池不能回避的wait timeout问题 ↩︎

  15. mysql经典的8小时问题-wait_timeout ↩︎

  16. 浅谈MySQL连接的“8小时问题”(wait_timeout与空闲检测) ↩︎

  17. 必须了解的mysql三大日志-binlog、redo log和undo log ↩︎

  18. MySQL redo log 与 binlog 的区别 ↩︎

  19. mysql explain查看sql语句的执行计划 ↩︎

猜你喜欢

转载自blog.csdn.net/qq_23204557/article/details/115154884