拼多多后端一面

1.jdk动态代理和cglib动态代理有什么区别?为什么

  • cglib基于类进行扩展,只能有一个父类
        // 代理实例的获取
        Enhancer enhancer = new Enhancer();
        // 设置需要创建子类的类,final/private方法不能被代理,这个接口不管用?
        enhancer.setInterfaces(new Class[] {HelloService.class});
        // 需要创建的父类,只能传递一个
        enhancer.setSuperclass(superClass);
        enhancer.setCallbackFilter(new CallbackFilter() {
            @Override
            public int accept(Method method) {
                // callback数组的下标
                return 1;
            }
        });
        enhancer.setCallbacks(new Callback[]{callback,callback});
        // EnhancerTest的子类
        return (T) enhancer.create();

  • jdk基于接口实现,可以是多个接口的代理,因为接口可以多继承。
Proxy.newProxyInstance(classLoader, proxiedInterfaces可以传递多个接口, invocationHandler);

2.threadlocal怎么用,可能会有哪些问题?怎么避免内存泄漏。底层怎么优化的。key是弱引用,可以为null,那么value呢?怎么解决呢?用threadLocal有什么好处?

  • 内存泄漏。remove
  • 重复new。static定义threadLocal,value使用弱引用
  • 数据会串,上下文污染
  • 上下文丢失问题。例如底层remove了,上层依然依赖这个上下文。
  • 跨线程池问题
  • 并发问题。例如传递的是一个复杂对象,需要深拷贝

3.spring事务有哪些传播级别

REQUIRED:如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新事务。这是默认的传播级别。

SUPPORTS:如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务方式执行。

MANDATORY:如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。

REQUIRES_NEW:始终创建一个新的事务,并挂起当前事务(如果存在)。

NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,则将其挂起。

NEVER:以非事务方式执行操作,如果当前存在事务,则抛出异常。

NESTED:如果当前存在事务,则在嵌套事务中执行;如果当前没有事务,则创建一个新的事务。嵌套事务可以独立提交或回滚,但也会受到外部事务的影响。


4.微服务有什么好处,带来哪些问题,业务里分布式事务怎么做的?

  • 链路追踪,服务治理(重试、熔断、超时设置、限流),分布式问题,一致性问题
  • 过度微的话,可能一次需求会改很多个服务。浪费资源
  • 序列化、反序列化等耗时
  • 原先直接调用没问题,改为平台后,可能导致重复调用,循环调用,链路变长
  • rpc交互,sdk升级可能存在问题,例如不能用枚举交互,不能使用Builder,Builder默认值不生效。
  • 对于下游需要引入防腐层。

5.内存gc怎么排查,有哪些工具,怎么优化的?

6.哪些场景会保存到老年代?为什么达到15年龄就要升级?

  • 大对象
  • 新生代gc,存活对象达到晋升年龄
  • 触发新生代担保机制,新生代回收后survivor放不下,直接放到老年代

7.数据权限怎么设计的?是否通用

部门是挂在角色上

8.ES的怎么解决深分页?

9.springboot怎么实现自动化配置?

10.给你两个递增数据,合并成一个数组,第一个数组含有所有的空间,只能用这两个数组,不能用额外的空间

11.spring怎么去做监控,错误码体系

12.java的异常体系

13.go中channel和mutex实现有什么区别?

14.怎么实现幂等?

  • 上游生成一个幂等的uuid,作为key,放到redis里,默认120毫秒过期
  • update数据时增加条件,如果状态扭转了,则不往下走
  • jackson序列化所有请求参数,得到一个md5作为key,是否会调整参数的位置,但是参数是相同的?
  • 插入时,增加唯一键;删除时判断接口
  • aop对上面包装一下,减少侵入性
#23届找工作求助阵地##我的实习求职记录#
全部评论
请问楼主是上周日刚笔试的吗
点赞 回复 分享
发布于 2023-09-13 18:33 上海
哥,怎么投的,没有内推码😢
点赞 回复 分享
发布于 2023-09-13 16:40 上海
大佬太强了
点赞 回复 分享
发布于 2023-09-13 11:53 广东
感觉有点难
点赞 回复 分享
发布于 2023-09-13 11:10 天津
1
点赞 回复 分享
发布于 2023-09-13 10:43 北京

相关推荐

