好不容易从传统行业跳出来,选了一个互联网的坑,没想到公司融资失败,业务又不好,到试用期快结束的时候才劝退,还是当天就让你走的,这种公司我也只能自认倒霉了,在此提醒大家要在要看好公司,否则太影响心情了;接下来整理下我后面几次面试的一些问题:

yz:

先从业务上去问:

1:请先讲讲你之前几个项目经验中对你帮助最大的项目是什么?

      这个需要自己准备下,我个人觉的要把项目的架构模块,业务模型讲讲,其中用了些什么技术【个人想法不知道有没有更好思路推荐】

2:你们项目中的哪些地方使用到了redis?

      我接触到的是作为session缓存,和mybatis的二级缓存

3:假如session发生变化时,redis的主库中挂了,此时没有同步到从库,要怎么设计防止数据不一致?

      这个问题我有点把握不住,因为redis是有持久化的,比如快照,或者aof;当redis主数据库挂掉感觉可以从aof文件中去重新读取之前的信息,不过这样貌似保证不了session的实时性(自己猜测,请大家指教,后续修改)

4:synchroniz和lock的区别是什么?

     1) lock是一个接口,而synchronized是java的一个关键字,synchronized是内置的语言实现

     2)synchronized在发生异常时候会自动释放占有的锁,因此不会出现死锁;而lock发生异常时候,不会主动释放占有的锁,必须手动unlock来释放锁,可能引起死锁的发生。

     3) lock等待锁过程中可以用interrupt来终端等待,而synchronized只能等待锁的释放,不能响应中断;

     4)lock可以通过trylock来知道有没有获取锁,而synchronized不能;

     这个参考网址:https://blog.csdn.net/u011307997/article/details/77444110

开始从java基础:

1:假如你想保证线程安全,你要用什么集合呢?

     concurrentHashmap

2:你知道concurrentHashmap在1.7和1.8中安全的区别在哪里体现?

      所机制会有所不同

     jdk1.7采用的分段所机制,简单讲就是讲一个大table分割成多个小table进行加锁;他是先定义一个segment数组和多个hashEntry组成,它这里sgment就是继承了ConncurrentLock类,通过trylock()方法获取锁;锁粒度是segment

   jdk1.8采用的是node数组+链表+红黑树的数据结构,摒弃的所分段,采用的synchronize和cas来进行的保证数据一致,锁力度更小,速度更快,结构也会更清晰;

    这里是简单讲解下,最好去看下他们的里面的详细结构和机制

3:你有了解过concurrent包里的方法么?

4:有了解过栅栏和闭包么?

5:你了解threadLocal的使用么?

spring问题:

1:请讲下springBean的加载过程,简单讲下

2:请说下spingbean的作用域:

     5中作用域:

  • singleton : bean在每个Spring ioc 容器中只有一个实例。
  • prototype:一个bean的定义可以有多个实例。
  • request:每次http请求都会创建一个bean,该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • session:在一个HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。
  • global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该作用域仅在基于web的Spring ApplicationContext情形下有效。    

3:spring常用的注解有哪些?

     @controller @service @resource @transition

4:假如A是一个类,其中有方法B和方法C,B方法有注解,c方法没有注解,C会调用B的方法,然后外面调用C方法,此时有发生事物么?请分析下【这个问题可能我记录的有问题】

jvm问题:

1:请讲下cms收集器和G1收集器的区别?

       cms垃圾收集器:

             以获取最短时间为目标【标记-清除】

             执行过程:初始标记(stop)->并发标记 -> 重新标记(stop) -> 并发清除

             缺点:cpu资源敏感,无法清除浮动碎片,他的算法机制会导致有空间碎片

     G1垃圾收集器:

           并行并发的,分代收集,空间整合:整体是标记-整理,局部是2个regin的复制算法,可预测停顿时间的

           它是将java堆分成多个大小的独立区域,新生代和老年代不再是物理隔离

           执行过程:初始标记->并发标记 -> 重新标记 -> 筛选回收 【这个我在看下】       

2:讲下cms的收集器会发生几次stop事件?

        2次,请看上题       

3:每隔10分钟,系统里的元空间就会发生一次fullGC,请分析下可能出现的问题?

        首先需要讲明一下,在jdk1.8以后,永久带已经被metaspace(元空间)取代。metaspace是保存在本地内存中,是没有上限的;在jvm中有个参数MetaspaceSize的默认值约21m左右。jdl1.8以后,metaspace主要用来保存方法和类的,字符串常量的保存已经移动到了堆内存(堆内存会有个String常量池,这个String池保存的是的字符串的对象,这里不展开说);

      如果metaSpace总是发生fullgc,那我们首先会去考虑这个jvm中的参数MetaSpaceSize以及maxMetaSpaceSize是否设置的太小,虽然说是物理内存大小,有可能被设置了

      其次,我们会想metaSpace主要存放的是类,会不会是类加载去出现了什么问题,比如类加载器导致内存泄漏

以上仅是个人猜测,如有不对请指导,万分感谢,同时对于jvm的参数相关知识,我这里推荐一个大神(你假笨:http://lovestblog.cn/)的博客,可以关注他的公众号还有他的一个jvm参数小程序,可以直接去查看参数的初始值什么的

数据库:

1:mysql的查询的时候怎么用到行锁

2:mysql的索引结构知道么?

3:mysql的索引在InnoDB和MyISAM下的区别是什么?

     先甩个连接,后面我再简化下https://blog.csdn.net/ljfphp/article/details/80029968

4:sql优化问题1:假如分页查询时,limit偏移量超过4w的时候,我们对数据查询有什么可以优化的?

      代码示例: select * from user limit 10000,10;   这条sql语句多次运行,时间保持在0.0187左右  

      代码示例: select * from user where uid >=( select uid from user order by uid limit 10000,1 ) limit 10; 这条sql语句多次运行,时间保持在0.0061左右,只有前者的1/3。可以预计offset越大,后者越优。

     这个主要需要去了解mysql的索引机制

      参考网址:

       https://blog.csdn.net/fdipzone/article/details/72793837  这个讲述了原理

5:sql优化问题2:一张表建立一个聚合索引a,b,c(有顺序的),此时我查询时where条件下a=xxx and b=xxx,此时会走索引么?假如走索引走什么的索引?

      会走索引,走索引ab索引;

     abc顺序的索引可以搜索,a,ab,abc;如果是bc的话,则不走索引

分布式问题:

6:你了解分布式锁么?

7:你了解分布式事物么?

8:请讲讲rabbitMQ和kafaka的区别

    Kafka:严格保证了消息队列的顺序,就是一个topic下面的一个分区内只能给一个消费者消费;对于一个分区来说,kafka是不支持并发,但是可以通过扩大分区实现并发

   Rabbitmq 不承诺消息的顺序性,因此可以并发多线程处理。在队列中不必排队。如果对处理的顺序没有要求,就可以用Rabbitmq教容易的实现并发。

9:rabbit场景问题:假如我发送聊天消息,必须按顺序执行,你怎么处理?

    当时被问的有点蒙,回过来来想,是不是可以从应用层的角度去考虑,比如每条消息我保存到数据库中,并记录他执行的顺顺序,当该步执行完毕,我再去发送下一条的消息;

    其他方法稍后再总结

10:zookeeper是如何实现服务发现和服务管理的?

11:线程池有了解过么?

 

 

10-13 04:25