版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Erlang面试题及详细答案(实战完整版)一、Erlang基础语法篇1、Erlang是什么类型的语言?核心特性有哪些?答案:Erlang是一门动态类型、函数式、并发型、面向进程的编译型语言,主打高可用、高并发、容错性,广泛用于通信、网关、分布式服务领域。核心特性:纯函数式风格:变量不可变,无副作用,递归替代循环轻量级进程:进程开销极低,单机可支撑数十万、上百万进程原生并发:并发、并行、分布式为语言原生支持,无需第三方库容错机制:依托进程隔离、链接、监控、重启策略,实现软实时、高可用热更新:支持业务代码不停机升级、替换模式匹配、守卫表达式、列表推导式,代码简洁高效2、Erlang变量的特点是什么?和其他语言变量有什么区别?答案:Erlang变量一旦绑定不可修改,是单次赋值变量。区别于Java、Python等命令式语言:普通语言变量是内存地址引用,可反复赋值修改;Erlang变量绑定后只能读取,无法二次赋值,想要变更数值只能重新定义新变量。补充:变量必须大写字母开头,小写开头为原子,下划线开头变量多用于占位忽略。3、原子(atom)的作用是什么?常用场景有哪些?原子会不会占用内存?答案:原子是Erlang基础常量,代表一个唯一标识,值就是自身,全局唯一。常用场景:状态标记、消息标签、函数返回值、模式匹配、进程状态、错误码(ok、error、undefined)。内存特点:原子会持久占用虚拟机内存,不会被GC回收。系统默认有原子数量上限,禁止动态批量生成原子(比如把字符串直接转原子),否则会导致原子溢出、虚拟机崩溃。4、模式匹配的执行逻辑是什么?=号的工作机制答案:Erlang中=不是赋值,是模式匹配。执行逻辑:右侧表达式先计算出结果,再和左侧结构匹配。左侧是未绑定变量:直接绑定变量值左侧是已绑定变量:校验左右值是否一致,一致则通过,不一致抛出匹配异常支持多层结构匹配:元组、列表、结构体均可拆解匹配示例:{ok,Val}={ok,100}.可直接拆解取值,是Erlang最常用的取值方式。5、列表和元组的区别?各自适用场景答案:元组(tuple):固定长度,底层连续存储,读取速度极快,不可追加修改。适用场景:固定结构数据、接口返回、结构体、键值组合、消息协议封装。列表(list):链式递归结构,长度可变,支持头部快速插入、遍历,尾部操作性能差。适用场景:可变数据集合、遍历迭代、批量数据处理、参数列表。核心区别:元组查得快、改不了;列表遍历灵活、尾部操作慢。高频读取用元组,批量迭代用列表。二、进程与并发核心篇(面试高频)6、Erlang进程和操作系统线程、进程的区别?答案:Erlang进程是虚拟机用户态轻量级进程,不依赖操作系统进程/线程调度。核心差异:开销极低:单个Erlang进程栈内存极小,默认仅几KB,单机可轻松跑几十万上百万进程完全隔离:进程间内存独立,不共享数据,一个进程崩溃不影响其他进程调度灵活:由Erlang虚拟机调度,抢占式调度,延迟极低OS进程/线程开销大、数量受限,切换成本高,无法支撑超高并发场景7、进程创建、消息发送、消息接收的原生函数答案:1、创建进程:spawn(fun()->loop()end).返回进程PID2、消息发送:Pid!Msg异步发送,无阻塞,发送即返回3、消息接收:通过receive语法匹配队列消息基础示例:erlang
loop()->
receive
{msg,Val}->
io:format("recv:~p~n",[Val]),
loop()
end.补充:Erlang消息是异步投递、队列有序,先发送先接收。8、进程链接(link)和监控(monitor)的区别与使用场景答案:link双向链接:双向绑定,AlinkB,A挂B也会挂,B挂A也会挂多用于主从进程、必须同生共死的业务场景可通过process_flag(trap_exit,true)捕获退出信号,避免自身崩溃monitor单向监控:单向监听,AmonitorB,B崩溃只会发消息通知A,不会影响A运行监控可手动取消,不会产生连锁崩溃通用场景:异步任务监听、临时进程托管、请求回调进程监控总结:需要同生死用link,需要只监听、不牵连用monitor。9、什么是进程隔离?Erlang如何实现高容错?答案:进程隔离是Erlang容错的核心:所有进程内存独立、数据不共享、执行独立,单个进程的异常、崩溃、死循环不会污染其他进程。高容错实现方案:进程隔离:故障单点局限,不扩散链接与监控:实时感知进程状态退出信号捕获:自定义异常处理逻辑OTP监督树:标准化进程重启、降级、熔断策略10、消息队列堆积的原因和排查、优化方案答案:堆积原因:进程接收逻辑阻塞,receive匹配不到消息,消息一直积压进程处理速度远小于消息发送速度死循环、长时间计算阻塞消息循环过期消息、无效消息持续投递排查方式:erlang:process_info(Pid,message_queue_len)查看消息队列长度erlang:process_info(Pid,messages)查看堆积消息内容优化方案:保证receive全覆盖匹配,避免消息遗漏堆积耗时操作异步拆分,不阻塞主循环增加消息过期、丢弃策略拆分大进程为多个子进程,分担压力三、OTP框架核心面试题(重点)11、什么是OTP?核心组件有哪些?答案:OTP是Erlang开源的通用电信开发套件,是一套标准化的高可用服务开发规范和组件库,不是语法,是工程最佳实践。核心组件:gen_server:通用同步/异步服务进程(最常用)supervisor:监督者,负责进程启停、重启、容错gen_fsm/gen_statem:状态机服务gen_event:事件订阅、通知服务application:应用管理、启停、依赖管理12、gen_server的生命周期和核心回调函数答案:生命周期:启动(init)->运行处理请求->停止(terminate)核心回调:init/1:进程初始化,初始化状态数据,启动时执行一次handle_call/3:处理同步请求,客户端阻塞等待返回结果handle_cast/2:处理异步请求,客户端发送即返回,不等待结果handle_info/2:处理原生进程消息、定时器、主动推送消息terminate/3:进程退出时执行,用于资源释放、收尾code_change/3:热更新代码升级回调核心区别:call阻塞可靠,cast快速无回执,info处理系统原生消息。13、supervisor重启策略有哪些?各自适用场景答案:监督者四种重启策略:one_for_one:单个子进程崩溃,只重启当前故障进程,其他不受影响。通用业务默认策略one_for_all:单个子进程崩溃,重启所有子进程。适用于进程强依赖、必须整体可用的场景rest_for_one:崩溃进程及其后启动的所有进程全部重启。适用于有启动顺序依赖的服务simple_one_for_one:动态批量子进程,所有子进程规格一致,适合连接池、会话池、临时任务进程14、gen_server状态丢失的原因和解决方案答案:丢失原因:进程异常崩溃被监督者重启,init重新初始化,内存状态重置手动重启服务、节点重启热更新异常导致进程重启解决方案:核心数据落地:ETS、Dets、数据库持久化启动时从持久化载体加载状态关键服务做主备双进程、分布式同步状态15、ETS表的类型、权限及适用场景答案:ETS是Erlang内存键值表,进程共享、读写高效,是本地缓存核心组件。四大类型:set:唯一键,键重复覆盖,最常用ordered_set:按键有序排序,适合有序遍历场景bag:键可重复,值不重复duplicate_bag:键值均可重复,存储全部记录权限:public(全进程读写)、protected(所有者读写,其他只读)、private(仅所有者访问)注意:ETS依附创建进程,创建进程崩溃,ETS表默认销毁,重要表需绑定常驻服务进程。四、分布式与热更新篇16、Erlang分布式节点原理、节点通信方式答案:Erlang分布式基于节点握手+TCP长连接实现,同一集群节点互相感知、进程可跨节点通信。核心特点:节点间进程透明通信,远程PID和本地PID使用方式一致支持跨节点spawn、消息发送、ETS共享、进程监控节点断线自动重连、状态同步通信方式:基于原生TCP协议,节点间同步元数据、进程信息、消息数据,无需额外网关转发。17、Erlang热更新原理、上线注意事项答案:热更新原理:Erlang虚拟机支持同时加载新旧两个版本模块,运行中进程可切换模块版本,无需停机重启进程。通过code_change回调完成状态迁移和版本切换。上线注意事项:保证新旧模块接口兼容,避免参数、返回值突变处理好进程状态迁移,防止更新后状态错乱更新后卸载旧版本模块,避免内存堆积灰度更新,单节点验证无误后全量推送五、性能优化与故障排查篇18、Erlang常见性能瓶颈有哪些?答案:列表尾部频繁操作:列表是链表,尾部增删复杂度极高,尽量用头部操作或转元组消息队列堆积:进程处理速度跟不上投递速度大量动态生成原子,导致内存溢出ETS频繁大范围遍历、全表扫描进程过多、调度繁忙,导致调度延迟代码死循环、长时间同步阻塞19、常用线上排查命令和工具答案:常用调试、排查接口:erlang:system_info/1:查看系统内存、进程数、调度器信息erlang:process_info/2:查看进程内存、队列、状态、堆栈sys:get_status/1:查看gen_server运行状态ets:info/1:查看ETS表大小、数据量、占用内存工具:observer图形监控、dbg动态日志跟踪、fprof性能剖析20、如何避免Erlang内存泄漏?答案:及时清理无用消息,避免消息队列无限堆积ETS表设置过期清理逻辑,避免数据无限累加临时进程、临时链接使用后及时释放、取消监控禁止循环引用、无效状态常驻内存限制原子生成,杜绝动态字符串转原子定时巡检进程内存、ETS容量,设置阈值告警六、手写代码面试题21、手写一个最简gen_server模板答案:erlang
-module(demo_server).
-behaviour(gen_server).
-export([start_link/0]).
-export([init/1,handle_call/3,handle_cast/2,handle_info/2,terminate/3,code_change/3]).
start_link()->
gen_server:start_link({local,?MODULE},?MODULE,[],[]).
init([])->
{ok,#{}}.
handle_call(get_state,_From,State)->
{reply,{ok,State},State};
handle_call(_Request,_From,State)->
{reply,{error,unknown},State}.
handle_cast({set_state,K,V},State)->
NewState=State#{K=>V},
{noreply,NewState};
handle_cast(_Msg,State)->
{noreply,State}.
handle_info(_Info,State)->
{noreply,State}.
terminate(_Reason,_State,_Args)->
ok.
code_change(_OldVsn,State,_Extra)->
{ok,State}.22、手写一个简单的生产者消费者进程模型答案:erlang
-module(pc_demo).
-export([start/0,producer/0,consumer/0]).
start()->
Pid=spawn(funproducer/0),
spawn(fun()->consumer(Pid)end),
ok.
producer()->
re
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年山西省孝义市高三生物上册期末考试模拟测试卷带答案
- 2026年云南省个旧市高三历史上册期末考试测试卷附参考答案【研优卷】
- 2026年黑龙江省铁力市高三生物上册期末考试检测卷及答案
- 2026年山东省曲阜市高一化学上册期末考试模拟考试卷【典型题】附答案
- 2026年黑龙江省密山市高三生物下册期末考试模拟卷带答案
- 2026年湖北省仙桃市高三生物上册期末考试试卷含答案
- 2026年湖南省沅江市高一历史上册期末考试模拟试卷含答案(预热题)
- 2026年吉林省集安市高一化学上册期末考试模拟试卷附参考答案【黄金题型】
- 2026年浙江省龙泉市高三生物上册期末考试自测卷(含答案)
- 2026年吉林省蛟河市高一化学上册期末考试模拟试卷(精练)附答案
- 江苏省苏豪控股集团有限公司招聘笔试题库2026
- 码头装卸协议书简单
- 国企招聘笔试题及答案-投资专员、投资经理A卷
- 2024苏教版三年级科学上册全册单元测试(含解析)
- 鄂尔多斯市国有资产投资控股集团有限公司招聘笔试真题2024
- 辅导员工作岗位知识培训课件
- 地产尾盘培训知识课件
- DR体位操作技术规范与临床应用
- 一次性医疗用品管理课件
- 公司员工上岗证管理制度
- 列车开行方案列车开行方案高速铁路运营技术64课件
评论
0/150
提交评论