阿里、京东、蚂蚁等大厂面试真题解析.pdf

pdf,京东,大厂,真题,蚂蚁,计算机与AI
文档页数:26
文档大小:3.68MB
文档格式:pdf
文档分类:计算机与AI
上传会员:
上传日期:
最后更新:

阿里、京东蚂蚁大厂面试真题解析 阿里一面 说一下ArrayList和LinkedList区别 说一下HashMap的Put方法 说一下ThreadLocal 说一下JVM中,哪些是共享区,唧些可以作为gcroot 你们项目如何排查JVM问题 如何查看线程死锁 线程之间如何进行通讯的 介绍一下Spring,读过源码介绍一下大致流程 说一下Spring的事务机制 什么时候@Transactional失效 Dubbo是如何做系统交互的 Dubbo的负载均衡策略 还读过哪些框架源码介绍一下你还熟悉的 阿里二面 Jdk1.7到Jdk1.8HashMap发生了什么变化(底层)?

Jdk1.7到Jdk1.8java虚拟机发生了什么变化?

如何实现AOP,项目唧些地方用到了AOP Spring中后置处理器的作用 说说常用的SpringBoot注解,及其实现 说说你了解的分布式锁实现 Redis的数据结构及使用场景 Redis集群策略 Mysq数据库中,什么情况下设置了索引但无法使用?

Innodb是如何实现事务的 聊聊你最有成就感的项目 自己最有挑战的项目、难点 京东一面
遇到过哪些设计模式?

Java死锁如何避免?

深拷贝和浅拷贝 如果你提交任务时,线程池队列已满,这时会发生什么 图灵学 谈谈ConcurrentHashMap的扩容机制 Spring中Bean是线程安全的吗? 说说你常用的Linux基本操作命令 Maven中Package和Install的区别 项目及主要负责的模块 SpringCloud各组件功能,与Dubbo的区别 京东二面 说说类加载器双亲委派模型 泛型中extends和super的区别 并发编程三要素?

Spring用到了哪些设计模式 简述CAP理论 图的深度谊历和广度追历 快排算法 TCP的三次握手和四次挥手 消息队列如何保证消息可靠传输 画出项目架构图,介绍自己所处的模块 蚂蚁一面 二叉搜索树和平衡二叉树有什么关系?

