阿里淘系提前批一面(自己的第一次面试)

第一次是3.5号下午打电话过来问我有空没有,准备第一轮面试,当时我接到电话人慌了,然后很紧张就说当时没在家(其实我在家),面试官很好,然后和我约定了第二天下午两点开始面试

时长:55min

教训:不是很懂的千万别往简历上写,来自一个被dubbo问懵的沙雕选手。。。。

1.为什么新生代用复制算法,老年代用标记整理和标记清除算法,不同的算法的不同的优点?

    首先,因为新生代的垃圾回收是很频繁的,并且新生代需要清理的对象数量很多,假如采用标记整理算法,需要大量的移动操作,时间复杂度很高,而复制算法,不需要移动,而是直接将存活对象进行复制大大减少了时间复杂度,所以新生代采用复制算法。不过缺点就是浪费了一半的内存,并且如果对象的存活率很高,那么需要将所有对都复制一遍,造成的开销特别大,而新生代的对象的存活时间都不是很长的,所以在新生代使用复制算法正合适

    接下来,为什么老年代不使用复制算法呢?也正是因为老年代中都是一些大对象,一些存活时间长的对象,所以假如使用复制算法,那么开销就很大。并且老年代没有内存分配担保机制,所以就使用了标记整理或者标记清除算法来进行回收

jvm常见命令的作用

   jps:显示指定系统内所有的虚拟机进程

   jstat:用于收集虚拟机各方面的运行数据

   jinfo:显示虚拟机的配置信息

  jmap:生成虚拟机的内存存储快照

 jhat:分析heapdump文件(也就是分析jmap生成的存储快照)

 jstack:显示虚拟机的线程快照(java堆栈跟踪工具)

ThreadLocal的用法:

     主要是用来讲一个值和保存该值的对象关联起来,是为了避免变量在线程间进行共享,也能够避免当某个操作需要频繁地操作某个对象但是又不想频繁地创建和销毁时用ThreadLocal

Dubbo的连接协议?

  dubbo协议:是一个缺省协议,单一长连接,序列化协议是hessian二进制序列化协议,传输协议是tcp协议,方式是nio异步传输

  dubbo的hessian协议可以用于继承hessian的服务,与原生的hessian服务互相操作。提供者用dubbo的hessian协议暴露服务,消费者直接用标准hessian接口调用即可,或者提供方用标准hessian暴露服务,消费方用hessian协议调用

ZooKeeper的选举过程?

    1.服务器启动时的leader选举:

           1)每个服务器发出一个投票,先给自己投一票,然年将投票结果发给其他服务器

           2)各个服务器接收来自其他服务器的投票,每个服务器收到投票后,判断投票的有效性

          3)处理投票,针对每个投票,都要将别人的投票和自己的投票进行比较,zxid大的服务器优先成为leader,如果zxid相同,那么比较myid,myid较大的成为leader服务器

         4)统计投票,判断是否已经有过半的机器接收到相同的投票信息

         5)改变服务器状态,follower更改为following,leader更改为leading

  2.服务器运行期间的leader选举:

      1)变更状态,剩下的服务器将状态改变为looking,然后开始进入leader过程

       接下来的过程就和启动时的选举过程一样了

为什么要有jdk动态代理和CGLIB动态代理?

    jdk动态代理:由于子类要继承Proxy类,而java是单继承的,所以不能再继承了,这个时候就使用了接口,那么为什么要继承proxy类呢?因为proxy内部维护了一个invocationHandler对象进行invoke aop操作

   CGLIB动态代理:它是通过直接修改字节码进行增强子类,所以被代理的类不能是final的,那么为什么不继承Proxy呢?目的是调用父类的构造函数并使用子类传递给父类的invocationHandler来调用invoke

   总结:jdk代理只能基于接口代理(因为他已经继承了Proxy),CGLIB无论有没有实现接口都可以代理,因为它是通过继承的方式进行代理的,并没有去继承Proxy类,但是却无法继承final类

ioc加载bean的过程?

   1.创建真正的bean容器

   2.加载BeanDefinition(描述初始化的bean的信息)

   3.将BeanDefinition注册到BeanDefinitionRegistry

bean的生命周期?

   必须是详细版的,我一开始就说实例化bean,然后就被反问一来就是实例化bean吗?前面的操作呢。当时我就懵了,,因为我以前看的就是说直接实例化bean。。这次栽了。。。。

    过程:

         1)实例化BeanFactoryPostProcessor实现类

         2)执行BeanFactoryPostProcessor的postProcessBean方法

         3)实例化BeanPostProcessor的实现类

         4)实例化InstantiationAwareBeanPostProcessorAdapter实现类

        5)执行postProcessBeforeInstantion方法

        6)执行bean的构造器

       7)执行postProcessPropertyValue方法

       8)为bean注入属性

     9)调用setBeanName方法

      10)调用setBeanFactory方法

      11)调用bean的init-method进行初始化

     12)开始使用bean

    13)使用完成后销毁bean

    其实我感觉上面的我是记不住的,而且感觉一般的就是从实例化bean开始啊,想哭。。我还是直接背下面的图的版本吧:

     

注解的原理?

       通过反射来实现的

MVC中请求发送到Controller的过程?

         1.浏览器向服务器发送htpp请求,被dispatchServlet拦截

         2.dispatcher解析url,根据url调用handleMapping获得handler的所有相关对象

        3.dispatchServlet根据获得的handler选择合适的handlerAdapter

       4.提取request中的模型数据填充handler,开始执行handler

      5.返回ModelAndView对象,将逻辑视图转换为真正的视图,然后返回给客户端

spingboot,springmvc,spring的区别?

    springboot是一个配置工具,springmvc是一个框架,springmvc提供了一种轻度耦合的方式来开发,是spring的一个模块,springboot实现了自动配置,主要解决了spring框架进行大量配置的问题,它不是替代spring的,而是提升spring开发者体验的工具

dubbo的隐式传参

   提供方使用RpcContext.getContext().getAttachments()获取参数

    消费方使用RpcContext.getContext().setAttachments()来传递参数

     RpcContext是一个ThreadLocal的临时状态记录器,但是记录时两台机器必须是直接调用,比如A调用B,而不能是A调用C,C调用B,那么B的getStachments()获取不到任何值

如何从100亿个url中找出重复的url?

      方法1:将所有数据存储在一台机器上,对数据进行两个扫描,第一次这些数据进行分组,然后根据每个网址的hash值%分组的数量存放在这个x.txt中(x=hash(网址)% 分组数量),这样一来所有散列值相同的网址都会位于同一个文件,然后再进行一次扫描,这次扫描将每个文件载入内存,找出重复的,也就是对每一个txt文件里面用hashmap的方法来找出重复的

    方法2:步骤和方法1差不多,只不过是将网址发送到不同机器上,而不是不同的txt文件里

   

发布了208 篇原创文章 · 获赞 0 · 访问量 5968

猜你喜欢

转载自blog.csdn.net/qq_40058686/article/details/104711525