第一轮

  • 自我介绍
  • sleep方法与wait方法的区别
  • 举例说明哪些情况会引起mysql全表扫描
  • kong网关性能怎么样,有没有跟APISIX比较过
  • JVM加载类的过程
  • 开发和发布的流程。
  • 你们平台内部调用有没有做加解密。复盘:应该说jwt的
  • 代码重构
  • 有没有做过接口优化,针对长调用进行性能优化
  • mysql日志的几种类型及其用处

第二轮

  • k8s部署比较传统非容器部署方式的优点
  • service用过哪些类型? ClusterIP, NodePort, LoadBalancer等
  • 你们公司用的k8s集群的规模(指底层IAAS层)
  • python有用过Answerable吗
  • ELK里的日志收集器有出现过OOM吗
  • 监控系统?我回答:采集器CAdvisor+时序数据库Prometheus+可视化工具Grafana。面试官居然讲我说反了。我记得很清楚没有搞反,后面也翻了一下资料,搞反的不是我。
  • mysql使用中遇到过什么问题吗,比如连接池访问量过大,连接不上了,或者库的同步问题
  • 如果堆内存小于32G,JVM会怎样,对象头会默认开启什么?参考答案:指针压缩。

此文看懂一部分,总觉得有些问题讲得不透彻。比如按文中逻辑,我看明白了指针压缩使用8字节对齐方式,所以32位系统可以对32G内存进行寻址。但这个是怎么得出64位系统堆内存超过32G,指针压缩失效的结论的。64位系统寻址空间大小应该是32位系统的平方啊

  • jmap导出的文件后缀名一般是什么
  • springboot统一鉴权怎么做。A:Filter. Q: 如果只想对几个方法鉴权,用AspectJ,知道做吗?
    我总结几个关键点(以下代码参考12):

@Aspect 切面类
@Pointcut 切点: 切面类里定义 用@Pointcut修饰的方法, 使用 切点表达式函数 来描述对哪些 Join point(连接点) 使用 advise。如:

@Pointcut("@annotation(com.xys.demo1.AuthChecker)")
    public void pointcut() {
    }

@Advice 通知,或者称为增强。如:

@Around("pointcut()")
    public Object checkAuth(ProceedingJoinPoint joinPoint) throws Throwable {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();
 
        // 检查用户所传递的 token 是否合法
        String token = getUserToken(request);
        if (!token.equalsIgnoreCase("123456")) {
            return "错误, 权限不合法!";
        }
 
        return joinPoint.proceed();
    }

自定义注解AuthChecker.java用来定位切点:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AuthChecker {
}
  • 设计一个限流机制,有看过Hystrix源码吗
  • 写过spring boot starter吗
  • JVM新生代为什么要分成Eden区和Survivor区
    复盘:这个问题我搜了下资料,网上有很多几乎一样的文档:“如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代 。。。Survivor的存在意义,就是减少被送到老年代的对象,进而减少Full GC的发生” 这段我认为解释不通,为什么如果没有Survivor,Eden区每进行一次Minor GC,存活的对象就会被送到老年代呢?就一直在Eden区进行回收,年龄超过阈值才送往老年代,不是一样吗?
  • 熟悉CICD基础工具吗
  • 微服务是怎样部署到k8s的。Consul里面存的是什么地址,是Pod地址,还是Service地址,还是什么?复盘:Pod地址。
  • docker compose有用过吗?DockerFile里的CMD与EntryPoint是什么区别?