IT岗位面试题库及答案.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

IT岗位面试题库及答案

一、后端开发岗位

1.问题:在分布式系统中,如何保证数据的一致性?请举例说明。

答案:分布式系统保证数据一致性,常用的有“2PC(两阶段提交)”“TCC(补偿事务)”“Saga模式”这几种方案,得根据业务场景选。比如做电商下单,要是用2PC,下单服务是协调者,库存、支付服务是参与者。第一阶段协调者问参与者“能不能执行操作”,库存服务查完能扣就回复“可以”,支付服务也确认能扣钱就回复“可以”;第二阶段协调者见大家都同意,就发“执行”命令,库存扣减、支付扣款实际执行。但2PC有缺点,比如协调者挂了会阻塞,适合对一致性要求极高、并发不那么夸张的场景,像金融转账。

要是业务并发高,比如普通电商下单,更适合TCC。把下单拆成“Try-Confirm-Cancel”三步:Try阶段先冻结用户的商品库存(比如用户买2件,先把库存里的2件标为“冻结中”,不让别人用)、冻结用户账户里的钱;Confirm阶段确认扣减,把冻结的库存真正减掉,冻结的钱划到商家账户;要是中间出问题,比如用户支付超时,就走Cancel阶段,把冻结的库存解冻、钱退给用户。我之前做的电商项目,就是用TCC解决了下单时库存和支付的数据一致性问题,比2PC灵活,也减少了阻塞。

2.问题:你用Java开发时,遇到过内存泄漏吗?怎么排查和解决的?

答案:遇到过,之前做一个定时任务处理数据的项目,跑了几天服务器内存就满了。排查先用JDK自带的工具,第一步用jps命令找到项目的进程ID,比如进程ID是12345;然后用jmap-histo:live12345heap.log,把当前内存里存活的对象统计导出来,看哪个类的对象数量异常多。当时发现ArrayList对象特别多,而且一直没减少。

接着用jstack12345stack.log看线程栈,结合代码分析,发现定时任务里每次处理数据都会new一个ArrayList存临时数据,但处理完后,这个ArrayList被放到了一个静态的List里,没清空。每次任务执行都加新数据,静态List里的对象一直被引用,GC没法回收,就内存泄漏了。

解决办法也简单,一是定时任务处理完数据后,把静态List里的对应数据remove掉,或者每次处理完就把静态List清空;二是把静态List改成局部变量,让任务执行完后,ArrayList对象失去引用,GC能正常回收。改完后再用jstat-gc12345100010监控内存,发现内存使用稳定了,没再出现泄漏。

3.问题:MySQL中,怎么优化一条执行很慢的查询SQL?

答案:得先定位慢查询的原因,再针对性优化。第一步先开启MySQL的慢查询日志,在f里配置slow_query_log=1,slow_query_log_file=/var/log/mysql/slow.log,long_query_time=2(超过2秒的查询记下来),然后重启MySQL,等一段时间后查看慢查询日志,找到那条慢SQL。

比如之前遇到一条“select*fromorderwhereuser_id=123andcreate_timebetween2024-01-01and2024-01-31”的SQL,执行要5秒。下一步用explain分析这条SQL,explainselect...,看结果里的type字段是ALL,说明是全表扫描,key字段是NULL,没走索引。

优化的话,首先考虑加索引。因为查询条件里有user_id和create_time,而且是范围查询,所以建一个联合索引idx_user_create(user_id,create_time)。建完索引后再用explain看,type变成了range,key是idx_user_create,执行时间降到0.1秒以内。

另外,要是表数据量特别大,比如order表有上千万条,除了加索引,还可以分表。按create_time分表,比如每月分一张表,order_202401、order_202402,查询2024年1月的数据时,直接查order_202401,不用扫全表,速度更快。还有,别用select*,只查需要的字段,减少数据传输量,比如查order_id、total_price,这样也能优化查询速度。

4.问题:SpringBoot中,依赖注入有哪些方式?实际开发中你更常用哪种,为什么?

答案:SpringBoot依赖注入主要有三种方式:构造器注入、sette

文档评论(0)

151****9429 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档