强平衡二叉树和弱平衡二叉树有什么区别 B树和B树的区别,为什么Mysql使用B树 epoll和pol的区别 简述线程池原理,FixedThreadPool用的阻塞队列是什么 sychronized和ReentrantLock的区别 sychronized的自旋锁、偏向锁、轻量级锁、重量级锁,分别介绍和联系 HTTPS是如何保证安全传输的 蚂蚁二面 设计模式有哪些大类,及熟悉其中哪些设计模式 2
volatile关键字,他是如何保证可见性,有序性 Java的内存结构,堆分为哪几部分,默认年龄多大进入老年代 Mysql的锁你了解唧些 ConcurrentHashMap如何保证线程安全,jdk1.8有什么变化 讲一下OOM以及遇到这种情况怎么处理的,是否使用过日志分析工具 介绍一下亮点的项目 项目的并发大概有多高,Redis的瓶颈是多少 项目中遇到线上问题怎么处理的,说一下印象最深刻的 作者图灵学院:周瑜 阿里一面 说一下ArrayList和LinkedList区别 1.首先,他们的底层数据结构不同,ArrayList底层是基于数组实现的,LinkedList底层是基于链表实现 的 2.由于底层数据结构不同,他们所适用的场景也不同,ArrayList更适合随机查找,LinkedList更适合删 除和添加,查询、添加、删除的时间复杂度不同 3.另外ArrayList和LinkedList都实现了List接口,但是LinkedList还额外实现了Deque接口,所以 LinkedList还可以当做队列来使用 说一下HashMap的Put方法 先说HashMap的Put方法的大体流程: 1.根据Key通过哈希算法与与运算得出数组下标 2.如果数组下标位置元素为空,则将key和value封装为Entry对象(JDK1.7中是Entry对象,JDK1.8中是 Node对象)并放入该位置 3.如果数组下标位置元素不为空,则要分情况讨论 a.如果是JDK1.7,则先判断是否需要扩容,如果要扩容就进行扩容,如果不用扩容就生成Entry对 象,并使用头插法添加到当前位置的链表中 b.如果是JDK1.8,则会先判断当前位置上的Node的类型,看是红黑树Node,还是链表Node i.如果是红黑树Node,则将key和value封装为一个红黑树节点并添加到红黑树中去,在这个过 程中会判断红黑树中是否存在当前key,如果存在则更新value il.如果此位置上的Node对象是链表节点,则将key和value封装为一个链表Node并通过尾插法插 入到链表的最后位置去,因为是尾插法,所以需要遍历链表,在遍历链表的过程中会判断是否
存在当前key,如果存在则更新value,当遍历完链表后,将新链表Node插入到链表中,插入 到链表后,会看当前链表的节点个数,如果大于等于8,那么则会将该链表转成红黑树 ill.将key和value封装为Node插入到链表或红黑树中后,再判断是否需要进行扩容,如果需要就 扩容,如果不需要就结束PUT方法 说一下ThreadLocal 1.ThreadLocal是Java中所提供的线程本地存储机制,可以利用该机制将数据缓存在某个线程内部,该线 程可以在任意时刻、任意方法中获取缓存的数据 对象)中都存在一个ThreadLocalMap,Map的key为ThreadLocal对象,Map的value为需要缓 存的值 3.如果在线程池中使用ThreadLocal会造成内存泄漏,因为当ThreadLocal对象使用完之后,应该 要把设置的key,value,也就是Entry对象进行回收,但线程池中的线程不会回收,而线程对象 是通过强引l用指向ThreadLocalMap,ThreadLocalMap也是通过强引I用指向Entry对象,线程 不被回收,Entry对象也就不会被回收,从而出现内存泄漏,解决办法是,在使用了 ThreadLocal对象之后,手动调用ThreadLocal的remove方法,手动清楚Entry对象 4.ThreadLocal经典的应用场景就是连接管理(一个线程持有一个连接,该连接对象可以在不同的方法之 间进行传递,线程之间不共享同一个连接) 说一下JVM中,哪些是共享区,哪些可以作为gcroot 1、堆区和方法区是线程共享的,栈、本地方法栈、程序计数器是每个线程独有的
运行时数据区 方法区 虚拟机栈 本地方法栈 Method Area VMStack Native Method Stack 堆 程序计数器 Heap ProgramCounterRegister 执行引擎 本地库接口 本地方法库 由线程共享的数据区 线程隔离的数据区 2、什么是gcroot,JVM在进行垃圾回收时,需要找到“垃圾”对象,也就是没有被引用的对象,但是直接 找“垃圾”对象是比较耗时的,所以反过来,先找“非垃圾”对象,也就是正常对象,那么就需要从某 些“根”开始去找,根据这些“根”的引用路径找到正常对象,而这些“根”有一个特征,就是它只会引用其他 对象,而不会被其他对象引用,例如:栈中的本地变量、方法区中的静态变量、本地方法栈中的变量、正 在运行的线程等可以作为gcroot.

你们项目如何排查JVM问题 对于还在正常运行的系统: 1.可以使用jmap来查看JVM中各个区域的使用情况 2.可以通过jstack来查看线程的运行情况,比如哪些线程阻塞、是否出现了死锁 3.可以通过jstat命令来查看垃圾回收的情况,特别是fullgc,如果发现fullgc比较频繁,那么就得进行调 优了 4.通过各个命令的结果,或者jvisualvm等工具来进行分析 5.首先,初步猜测频繁发送fullgc的原因,如果频繁发生fullgc但是又一直没有出现内存溢出,那么表示 fullgc实际上是回收了很多对象了,所以这些对象最好能在younggc过程中就直接回收掉,避免这些对 象进入到老年代,对于这种情况,就要考虑这些存活时间不长的对象是不是比较大,导致年轻代放不 下,直接进入到了老年代,尝试加大年轻代的大小,如果改完之后,fullgc减少,则证明修改有效 6.同时,还可以找到占用CPU最多的线程,定位到具体的方法,优化这个方法的执行,看是否能避免某些 对象的创建,从而节省内存 5

资源链接请先登录(扫码可直接登录、免注册)
①本文档内容版权归属内容提供方。如果您对本资料有版权申诉,请及时联系我方进行处理(联系方式详见页脚)。
②由于网络或浏览器兼容性等问题导致下载失败,请加客服微信处理(详见下载弹窗提示),感谢理解。
③本资料由其他用户上传,本站不保证质量、数量等令人满意,若存在资料虚假不完整,请及时联系客服投诉处理。

投稿会员:匿名用户
我的头像

您必须才能评论!

手机扫码、免注册、直接登录

 注意:QQ登录支持手机端浏览器一键登录及扫码登录
微信仅支持手机扫码一键登录

账号密码登录(仅适用于原老用户)