首页 / 后端
#

后端

#
3880813次浏览 54055人互动
此刻你想和大家分享什么
热门 最新
04-22 21:47
门头沟学院 Java
京东提前实习两个月跑路
王瑞_:tme腾讯音乐10点20早会,中午午休两小时,晚上6,7点走,自愿加班白天就轻松一点,9点也是有人在的。工资不低,可以说性价比非常高。
投递京东等公司10个岗位
点赞 评论 收藏
分享
12-08 12:43
已编辑
门头沟学院 Java
整理秋招遇见的JVM题
那些杀不死我的 反复追着我杀!!1.jvm包含哪几部分classloader:将编译(.java->.class)好的java字节码文件(.class文件) 加载到内存中(也就是运行时数据区Runtime data area 存放运行时数据(线程私有:栈 本地方法栈 pc ,进程级(也就是所有线程共享):堆 本地方法区)Execution engine 执行引擎,class文件被加载后 将指令和数据放在内存中 执行引擎负责将命令解释给os 也就是将JVM指令翻译为os指令集Native interface:本地库接口2.jvm内存结构/运行时数据区线程私有的:栈(每个方法执行时创建栈帧 存局部变量表等) 本地方法栈(为Native方法提供服务) 程序计数器(存当前线程执行的字节码指令地址)线程共享:堆(最大的内存区 存对象实例、类对象) 方法区 (存类有关的信息 静态变量等)3.说一下永久代和元空间都是对 方法区 的实现永久代:JDK7 及之前的实现,属于堆内存的一部分,有固定大小限制(通过-XX:PermSize/-XX:MaxPermSize设置),存储类元信息、常量池等,易触发永久代 OOM元空间:JDK8 及之后的实现,使用本地内存(不在堆中),大小受物理内存限制(默认无上限),仅需通过-XX:MetaspaceSize设置初始触发 GC 的阈值4.为什么jdk8要将永久代替换为元空间解决永久代OOM问题 简化类元数据管理 兼容JVM规范5.类加载过程加载:通过类全限定名获取字节码流,将字节码转化为方法区的类元数据,同时在堆中生成Class对象验证:确保字节码符合 JVM 规范(如文件格式验证、语义验证),防止恶意字节码破坏 JVM 安全准备:为类的静态变量分配内存并赋默认值(如 int 赋 0、对象赋 null),不执行赋值语句(赋值在初始化阶段)解析:将常量池中的符号引用替换为直接引用(如类、方法的内存地址),该阶段可延迟到初始化后执行。初始化:执行<clinit>方法(静态变量赋值 + 静态代码块),触发时机是 “主动使用”(new 对象、访问静态成员、反射、初始化子类、主类),且每个类仅初始化一次6.类加载机制(双亲委派制)1类加载器收到加载请求  -> 2将请求委托给父加载器,一直向上委托,直到启动类加载器 -> 3启动加载器检查是否能加载这个类,能则使用当前加载器,否则向下传递 ->4重复步骤3 如果找不到 class not foundJVM 默认类加载器层级:启动类加载器(Bootstrap)→扩展类加载器(Ext)→应用程序类加载器(App)→自定义类加载器7.why双亲委派保护核心类库(如String由启动类加载器加载,避免自定义类篡改替换)防止类重复加载8.自定义类加载器需要注意什么重写findClass方法(not loadClass,避免破坏双亲委派)9.双亲委派模型有哪些破坏场景 为什么要破坏Tomcat的WebAppClassLoader:Tomcat 为每个 Web 应用创建独立类加载器,优先加载应用内的类(而非委托父类),目的是隔离不同 Web 应用的类(防止不同应用的同包同类冲突)JDBC 的 SPI 加载:JDBC 的核心接口java.sql.Driver由启动类加载器加载,但具体实现(如 MySQL 驱动)在第三方包,启动类加载器无法加载,因此 DriverManager 通过线程上下文类加载器(破坏双亲委派)加载实现类(可能会让详细说一下SPI机制一些热部署实现:自定义类加载器加载更新后的类10.类卸载条件类所有实例被完全回收 类加载器被完全回收 Class对象无任何引用(FullGC时发生11.介绍一下gc机制涉及对象可回收判定、垃圾收集算法、分代收集模型、垃圾收集器、GC 触发时机等维度(问这么大 吟唱启动12.常见gc算法标记-清除,标记-复制,标记-整理,分代收集13.介绍一下CMS和G1(1)CMS 收集器(老年代专用)核心流程:初始标记(STW,标记 GC Roots 直接关联对象)→并发标记(无 STW,遍历引用链)→重新标记(STW,修正并发标记的遗漏)→并发清除(无 STW,清理可回收对象)优点:并发收集,STW 时间短,适合低延迟场景缺点:产生内存碎片、CPU 消耗高(并发阶段占用 CPU)、依赖老年代空间预留(易触发 Full GC)(2)G1 收集器(全堆收集)核心流程:将堆划分为多个大小相等的 Region,包含新生代 Region 和老年代 Region;流程为初始标记→并发标记→最终标记→筛选回收(STW,优先回收垃圾多的 Region)优点:兼顾吞吐量和延迟、可预测 STW 时间(通过-XX:MaxGCPauseMillis设置)、无内存碎片(回收时整理 Region)缺点:内存占用高(维护 Remembered Set)、小内存场景下性能不如 CMS14.jvm如何判断对象是可回收的早期方案引用计数法(无法解决循环引用问题)可达性分析算法判定对象是否不可达,结合引用类型细分可回收时机,finalize 机制完成最终判定15.能否将对象分配在栈上jvm针对“逃逸”做了优化分析对象的作用域是否逃出方法 / 线程,若逃逸则可直接分配在栈上 无需gc16.jvm调优核心思路是什么监控 分析 参数调整 验证17.一般会调整哪些jvm参数堆大小:-Xms2g -Xmx2g(初始堆 = 最大堆,避免堆动态扩展的开销)新生代大小:-Xmn512m(新生代占堆的 1/4~1/3,过小会导致对象提前进入老年代)Survivor 比例:-XX:SurvivorRatio=8(Eden:S0:S1=8:1:1,保证新生代对象有足够空间存活)晋升老年代年龄:-XX:MaxTenuringThreshold -XX:InitialTenuringThresholdGC 收集器:-XX:+UseG1GC(默认推荐,兼顾吞吐量和延迟)、-XX:+UseZGC(低延迟场景)GC 日志:-XX:+PrintGCDetails -Xloggc:gc.log(输出 GC 日志用于分析)元空间:-XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m(限制元空间大小,避免元空间 OOM)18.Jvm调优经验《没有经验!!》(回去等通知吧19.内存泄漏和OOM的区别?如何排查(1)内存泄漏:对象已无业务意义,但仍被引用(如ThreadLocal......),导致无法被 GC 回收,长期积累会引发 OOM① jmap -dump:format=b,file=heap.hprof导出堆快照;② MAT分析快照,定位 “无法回收的大对象” 和 “持有其引用的 GC Roots ③结合 Arthas 的jvm/heapdump命令定位泄漏代码(如静态 Map 未清理)(2)OOM:JVM 内存不足(如堆 / 元空间 / 栈超出上限),无法为新对象分配内存,直接抛出 OOM 异常① 看 OOM 类型(堆 OOM / 元空间 OOM / 栈 OOM)② 堆 OOM 分析对象分布(是否大对象过多) 元空间 OOM 检查类加载数量(是否频繁动态生成类) 栈 OOM 检查递归深度或线程数20.线上OOM问题如何排查21.如何分析gc日志22.线上频繁FullGC如何排查23.讲一下对jvm的理解(太大了 上文内容挑一些吟唱24.jmmJava Memory Model Java 内存模型,Java 虚拟机规范中定义的一种抽象内存模型,并非物理内存的实际布局,其核心目标是解决多线程环境下的原子性、可见性、有序性问题,为多线程编程提供内存访问的一致性规则欢迎佬赐教上辈子🔪👨放🔥 这辈子十月(底)秋招!!
查看23道真题和解析
点赞 评论 收藏
分享
现在的AI后端项目是否还是太鸡肋了
到目前为止,个人感觉 90%以上的 AI 后端项目都是极其相似的一套:LangChain4j/Spring AI 搭个框架 + 调用大模型 API 做一下问答功能 + 搞点向量数据库做做 RAG 知识库 + 接点 MCP 调用一下外部系统的 API然后就没有然后了。最主要的问题是,这样的 AI 应用开发项目,基本不涉及什么高并发、高可用、分布式的场景,对于后端来说可以深挖的点很少,对于大模型来说又不涉及微调优化之类的。导致了一个很尴尬的局面:1.用这些“AI 后端项目”去面后端岗,候选人和面试官都不知道从哪挖项目的亮点。对于大部分中小厂来说,他们的业务都没有接入 AI 的必要,面试官一看你这什么,xxRAG知识库管理系统,不知道你这项目有什么价值,太简单了也没有什么场景题可挖。2.用这些“AI 后端项目”去面 agent 开发岗、大模型应用开发岗,后端出身的小伙伴不知道怎么扛住大模型相关问题拷打。这类岗位可能会拷打:怎么优化 RAG 召回、提示词工程怎么做的、向量检索原理……有些甚至问大模型微调怎么搞,大模型基础比如 Transformer 之类的。整体来说,这方面没有多少整理完善的八股,相关问题也偏实践,即场景题,但是此场景题与后端场景题既有共同的地方,也有不少出入,不是后端转过来做个玩具项目就能搞明白的。总结起来就是这些“AI 后端”的玩具项目难以包装,挖不深,拿来面两边都不讨好。可能最佳的解决办法(针对后端岗)是把它作为一个附加的服务模块加在已有的项目上,而不是独立拿出来。
点赞 评论 收藏
分享
12-01 15:01
已编辑
门头沟学院 Java
实习+秋招 17轮面试 鹅厂还是缺点缘分
给个off吧要我做什...:wxg还没开始发offer,今年没意向
点赞 评论 收藏
分享
26届美团暑期实习后端开发一面面经(面完马上约二面)
总结:项目+算法+围绕简历问八股,感觉是贴主面得最差劲的一次,比之前的腾讯和阿里都要差(背的八股记得不太熟练),结果面完不一会就约二面了有点出乎意料,3.25已oc首先自我介绍还是老套路把面试官往项目上引1.问在项目中参与的角色,以及为什么做这个项目答:个人项目,参照开源项目做的,为了深入学习Spring开发流程(略)2.你在项目中redis和数据库的一致性保障怎么保障答:采取“先更新数据库,再删除Redis缓存“的策略,引入消息队列,让消费者来删除缓存,如果失败可以重新消费,这种重试机制进一步保证了一致性。(补充:还可以通过订阅MySQL的binlog,用里面的数据库更新信息来操作更新缓存)3.采用Kafka作为消息队列如何就能对系统进行解耦呢?答:Kafka采用异步通信形式,将生产者和消费者解耦,生产者将消息发送到Kafka,消费者从Kafka中读取消息,生产者和消费者不再直接依赖于对方的实现,彼此之间不需要知道对方的存在,只通过消息队列来传递信息。这种模式使得两个系统之间的耦合度大大降低4.那了解Spring微服务框架吗?答:不了解,我的论坛系统项目是基于Spring Boot开发的,没有使用Spring Cloud5.那Spring Boot和原生Spring之间有什么差别答:原生Spring配置起来更为复杂,需要写很多的xml,而Spring Boot配置更为简单,开发起来可以更注重于业务逻辑而不是繁琐的配置6.问项目二,你为什么会想去自己手写一个Spring框架答:深入自己对Spring框架的理解,进一步的了解他的底层7.那Spring的IOC你是怎么理解的答:(我把IOC和依赖注入一起讲了,后面面试官提醒我只需要讲IOC),就是把需要自己通过代码进行管理的对象创建和依赖关系管理交给Spring容器,这减少了应用程序中的耦合度,提高了代码的可维护性和扩展性。8.面试官发现我简历上手写Spring框架采用了TDD开发模式,说她们自己在工作中都很少会用到这种开发模式,感到很惊讶,询问我为什么使用TDD开发模式?(我跟着卡哥做的手写Spring,跟着用的TDD)答:背诵了项目面试题里的TDD开发模式流程与好处9.其实我只是想问你是因为什么导致你去采用这个TDD开发模式答:(答了好处居然都不好使,我瞎编说是浏览文章时学习到了这个开发模式,所以就想应用一下试试看)10.那你应用完这个开发模式后学到了什么?答:因为是先写测试用例再写逻辑代码,使得代码错误率降低,开发出来的代码质量更高,学到了以后写代码前都认真准备相应测试用例,避免出现更多bug11.jvm内存结构答:(之前背过但有点忘了,甚至因为试图去想起来的时间太久,面试官还调侃我刚刚不会是去问ai了吧)粗略说了堆区和栈区12.看你项目中用了ThreadLocal,说说用在哪答:说在论坛项目中,获取当前登录角色,使用ThreadLoacl使得每个线程都能获得一份互相独立当前用户副本13.那ThreadLocal的实现原理呢?答:(之前用的时候粗看过,但是后面忘了)老实交代不熟悉14.那你在项目中使用了哪些设计模式答:创建Bean使用工厂模式,实现JDK动态代理和CGLIB代理使用了代理模式,许多代码块使用了模版方法模式,实现MVC时请求的传入处理过程采用了责任链模式15.责任链模式优点答:解耦,将每个阶段独立开来,可以对此进行单独配置扩展16.那你使用责任链模式的时候,要是我中途一个阶段出现了问题,我前面的数据怎么进行回滚答:(完了盲区)老实交代我做的MVC处理请求这里没有涉及事物的回滚,这方面我不熟悉17.那我在一个代码块里大量使用了if-else,采用什么设计模式优化好答:策略模式,将不同的逻辑封装成不同策略类中18.数据库的隔离级别了解吗?答:Read Uncommitted,Read Committed,Repeatable Read,Serializable19.Repeatable Read具体是啥,怎么实现的答:可重复读,就是多次读取数据是一致的,通过加共享锁和排他锁,或在MySQL中通过mvcc实现,原理就是通过read view...20.那什么是排他锁?答:施加了排他锁的数据,在给他施加排他锁的事务释放锁前,其他事务都无法读或写该数据21.那你举例一个发生死锁的场景,并说解决方法答:没答对(面后补充:假设这个数据库隔离等级为可重复读,比如我在一个订单表里,每次插入操作前想保证操作幂等性,先查查表里有没有这个id的订单,就执行select。。。for update,这时有两个不同的事务一个查了id为1007的,一个查了id为1008的,这时候两个事务在查找for update时都获取了间隙锁,因为间隙锁是可以兼容的,所以两个表都获得了,但是后面两个表要执行插入操作前要插入意向锁,但是意向锁不兼容间隙锁,两个事务都在等待对方释放锁,就造成了死锁。除了在设计层面避免出现死锁的场景,在发生死锁后可以通过设置事务等待锁的超时时间,超时则回滚避免死锁,或者添加死锁检测机制,检测到系统死锁就对事务进行回滚)22.MySQL的索引了解吗?一级索引二级索引说一说?答:了解,(八股背少了,一时没想起一级索引二级索引是啥)说了个主键索引和非主键索引23.索引的底层实现是什么?答:B+树,数据存储在叶子节点,节点直接像链表一样用指针相连,对查询范围数据很有效24.(很明显对我MySQL不太满意)你们学校学MySQL了吗?Java呢?答:学了MySQL,但Java是选修课25.(面试官默认我是研究生,其实我是本科生)那你在学校实验室里和导师做哪方面研究呢?答:说自己是本科生,没有导师做研究26.那你在学校有和老师做什么研究吗?答:有个大创项目,是无人机路径规划,但是是机器学习方面的,不是我的侧重点27.那你实习能实习几个月,一周来几天?答:我说我不是研究生学校束缚不了我,可以四月干到九月,一周出勤五天及以上28.你自己的优势?答:对新技术的学习比较热爱,学习能力和规划能力比较强,比如我的项目,Java以及Spring相关的学习都不是学校教学的,是我通过自己指定计划自学的,再运用到实际开发中来。29.那你是怎么自学的?答:csdn找文章,b站找视频,制定好学习路线,通过跟着视频、文章,或者阅读Spring的官方手册文档,循序渐进的进行学习30.算法题又是快速排序,之前腾讯面试也是快速排序,给了十五分钟5分钟不到速通了,原本十五分钟后差不多就到时间了,后悔写太快了,导致后面问我有没答出来的31.Redis缓存穿透、缓存击穿、缓存雪崩,及其解决方案答:Redis三剑客,八股照着背32.Redis主从复制答:有主服务器和从服务器,Redis会将数据从主服务器复制到从服务器上,哨兵机制保证主服务器宕机就切换到从服务器,这样不至于主服务器宕机后Redis就无法使用33.看了简历上写了GC,就问GC的的垃圾回收器有哪些答:(后悔了面之前简历没有背牢)答非所问的回答了垃圾回收算法,因为回收器我记不得了只记得算法34.你使用Kafka有遇到重复消费吗?重复消费会怎样?答:重复消费会导致通知推送多次,比如QQ发一条消息应该只推送一条通知,重复消费的话推送多条通知35.(面试官之前问出来我MySQL掌握不牢,最后两分钟继续发问MySQL)那sql如何优化?sql执行后底层是怎么样的?答:瞎说了几个感觉的sql优化方式,然后执行后底层回答不知道(面后补充:sql优化首先从索引入手,可以尝试使用覆盖索引,这样可以避免查询时使用二级索引引发的回表问题,插入数据时多行插入,以及为数据库引入缓存等;以一条select语句为例,首先MySQL由Server层和存储引擎层组成,首先在Server层先经过连接器,通过用户输入的用户和密码尝试建立客户端与服务器的连接,连接完成后进行第二步,第二步查找缓存,Server以键值对的形式存储sql查询结果,key为sql语句,value为查询返回值,如果查找到对应的key则直接返回value,否则进行下一步,但是这个查找缓存的功能在经常更新里的数据库很鸡肋,在MySQL8.0之后就被删掉了,然后呢就Server层的解析器,解析SQL语句,首先进行词法分析,提出select,form这样的关键词,然后对sql进行语法分析,判断语法正确与否,正确就构建SQL语法树,不对直接返回报错,正确之后呢就进入SQL执行过程,首先预处理阶段,看看是否有这个表或是否有对应字段,然后进入优化器阶段,确定SQL的搜索方案(就是根据索引搜索成本选索引),然后执行器和引擎交互执行SQL。然后在引擎方面,如果select传进来是主键,就直接在主键索引建立的B+树,由根节点进行二分查找找到主键key的指针,再递归指针指向的节点,找到对应数据返回,如果传入的是二级索引,则要在二级索引树上找到主键索引再去重复上述过程,最终将找到的结果返回给客户端。)反问流程:感觉自己面得稀碎,都不好意思反问,直接道谢下播了没想到刚面完一个多小时,美团就来电话约2面了
嵐jlu:贴主会更新每一个面试的面经,可以点进贴主主页查看其他面经(都会写的详细),可以关注我获得最新面经通知。
点赞 评论 收藏
分享
11-24 18:35
中南大学 Java
点赞 评论 收藏
分享
10-30 16:18
门头沟学院
字节懂车帝日常一面二面面经(已挂)
字节懂车帝 一面-90min面试官很好,分块问的,太紧张忘记录音了,回忆版IOC和DI有哪些注入方式Java数据结构Java锁都有什么CAS存在什么问题,应用场景有哪些Jvm内存结构元空间参与垃圾回收吗,回收什么字符串常量池在哪判断垃圾算法GCroot可以是什么垃圾回收算法Survival区可以怎么优化Mysql有哪些存储引擎存储引擎用的什么索引结构三级缓存 不用第三级缓存可以吗AOP在哪一层缓存实现的(a,b,c) where a=,b=,c>时where a=,b=,c=,主键= 时会用索引吗什么时候联合索引失效聚簇索引和非聚簇索引数据隔离级别有什么RR怎么实现的Redis数据结构String Zset底层Redis持久化机制Redis哨兵 分片哨兵为啥3个不能2个吗一个用户下两次单怎么办一个用户下一次单立刻退出并进入再下两次单怎么办(想买两件商品)幂等性实现Websocket建立连接的过程,涉及到HTTP吗(这个没复习根本不会)mtu是多大常见的请求头内容 content-type有什么常见的返回状态码输入一个表单用的是什么格式的OSI七层和TCP四层网络模型 每层干什么,有什么协议力扣 496反问:业务哪里不足:网络相关的协议和底层多学习一下总结:很爽的八股盛宴,2小时后约同一天二面二面-60min面试官蛮严肃的,问的都是我的薄弱点,直击要害主要拷打外卖 只认真复习了点评,寄了问的:项目上线了吗 没nginx一大堆相关(没复习,人傻了)JWT和登录环节相关(也不咋会)Lua脚本干什么了IP限流怎么起作用的代码题:正则表达式判断字符串(这个会写秒了,但是写的比题目多了个要求,面试官有点怀疑我看资料了,让我看看周围环境,周围啥也没有,长记性了,原题也得装一下)超简单sql (平时写的太少了,简单的想复杂了,写的效率很差,面字节得练)算法题:判断数独(只能用一个大小为9的一维数组,可以多遍历几次,我只写过用二维数组的,超时寄,换题)链表每两个反转(当时已经晕了,写的有点慢,写出来了有个小bug)直接反问环节 感觉没戏了,没怎么问总结:焦虑了这么久还是一场空,简历上的全都得会,不能只会八股,前面题答的不好影响做题心态,还有不能忘了录音第二天问hr后收到感谢信 第一次面大厂,有点面试ptsd了,还是要以学习的心态面试,学的太晚,这个时间点只能尽力了,面前看了很多友友们的面经,补了不少漏,所以也发出来攒攒人品
点赞 评论 收藏
分享
玩命加载中
牛客网
牛客网在线编程
牛客网题解
牛客企业服务