05-11 22:04
门头沟学院 Java
前面就是基本上是八股盛宴,然后看你说什么词触发他被动然后追着问。复盘的时候确实发现底层网络和操作系统问得挺细的,可能客户端偏底层?总体来说面得挺舒服的,面试官也很友善,一个小时很快就过去了。提问环节:1. 自我介绍2. 面试官强调这是客户端面试 说明一下base地,进来要转cpp3. 了解cpp吗?不了解,对于两者的理解我认为最大的不同在于内存管理,cpp可以灵活地控制内存,提高程序运行效率。Java通过jvm来进行内存管理,好处是系统自动分配内存和垃圾回收,安全简单,缺点就是不能更颗粒度地操作内存。还有就是cpp的学习曲线比较陡峭,其他的就不太清楚了。4. Java集合有哪几种?ArrayList,Linkedlist,HashSet,hashmap,ConcurrentHashMap5. ArrayList和LinkedList有什么区别?底层实现,读写应用场景,6. 具体到每一个节点上,他们两在内存占用上哪个更优?ArrayList底层是连续内存的动态数组,利用了计算机的局部最优特性,所以更优一些7. 什么是反射?通过类名在程序运行时构建类实例,操作类方法,类字段,增强编码的灵活性和解耦,但是也存在着安全的隐患8. JVM是如何反射构建类对象的?通过方法区中存放的类信息,字段和方法,去构建类对象实例9. 讲一下类加载机制,描述一下类是如何被加载的?加载-验证-准备-解析-初始化-使用,然后具体内容10. 类加载的时候,它对静态成员变量和非静态成员变量的处理具体有什么不同?静态放在方法区,局部变量放在堆,基本数据类型放在栈帧11. 讲一下CAS是什么?12. 有没有遇到ABA问题?13. Mysql底层存储的数据结构是什么?14. 平时写sql查询语句时需要注意什么,对查询进行优化,结合一个例子说明?15. 你的主表的主键ID是增长是+1吗?还是怎么样?16. 推荐使用顺序递增索引,说了一下顺序递增和UID的优缺点17. 有遇到并发插入,出现ID空洞的情况吗?没有,加行锁了18. 你刚刚说了行锁是吧,那Mysql具体有哪些锁?行锁、表锁、全局锁,间隙锁防止幻读19. 什么是幻读?20. 我看你有提到计算机网络,介绍一下UDP和TCP差异21. 如果在客户端建立TCP的话,一般会怎么做?(愣了一下)一般是操作系统底层通过协议栈来进行网络连接,通过JavaAPI来操作Socket层来进行网络连接通信22. 你有用过java的Socket相关的这些,手动去建立连接的API吗?用过简单的http网络请求连接,还有使用Java的网络应用框架Netty来进行网络通信,可以自定义消息序列方式和序列头等信息23. 你刚才提到操作系统负责网络连接,你知道操作系统提供的TCP的API是什么吗?不太清楚,没有在操作系统层面上实现过这种网络通信的调用24. 解释一下TCP和HTTP这两个专有名词?25. HTTP一定要建立在TCP上吗?还是说UDP也可以?26. 你刚刚说了QUIC协议,关于QUIC你知道哪些呢?27. 既然你提到了中间密钥,那它建立连接的大概过程是什么?28. TCP协议的握手是干什么的,为什么要有握手的过程?29. 它如何保证不接收过去的数据呢?30. 说了一个乱七八糟的问题,什么什么API和你刚刚说的握手有什么关系?(没听懂)31. 那我换一个问法,你知道半连接队列吧?那它在握手的哪一步把链接从半连接移到全连接队列?32. 如果第三次握手的ACK,客户端没收到,会怎么样?33. OK网络相关的就,嗯(话锋一转),HTTP头的大概结构你清不清楚?34. 问你两个操作系统相关的问题,kill命令有用过吗?(玛德没听清,没回答出来)结束一个进程一般用shutdown或者close函数35. 嗯我不是说在你程序内,那你有个jar包跑起来了,你怎么把它删掉?一般在服务器上用docker部署多个容器,用docker stop来停掉程序36. 那你知道在Linux平台,进程退出的时候会有几种信号,你知道几种它们有什么不同?不清楚具体哪个信号,说了个shutdown和shutdownNowPS:GPT说有6种,对应不同触发的方式:SIGHUP是终端关闭挂起,SIGNT是Ctrl键+c优雅退出,SIGQUIT是Ctrl键+\用于调试,SIGKILL是强制终止进程,SIGTERM是kill <PID>用来杀死进程优雅终止,SIGTOP是暂停进程可恢复37. OK,那你对Window系统相关的知识了解吗?不太清楚,只用过一些简单命令行做题:翻转数字?(“123456”输出“654321”)聊天环节:1. 因为我们这边是客户端开发,你这个经验都是服务端的,有做过安卓或者是其他平台的开发吗?做过一个功能比较全的C#全栈作业2. 那你愿意找客户端吗?(灵魂拷问)(流汗黄豆)可以考虑反问:3. 腾讯对于转语言或者转岗位的同学会有过渡的培训吗?会有,但也看部门,主要是看你有没有意愿去做这个方向的工作4. 元宝客户端具体是做PC端还是移动端?都有,具体看你兴趣就行(😥)5. 那具体的业务是干什么的?业务就是元宝客户端,你在各个平台都能搜到的吧,这就是我们的业务(😥这不没说吗?)6. 那客户端主要的工作是集中在哪些方面?用户使用界面?类似前端JS的逻辑处理?都会做,不光是UI展示,还有用户交互层面,也有数据要处理。虽说是客户端,但是整个数据的上下链路都是要做的7. 腾讯对实习生会不会苛刻一些?主要看不同部门的要求,我们这边还好,更注重你的基础是否扎实,解决问题的能力。
点赞 评论 收藏
分享
评论
13
66
分享

创作者周榜

更多
牛客网
牛客企业服务