1、Hashcode的作用,与equal有什么区别?
a.同样用于鉴定2个对象是否相等的,java集合中有list和set两类,其中set不允许元素重复实现,那么这个不允许重复实现的方法,如果用equal去比较的话,如果存在1000个元素,你new一个新的元素出来,需要去调用1000次equal去逐个和他们比较是否是同一个对象,这样会大大降低效率。hashcode实际上是返回对象的存储地址,如果这个位置上没有元素,就把元素直接存储在上面,如果这个位置上已经存在元素,这个时候才去调用equal方法与新元素进行比较,相同的话就不存了,散列到其他地址上。
2、cloneable接口实现原理:只有实现了这个接口,才可以调用Object的clone方法,否则CloneNotSupporteddException
3、comparable与comparator的区别:前者是内部排序,后者是外部排序
4、什么是泛型、为什么要使用以及泛型擦除#
泛型,即“参数化类型”。创建集合时就指定集合元素的类型,该集合只能保存其指定类型的元素,避免使用强制类型转换。Java编译器生成的字节码是不包涵泛型信息的,泛型类型信息将在编译处理是被擦除,这个过程即类型擦除。泛型擦除可以简单的理解为将泛型java代码转换为普通java代码,只不过编译器更直接点,将泛型java代码直接转换成普通java字节码。类型擦除的主要过程如下:1)将所有的泛型参数用其最左边界(最顶级的父类型)类型替换。2)移除所有的类型参数。
5、Error、Exception区别#
6、Object有哪些公用方法
7、Java的四种引用,强弱软虚,用到的场景
8、Java对象的生命周期
答:创建阶段、应用阶段、不可见阶段、不可达阶段、收集阶段、终结阶段、对象空间重新分配阶段等等,具体参照:Java对象的生命周期
9、Java类的生命周期:加载------》连接(验证-->准备-->解析)------》初始化------》使用------》卸载
9、一个类对象属性发生改变时,如何让调用者知道:Event事件机制
10、statement和preparedStatement的区别
11、Arraylist的循环删除问题:迭代的时候使用list.remove就会引起ConcurrentModificationException,因为迭代的时候mod是迭代开始时的快照,list.remove时修改了集合的mod,导致迭代时mod快照与集合mod比较不一致就异常了
1、HashMap的实现机制:
维护一个每个元素是一个链表的数组,而且链表中的每个节点是一个Entry[]键值对的数据结构。实现了数组+链表(1.8新增红黑树)的特性,查找快,插入删除也快。对于每个key,他对应的数组索引下标是inti=hash(key.hashcode)&(len-1);每个新加入的节点放在链表首,然后该新加入的节点指向原链表首
2、HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。:jdk8中hashmap在单链的基础上,增加了单链超过定长(8)坍缩成红黑树,提高了新增和删除节点的效率,提高了读取节点的效率
3、HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小
6、HashMap是线程安全的吗,为什么不是线程安全的(最好画图说明多线程环境下不安全):1.7及以前高并发情况下容易形成环,1.8中也有问题
7、HashMap的扩容过程:默认初始值16,扩容因子0.75,扩容到原来两倍
4、HashMap冲突:
8、HashMap1.7与1.8的区别,说明1.8做了哪些优化,如何优化的?
63、HashMap的长度为什么是2的幂次方?
通过将Key的hash值与length-1进行&运算,实现了当前Key的定位,2的幂次方可以减少冲突(碰撞)的次数,提高HashMap查询效率;如果length为2的次幂则length-1转化为二进制必定是11111……的形式,在于h的二进制与操作效率会非常的快,而且空间不浪费;如果length不是2的次幂,比如length为15,则length-1为14,对应的二进制为1110,在于h与操作,最后一位都为0,而0001,0011,0101,1001,1011,0111,1101这几个位置永远都不能存放元素了,空间浪费相当大。更糟的是这种情况中,数组可以使用的位置比数组长度小了很多,这意味着进一步增加了碰撞的几率,减慢了查询的效率!这样就会造成空间的浪费。
48、HashMap和HashTable区别#1)HashTable的方法前面都有synchronized来同步,是线程安全的;HashMap未经同步,是非线程安全的。2)HashTable不允许null值(key和value都不可以);HashMap允许null值(key和value都可以)。3)HashTable有一个contains(Objectvalue)功能和containsValue(Objectvalue)功能一样。4)HashTable使用Enumeration进行遍历;HashMap使用Iterator进行遍历。5)HashTable中hash数组默认大小是11,增加的方式是old*2+1;HashMap中hash数组的默认大小是16,而且一定是2的指数。6)哈希值的使用不同,HashTable直接使用对象的hashCode;HashMap重新计算hash值,而且用与代替求模。
3、HashMap和TreeMap区别:
9、LinkedHashMap的原理及应用:LRU算法
14、极高并发下HashTable和ConcurrentHashMap哪个性能更好,为什么,如何实现的。
15、TreeMap、HashMap、LindedHashMap的区别
LinkedHashMap可以保证HashMap集合有序,存入的顺序和取出的顺序一致。TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。HashMap不保证顺序,即为无序的,具有很快的访问速度。HashMap最多只允许一条记录的键为Null;允许多条记录的值为Null。HashMap不支持线程的同步。
我们在开发的过程中使用HashMap比较多,在Map中在Map中插入、删除和定位元素,HashMap是最好的选择。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列。
12、CopyOnWriteArrayList:写时加锁,当添加一个元素的时候,将原来的容器进行copy,复制出一个新的容器,然后在新的容器里面写,写完之后再将原容器的引用指向新的容器,而读的时候是读旧容器的数据,所以可以进行并发的读,但这是一种弱一致性的策略。使用场景:CopyOnWriteArrayList适合使用在读操作远远大于写操作的场景里,比如缓存。
14、Arrays和Collections对于sort的不同实现原理?
1。Arrays.sort()该算法是一个经过调优的快速排序,此算法在很多数据集上提供N*log(N)的性能,这导致其他快速排序会降低二次型性能。2。Collections.sort()该算法是一个经过修改的合并排序算法(其中,如果低子列表中的最高元素效益高子列表中的最低元素,则忽略合并)。此算法可提供保证的N*log(N)的性能,此实现将指定列表转储到一个数组中,然后再对数组进行排序,在重置数组中相应位置处每个元素的列表上进行迭代。
15、说说常见的集合有哪些吧?
Map接口和Collection接口是所有集合框架的父接口:Collection接口的子接口包括:Set接口和List接口;Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等;Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等;List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等。
65、List、Set和Map的初始容量和加载因子
1.ListArrayList的初始容量是10;加载因子为0.5;扩容增量:原容量的0.5倍+1;一次扩容后长度为16。Vector初始容量为10,加载因子是1。扩容增量:原容量的1倍,如Vector的容量为10,一次扩容后是容量为20。2.SetHashSet,初始容量为16,加载因子为0.75;扩容增量:原容量的1倍;如HashSet的容量为16,一次扩容后容量为323.MapHashMap,初始容量16,加载因子为0.75;扩容增量:原容量的1倍;如HashMap的容量为16,一次扩容后容量为32
67、Java集合的快速失败机制“fail-fast”它是java集合的一种错误检测机制,当多个线程对集合进行结构上的改变的操作时,有可能会产生fail-fast机制。例如:假设存在两个线程(线程1、线程2),线程1通过Iterator在遍历集合A中的元素,在某个时候线程2修改了集合A的结构(是结构上面的修改,而不是简单的修改集合元素的内容),那么这个时候程序就会抛出ConcurrentModificationException异常,从而产生fail-fast机制。原因:迭代器在遍历时直接访问集合中的内容,并且在遍历过程中使用一个modCount变量。集合在被遍历期间如果内容发生变化,就会改变modCount的值。
每当迭代器使用hashNext()/next()遍历下一个元素之前,都会检测modCount变量是否为expectedmodCount值,是的话就返回遍历;否则抛出异常,终止遍历。解决办法:在遍历过程中,所有涉及到改变modCount值得地方全部加上synchronized;使用CopyOnWriteArrayList来替换ArrayList。
1、创建线程的方式及实现:Thread,Runnable,Callable
62、wait/notify/notifyAll法需不需要被包含在synchronized块中?这是为什么?:需要,否则会抛出异常
68、Thread类中的start()和run()方法有什么区别?
72、如何避免死锁?
73、Java中活锁和死锁有什么区别?饿死?:活锁是都让别人去获取锁,结果都不获取锁,解决方式为只让一个人释放资源|死锁是都自己去获取锁,结果都获取不到锁|饿死是任务一直获取不到资源,解决为采用队列
2、CountDownLatch,CyclicBarrier,Semaphore,Exchanger的原理
48、CountDownLatch和CyclicBarrier的用法,以及相互之间的差别:前者是等所有线程完成后另外一个线程做一件事情,后者是等所有线程完成后一起做一件事情
35、怎么实现所有线程在等待某个事件的发生才会去执行?:CyclicBarrier
4、ThreadLocal(线程变量副本)
5、Volatile和Synchronized四个不同点:
1。粒度不同,前者针对变量,后者锁对象和类2。syn阻塞,volatile线程不阻塞3。syn保证三大特性(可见性,原子性,有序性),volatile不保证原子性4。syn编译器优化,volatile不优化
6、同步,异步,阻塞,非阻塞
93、Volatile的特征:A、禁止指令重排(有例外)B、可见性Volatile的内存语义:当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。当读一个volatile变量时,JMM会把线程对应的本地内存置为无效,线程接下来将从主内存中读取共享变量。Volatile的重排序1。当第二个操作为volatile写操做时,不管第一个操作是什么(普通读写或者volatile读写),都不能进行重排序。这个规则确保volatile写之前的所有操作都不会被重排序到volatile之后;2。当第一个操作为volatile读操作时,不管第二个操作是什么,都不能进行重排序。这个规则确保volatile读之后的所有操作都不会被重排序到volatile之前;3。当第一个操作是volatile写操作时,第二个操作是volatile读操作,不能进行重排序。这个规则和前面两个规则一起构成了:两个volatile变量操作不能够进行重排序;
除以上三种情况以外可以进行重排序。比如:1。第一个操作是普通变量读/写,第二个是volatile变量的读;2。第一个操作是volatile变量的写,第二个是普通变量的读/写;
31、synchronized的实现原理以及锁优化?
61、synchronized关键字锁住的是什么东?在字节码中是怎么表示的?在内存中的对象上表现为什么?
138、synchronized关键字:底层实现:进入时,执行monitorenter,将计数器+1,释放锁monitorexit时,计数器-1;当一个线程判断到计数器为0时,则当前锁空闲,可以占用;反之,当前线程进入等待状态。含义:(monitor机制)Synchronized是在加锁,加对象锁。对象锁是一种重量锁(monitor),synchronized的锁机制会根据线程竞争情况在运行时会有偏向锁(单一线程)、轻量锁(多个线程访问synchronized区域)、对象锁(重量锁,多个线程存在竞争的情况)、自旋锁等。该关键字是一个几种锁的封装。
139、synchronized锁膨胀原理:自旋锁?无锁->偏向锁->轻量级锁(cas)->重量级锁
32、volatile的实现原理?
33、双检锁DCL问题:线程安全问题,其他线程获取到的单例实例可能还未初始化完(happens-before原理引起的),解决方案为单例实例改为volatile,或者不要采用懒加载,或者用枚举,或者用holder模式
36、CAS?CAS有什么缺陷,如何解决?:ABA问题,AtomicStampedReference通过版本号来解决
37、ABA问题:AtomicStampedReference通过版本号来解决
37、synchronized和lock有什么区别?
74、Java中synchronized和ReentrantLock有什么不同?
41、AQS
49、LockSupport工具
50、Condition接口及其实现原理
76、如何在Java中创建Immutable对象?:final,集合类的unmodified。。。
95、happens-before原则
96、Java线程有哪些状态,这些状态之间是如何转化的?
41、Blocked和Waiting的区别
42、Java内存模型?
38、HashMap的并发问题?
40、ConcurrenHashMap介绍?1.8中为什么要用红黑树?
43、如何保证多线程下i++结果正确?:加锁,或者用AtomicInteger
52、分段锁的原理,锁力度减小的思考
53、八种阻塞队列以及各个阻塞队列的特性
55.多个线程同时读写,读线程的数量远远于写线程,你认为应该如何解决并发的问题?你会选择加什么样的锁?:读写锁
51、Fork/Join框架的理解
134、如何指定多个线程的执行顺序?解析:面试官会给你举个例子,如何让10个线程按照顺序打印0123456789?(写代码实现)答:设定一个orderNum,每个线程执行结束之后,更新orderNum,指明下一个要执行的线程。并且唤醒所有的等待线程。在每一个线程的开始,要while判断orderNum是否等于自己的要求值!!不是,则wait,是则执行本线程。
136、多线程产生死锁的4个必要条件?互斥条件:一个资源每次只能被一个线程使用;请求与保持条件:一个线程因请求资源而阻塞时,对已获得的资源保持不放;不剥夺条件:进程已经获得的资源,在未使用完之前,不能强行剥夺;循环等待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
137、如何避免死锁?指定获取锁的顺序,举例如下:比如某个线程只有获得A锁和B锁才能对某资源进行操作,在多线程条件下,如何避免死锁?获得锁的顺序是一定的,比如规定,只有获得A锁的线程才有资格获取B锁,按顺序获取锁就可以避免死锁
138、悲观锁和乐观锁的区别,怎么实现悲观锁:一段执行逻辑加上悲观锁,不同线程同时执行时,只能有一个线程执行,其他的线程在入口处等待,直到锁被释放。|selectforupdate乐观锁:一段执行逻辑加上乐观锁,不同线程同时执行时,可以同时进入执行,在最后更新数据的时候要检查这些数据是否被其他线程修改了(版本和执行初是否相同),没有修改则进行更新,否则放弃本次操作。|版本号
6、线程池的作用:在程序启动的时候就创建若干线程来响应处理,它们被称为线程池,里面的线程叫工作线程第一:降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。第二:提高响应速度。当任务到达时,任务可以不需要等到线程创建就能立即执行。第三:提高线程的可管理性。常用线程池:ExecutorService是主要的实现类,其中常用的有Executors.newSingleThreadPool(),newFixedThreadPool(),newcachedTheadPool(),newScheduledThreadPool()。
44、线程池的种类,区别和使用场景?
46、线程池如何调优,最大数目如何确认?:有个公式
45、分析线程池的实现原理和线程的调度过程?
59、线程池内的线程如果全部忙,提交个新的任务,会发什么?队列全部塞满了之后,还是忙,再提交会发什么?
7、说说阻塞队列的实现:可以参考ArrayBlockingQueue的底层实现(锁和同步都行)
7、线程池原理:
等待任务队列和工作集:
线程池的主要状态锁:
ThreadPoolExecutor的内部工作原理
1.如果当前池大小poolSize小于corePoolSize,则创建新线程执行任务。2.如果当前池大小poolSize大于corePoolSize,且等待队列未满,则进入等待队列3.如果当前池大小poolSize大于corePoolSize且小于maximumPoolSize,且等待队列已满,则创建新线程执行任务。4.如果当前池大小poolSize大于corePoolSize且大于maximumPoolSize,且等待队列已满,则调用拒绝策略来处理该任务。5.线程池里的每个线程执行完任务后不会立刻退出,而是会去检查下等待队列里是否还有线程任务需要执行,如果在keepAliveTime里等不到新的任务了,那么线程就会退出。
60.Tomcat本身的参数你般会怎么调整?:调整线程池大小
22、OOM错误,stackoverflow错误,permgenspace错误
2、“你能不能谈谈,javaGC是在什么时候,对什么东西,做了什么事情?”在什么时候:1.新生代有一个Eden区和两个survivor区,首先将对象放入Eden区,如果空间不足就向其中的一个survivor区上放,如果仍然放不下就会引发一次发生在新生代的minorGC,将存活的对象放入另一个survivor区中,然后清空Eden和之前的那个survivor区的内存。在某次GC过程中,如果发现仍然又放不下的对象,就将这些对象放入老年代内存里去。2.大对象以及长期存活的对象直接进入老年区。3.当每次执行minorGC的时候应该对要晋升到老年代的对象进行分析,如果这些马上要到老年区的老年对象的大小超过了老年区的剩余大小,那么执行一次FullGC以尽可能地获得老年区的空间。
对什么东西:从GCRoots搜索不到,而且经过一次标记清理之后仍没有复活的对象。做什么:新生代:复制清理;老年代:标记-清除和标记-压缩算法;永久代:存放Java中的类和加载类的类加载器本身。GCRoots都有哪些:1.虚拟机栈中的引用的对象2.方法区中静态属性引用的对象,常量引用的对象3.本地方法栈中JNI(即一般说的Native方法)引用的对象。
3、类加载器工作机制:1。装载:将Java二进制代码导入jvm中,生成Class文件。2。连接:a)校验:检查载入Class文件数据的正确性b)准备:给类的静态变量分配存储空间c)解析:将符号引用转成直接引用3。初始化:对类的静态变量,静态方法和静态代码块执行初始化工作。双亲委派模型:类加载器收到类加载请求,首先将请求委派给父类加载器完成用户自定义加载器->应用程序加载器->扩展类加载器->启动类加载器。
16、类加载为什么要使用双亲委派模式,有没有什么场景是打破了这个模式?:有,Thread.currentThread可以设置classloader,以及osgi
25.JAVA类加载器包括种?它们之间的关系是怎么样的?双亲委派机制是什么意思?有什么好处?
54、Java类加载的过程。
55、双亲委派模型的过程以及优势。
65、Class.forName和ClassLoader.loadClass的区别
6、JAVA多态的实现原理a.抽象的来讲,多态的意思就是同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)b.实现的原理是动态绑定,程序调用的方法在运行期才动态绑定,追溯源码可以发现,JVM通过参数的自动转型来找到合适的办法。
9、数组在内存中如何分配:简单类型数组在栈上分配,引用类型在堆上分配
14、JVM年轻代到年老代的晋升过程的判断条件是什么呢?
18、JVM垃圾回收机制,何时触发MinorGC等操作:eden区无法为对象分配空间
19、JVM中一次完整的GC流程(从ygc到fgc)是怎样的
45、JVM方法栈的工作过程,方法栈和本地方法栈有什么区别。
46、JVM的栈中引用如何和堆中的对象产生关联。
44、JVM的内存结构。
50、edensurvivor区的比例,为什么是这个比例,edensurvivor的工作过程。
49、标记清除和标记整理算法的理解以及优缺点。
69、垃圾回收算法有哪些?引用计数:原理是此对象有一个引用,即增加一个计数,删除一个引用则减少一个计数。垃圾回收时,只用收集计数为0的对象。此算法最致命的是无法处理循环引用的问题;标记-清除:此算法执行分两阶段。第一阶段从引用根节点开始标记所有被引用的对象,第二阶段遍历整个堆,把未标记的对象清除;此算法需要暂停整个应用,同时,会产生内存碎片;复制算法:此算法把内存空间划为两个相等的区域,每次只使用其中一个区域。垃圾回收时,遍历当前使用区域,把正在使用中的对象复制到另外一个区域中;此算法每次只处理正在使用中的对象,因此复制成本比较小,同时复制过去以后还能进行相应的内存整理,不会出现“碎片”问题。当然,此算法的缺点也是很明显的,就是需要两倍内存空间;标记-整理:此算法结合了“标记-清除”和“复制”两个算法的优点。也是分两阶段,第一阶段从根节点开始标记所有被引用对象,第二阶段遍历整个堆,把清除未标记对象并且把存活对象“压缩”到堆的其中一块,按顺序排放。此算法避免了“标记-清除”的碎片问题,同时也避免了“复制”算法的空间问题。
48、GC的常见算法,CMS以及G1的垃圾回收过程,CMS的各个阶段哪两个是Stoptheworld的,CMS会不会产生碎片,G1的优势。
20、各种回收器,各自优缺点,重点CMS、G1
21、各种回收算法
53、Java是否可以GC直接内存。:不可以,是在ByteBuffer分配内存时设置了清理器
58、Java有没有主动触发GC的方式(没有)。
70、root搜索算法中,哪些可以作为root?被启动类(bootstrap加载器)加载的类和创建的对象;JavaStack中的引用的对象(栈内存中引用的对象);方法区中静态引用指向的对象;方法区中常量引用指向的对象;Native方法中JNI引用的对象。
71、GC什么时候开始?GC经常发生的区域是堆区,堆区还可以细分为新生代、老年代,新生代还分为一个Eden区和两个Survivor区。对象优先在Eden中分配,当Eden中没有足够空间时,虚拟机将发生一次MinorGC,因为Java大多数对象都是朝生夕灭,所以MinorGC非常频繁,而且速度也很快;FullGC,发生在老年代的GC,当老年代没有足够的空间时即发生FullGC,发生FullGC一般都会有一次MinorGC。大对象直接进入老年代,如很长的字符串数组,虚拟机提供一个;XX:PretenureSizeThreadhold参数,令大于这个参数值的对象直接在老年代中分配,避免在Eden区和两个Survivor区发生大量的内存拷贝;发生MinorGC时,虚拟机会检测之前每次晋升到老年代的平均大小是否大于老年代的剩余空间大小,如果大于,则进行一次FullGC,如果小于,则查看HandlePromotionFailure设置是否允许担保失败,如果允许,那只会进行一次MinorGC,如果不允许,则改为进行一次FullGC。
56、常用的JVM调优参数。
68、类似-Xms、-Xmn这些参数的含义:堆内存分配:JVM初始分配的内存由-Xms指定,默认是物理内存的1/64;JVM最大分配的内存由-Xmx指定,默认是物理内存的1/4;默认空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制;空余堆内存大于70%时,JVM会减少堆直到-Xms的最小限制;因此服务器一般设置-Xms、-Xmx相等以避免在每次GC后调整堆的大小。对象的堆内存由称为垃圾回收器的自动内存管理系统回收。非堆内存分配:JVM使用-XX:PermSize设置非堆内存初始值,默认是物理内存的1/64;由XX:MaxPermSize设置最大非堆内存的大小,默认是物理内存的1/4;-Xmn2G:设置年轻代大小为2G;-XX:SurvivorRatio,设置年轻代中Eden区与Survivor区的比值。
29.1.8之后PermSpace有哪些变动MetaSpace默认是限的么还是你们会通过什么式来指定:不是,默认20M,XX:MetaspaceSize=200m;-XX:MaxMetaspaceSize=256m
31.StackOverFlow异常有没有遇到过?般你猜测会在什么情况下被触发?如何指定个线程的堆栈?般你们写多少?:xss来指定
57、dump文件的分析。
59、内存溢出和内存泄漏的区别#内存溢出是指程序在申请内存时,没有足够的内存空间供其使用,出现outofmemory。内存泄漏是指分配出去的内存不再使用,但是无法回收。
线程共享部分:方法区,又名永久代,无GC(常量池内存不足OOM)。堆区,分配时内存不足则OOM。
线程私有部分:虚拟机栈,线程请求栈深度超过阈值则SOF,分配时内存不足OOM。本地方法栈,同虚拟机栈一样。程序计数器,没有OOM。
直接内存,空间不足则OOM
61、出现OOM如何解决#一.可通过命令定期抓取heapdump或者启动参数OOM时自动抓取heapdump文件。二.通过对比多个heapdump,以及heapdump的内容,分析代码找出内存占用最多的地方。三.分析占用的内存对象,是否是因为错误导致的内存未及时释放,或者数据过多导致的内存溢出。
15、JVM出现fullGC很频繁,怎么去线上排查问题?:
24.你知道哪些或者你们线上使什么GC策略它有什么优势,适于什么场景?
28.你有没有遇到过OutOfMemory问题?你是怎么来处理这个问题的?处理过程中有哪些收获?
35、请写一段栈溢出、堆溢出的代码递归调用可以导致栈溢出不断创建对象可以导致堆溢出
3、JavaIO与NIO
NIO是为了弥补IO操作的不足而诞生的,NIO的一些新特性有:非阻塞I/O,选择器,缓冲以及管道。管道(Channel),缓冲(Buffer),选择器(Selector)是其主要特征。概念解释Channel——管道实际上就像传统IO中的流,到任何目的地(或来自任何地方)的所有数据都必须通过一个Channel对象。一个Buffer实质上是一个容器对象。Selector——选择器用于监听多个管道的事件,使用传统的阻塞IO时我们可以方便的知道什么时候可以进行读写,而使用非阻塞通道,我们需要一些方法来知道什么时候通道准备好了,选择器正是为这个需要而诞生的。
以前的流总是堵塞的,一个线程只要对它进行操作,其它操作就会被堵塞,也就相当于水管没有阀门,你伸手接水的时候,不管水到了没有,你就都只能耗在接水(流)上。nio的Channel的加入,相当于增加了水龙头(有阀门),虽然一个时刻也只能接一个水管的水,但依赖轮换策略,在水量不大的时候,各个水管里流出来的水,都可以得到妥善接纳,这个关键之处就是增加了一个接水工,也就是Selector,他负责协调,也就是看哪根水管有水了的话,在当前水管的水接到一定程度的时候,就切换一下:临时关上当前水龙头,试着打开另一个水龙头(看看有没有水)。当其他人需要用水的时候,不是直接去接水,而是事前提了一个水桶给接水工,这个水桶就是Buffer。也就是,其他人虽然也可能要等,但不会在现场等,而是回家等,可以做其它事去,水接满了,接水工会通知他们。这其实也是非常接近当前社会分工细化的现实,也是统分利用现有资源达到并发效果的一种很经济的手段,而不是动不动就来个并行处理,虽然那样是最简单的,但也是最浪费资源的方式。
4、Netty的Reactor模型
20、一致性Hash算法,一致性Hash算法的应用:
我们把服务器集群分成n段,每个服务器负责一段路由key。
如果其中一台挂了,只是影响这一段路由key失效,不影响其他。
如果要加一台机器的话,我们加在其中一个分段中,那么这个分段也只有一小段路由key会失效,另外一小段不影响。
这样就在很大程度上减小了影响范围,主要应用在缓存集群中
18、B+树:树结构就是索引结构,采用B+树跟磁盘有关,磁盘会预读树结点附近的数据,这样就会很容易命中需要查询的数据,并且减少了磁盘IO次数
28、如何判断一个单链表是否有环:采用list来存放所有元素,有重复则存在环|采用不同步长的指针来遍历,步长较长的会赶上较短的
29、红黑树:因为红黑树的结构可以用很少的旋转开销就能完成插入和删除,减小了红黑树结构的维护成本
104、三次握手、四次挥手示意图:
握手阶段:C告诉S我要链接--->S回答C说已经准备好了--->C回答S说我收到你准备好了
挥手阶段:C告诉S我要断开--->S回答C说我准备断开了,但是等我发送完数据--->S告诉C说我发完最后一波数据了--->C回答S说我收到你最后一波数据
挥手阶段比握手阶段多了一个服务端发送最后数据的过程
总共有四种状态:主动建立连接、主动断开连接、被动建立连和被动断开连接两两组合还是4种组合:1.主动建立连接、主动断开连接会经历的状态:SYNC_SENT——ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT2.主动建立连接、被动断开连接会经历的状态:SYNC_SENT——ESTABLISHED—-CLOSE_WAIT—-LAST_ACK3.被动建立连接、主动断开连接会经历的状态:LISTEN—-SYN_RCVD—-ESTABLISHED—-FIN_WAIT_1—-FIN_WAIT_2—-TIME_WAIT4.被动建立连接、被动断开连接会经历的状态:LISTEN—-SYN_RCVD—-ESTABLISHED—-CLOSE_WAIT—-LAST_ACK
105、滑动窗口机制由发送方和接收方在三次握手阶段,互相将自己的最大可接收的数据量告诉对方。也就是自己的数据接收缓冲池的大小。这样对方可以根据已发送的数据量来计算是否可以接着发送。在处理过程中,当接收缓冲池的大小发生变化时,要给对方发送更新窗口大小的通知。
6、MySQL遇到的死锁问题
29、悲观锁、乐观锁:版本号检测为乐观锁,其他为悲观锁
84、数据库中的锁有哪几种?:独占锁、排他锁以及更新锁。
85、如何解除死锁状态:查看在锁的事务--->kill线程id
87、MyISAM和InnoDB的区别有哪些?:MyISAM表不支持事务、不支持行级锁、不支持外键。InnoDB表支持事务、支持行级锁、支持外键
1、MySQL索引使用的注意事项
8、数据库索引的原理:B+树
10、索引:B+,B-,全文索引
23、mysql的索引分类:B+,hash;什么情况用什么索引:hash索引不支持范围查询
30、组合索引,最左原则
31、mysql的表锁、行锁、页锁
36、如果查询很慢,你会想到的第个式是什么?索引是嘛的:加索引,索引是为数据保持了一个有序的映射,类似于TreeMap
37、如果建了个单列索引,查询的时候查出2列,会到这个单列索引吗?:会
38、如果建了个包含多个列的索引,查询的时候只了第列,能不能上这个索引?查三列呢?:最左原则
40、怎么看是否到了某个索引?:explain执行计划看type
52、MySQL为什么使用B+树作为索引?:因为B+树可以预读,减少磁盘IO次数,提高数据查询速度
58、索引的优缺点,什么字段上建立索引:orderby,where,groupby,distinct,join等字段
69、数据库索引的实现(B+树介绍、和B树、R树区别)#
71、数据库索引的优缺点以及什么时候数据库索引失效#:notin,!=不会命中索引
72、当数据表中A、B字段做了组合索引,那么单独使用A或单独使用B会有索引效果吗?(使用like查询如何有索引效果)答:A、B两字段做组合索引的时候,谁在前面,谁在后面,如果A在前,那么单独使用A会有索引效果,单独使用B则没有,反之亦然。同理,使用like模糊查询时,如果只是使用前面%,那么有索引效果,如果使用双%号匹配,那么则无索引效果
86、数据库的索引有什么作用?(必考)底层数据结构是什么,为什么使用这种数据结构?
索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息;底层数据结构是B+树;使用B+树的原因:查找速度快、效率高,在查找的过程中,每次都能抛弃掉一部分节点,减少遍历个数。(此时,你应该在白纸上画出什么是B+树)87、聚簇索引和非聚簇索引的区别?
25、说说事务的特性和隔离级别;
作为单个逻辑工作单元执行的一系列操作,满足四大特性:原子性(Atomicity):事务作为一个整体被执行,要么全部执行,要么全部不执行;一致性(Consistency):保证数据库状态从一个一致状态转变为另一个一致状态;隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行;持久性(Durability):一个事务一旦提交,对数据库的修改应该永久保存。
Mysql的事物隔离级别?
ReadUncommitted(读取未提交内容)
ReadCommitted(读取提交内容)
RepeatableRead(可重读)
Serializable(可串行化)
83、事务的并发问题有哪几种?
丢失更新、脏读、不可重复读以及幻读。
85、事务的隔离级别有哪几种?MySQL事务默认隔离级别是哪个?答:读未提交、读已提交、可重复读和序列化。可重复读。
53、mysql优化经验
1。对查询进行优化,应尽量避免全表扫描,首先应考虑在where及orderby涉及的列上建立索引。2。应尽量避免在where子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。3。尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。4。任何地方都不要使用select*fromt,用具体的字段列表代替“*”,不要返回用不到的任何字段。5。避免频繁创建和删除临时表,以减少系统表资源的消耗。诸如此类,等等等等......
57、常见的数据库优化手段
28、mysql分页有什么优化
11、limit20000加载很慢怎么解决:采用id排序,通过id来限制范围
45.你们的数据库单表数据量是多少?般多的时候开始出现查询性能急剧下降?:1000万
46、mysql的最大写入速度?:7500(4G内存+20G硬盘+1个CPU,4核)
4、分库与分表带来的分布式困境与应对之策:分布式事务,子查询,关联查询,分页查询|分布式事务中间件(分布式事务),把所有分库分表数据同步汇总到一个库,在这个库上进行操作(分页查询),拆分为单表查询(子查询,关联查询)
12、选择合适的分布式主键方案
基于数据库方案:auto_increment|多个库相同步长间隔auto_increment|数据库单条记录+ID批量生成服务|数据库单条记录+ID批量生成服务+灾备模式|数据库单条记录+去中心化ID批量生成服务
基于中间件方案:Tair/Redis原子操作|
14、ObjectId规则
13、选择合适的数据存储方案
47.读写分离是怎么做的?你认为中间件会怎么来操作?这样操作跟事务有什么关系?:mysql主从复制,读全部打到从,写全部打到主|中间件会解析sql分析读写操作|主从同步延迟引起的事务一致性问题?
14.分库分表有没有做过?线上的迁移过程是怎么样的?如何确定数据是正确的?:在老库上挂上精卫,订阅精卫任务将数据写入分库分表
59、数据库连接池。:原理?
74、简单说说数据库集群和负载均衡、分布式(我不懂这块)
16、倒排索引
17、聊聊ElasticSearch使用场景
80、MySQL和MongoDB的区别有哪些?如何选择?
81、MongoDB的优缺点有哪些?
11、Redis数据结构:String,Hash,List,Set,SortedSet
2、Redis内部结构
7、Redis为什么是单线程的:缓存主要是io密集型,对cpu需求不大,所以单线程已经满足要求
20、Redis用过哪些数据数据,以及Redis底层怎么实现
4、Redis持久化机制:rdb和aof
6、Redis集群方案与实现:
8、缓存奔溃:缓存过期,全部穿透到后端的情况,可以种一个缓存(60s)和一个缓存标识(30s),访问的时候先访问缓存标识,发现过期后触发异步更新缓存,并返回当前60s的缓存
9、缓存降级:丢卒保帅,一般错误-->警告-->错误-->严重错误
15、redis集群如何同步:数据复制,slave发起请求,masterpush数据
16、redis的数据添加过程是怎样的:哈希槽
17、redis的淘汰策略有哪些:volatile-lru,volatile-ttl,volatile-random,allkeys-lru,allkeys-random,no-enviction
21、Redis缓存穿透,缓存雪崩:没有命中缓存,方案有加锁穿透并种缓存,异步种全量缓存,布隆过滤器
22、如何使用Redis来实现分布式锁:setnx
24、Redis持久化的几种方式,优缺点是什么,怎么实现的:aof(每个操作一个脚本),rdb(定时全两快照)
23、Redis的并发竞争问题,以及如何解决:乐观锁,watch
25、Redis的缓存失效策略:定期删除(随机检查删除)+惰性删除(get的时候再去检查删除)+内存淘汰机制(lru)
26、Redis集群,高可用,原理:sentinal
27、Redis缓存分片:客户端分片(jedis),基于代理的分片(codis),路由查询(rediscluster)
31、渐进式rehash过程?:同时持有两个hash,逐渐迁移
35、事务与事件:事件IO多路复用,reactor模型
36、主从复制:
37、启动过程
38、集群
39、redis哨兵机制
40、redis高可用方案:哨兵机制
3、聊聊Redis使用场景:缓存,队列
13、用redis做过什么:cache,队列
12、redis和memcache的区别:数据结构不一样|redis单线程|mc读性能更高
10、使用缓存的合理性问题:
2、消息的重发补偿解决思路
3、消息的幂等性解决思路
4、消息的堆积解决思路
5、自己如何实现消息队列
6、如何保证消息的有序性:根据业务id确定路由到哪个broker,保证同一个业务id路由到同一个broker
7、mq的原理是什么:有点大。。都可以说;
8、mq如何保证实时性;
9、mq的持久化是怎么做的;
1、消息队列的使用场景:解耦,异步,削峰|发邮件,发短信
21、BeanFactory和FactoryBean?:BeanFactory是Spring的bean容器,FactoryBean是工厂bean,可以来生成Bean的一种Bean
36、如果个接有2个不同的实现,那么怎么来Autowire个指定的实现?:Qualifier|@Autowire是byType,@Resource是ByName-->ByType
38、如果想在某个Bean成并装配完毕后执的逻辑,可以什么式实现?:Intialization接口afterProperties方法
39、SpringBoot没有放到web容器为什么能跑HTTP服务?:自带嵌入式tomcat
43、怎样拦截SpringMVC的异常,然后做定义的处理,如打志或者包装成JSON
45、struts2和springMVC的区别
46、spring框架中需要引用哪些jar包,以及这些jar包的用途:spring-core,spring-bean,spring-context
50、spring注入的几种方式:@Setter,@Constructor,@Autowire,@Resource
90、Spring的IOC和AOP有了解吗?IOC:控制反转,(解耦合)将对象间的依赖关系交给Spring容器,使用配置文件来创建所依赖的对象,由主动创建对象改为了被动方式;AOP:面向切面编程,将功能代码从业务逻辑代码中分离出来。
91、AOP的实现方式有哪几种?如何选择?(必考)
答:JDK动态代理实现和cglib实现。有接口定义则可以使用jdk,没有则用cglib。
spring对aop的实现原理:ProxyFactoryBean|AbstractAutoProxyCreator|AspectJ语法|XML方式
1、BeanFactory和ApplicationContext有什么区别:Application支持父子容器,支持web。。。
2、SpringBean的生命周期:
3、SpringIOC如何实现:扫描源码解析出BeanDefination,管理BeanDefination的依赖,反射生成Bean实例,根据BeanDefination的依赖注入bean
5、SpringAOP实现原理:动态代理,拦截器
6、动态代理(cglib与JDK):有接口定义则可以使用jdk,没有则用cglib。
8、Spring事务底层原理:底层是AOP实现的
12、Spring的单例实现原理:采用Map实现的单例
13、Spring框架中用到了哪些设计模式:工厂模式,观察者模式,动态代理。。。
17、SpringMVC运行原理1.客户端请求提交到DispatcherServlet2.由DispatcherServlet控制器查询HandlerMapping,找到并分发到指定的Controller中。3.Controller调用业务逻辑处理后,返回ModelAndView4.DispatcherServlet查询一个或多个ViewResoler视图解析器,找到ModelAndView指定的视图5.视图负责将结果显示到客户端
24、SpringBean的生命周期,如何被管理的?
25、SpringBean的加载过程是怎样的?
26、如果要你实现SpringAOP,请问怎么实现?
27、如果要你实现SpringIOC,你会注意哪些问题?:对象依赖管理,继承,反射
28、Spring是如何管理事务的,事务管理机制?
29、Spring的不同事务传播行为有哪些,干什么用的?
PROPAGATION_REQUIRED:外部没有事务,就新开一个事务
PROPAGATION_SUPPORTS:外部有事务,就用这个事物,没有就算了
PROPAGATION_MANDATORY:外部没有事物,就不干(异常)
PROPAGATION_REQUIRES_NEW:不管外部有没有事务,都新开独立的一个事务
PROPAGATION_NOT_SUPPORTED:不管外部有没有事物,都不使用事务
PROPAGATION_NEVER:外部有事务,就不干(异常)
PROPAGATION_NESTED:外部有事务,就新开一个子事务,savepoint
32、Spring循环注入的原理?:
33、SpringAOP的理解,各个术语,他们是怎么相互工作的?:Advice,PointCut,Advisor
34、Spring如何保证Controller并发的安全?:Spring针对Controller可以配置scope,用来制定是request,session,prototype,还是singleton
51.spring如何实现事物管理的:基于AOP实现的
52.springIOC和AOP的原理
55.springmvc的核心是什么,请求的流程是怎么处理的,控制反转怎么实现的核心:控制反转和面向切面请求处理流程:1。首先用户发送请求到前端控制器,前端控制器根据请求信息(如URL)来决定选择哪一个页面控制器进行处理并把请求委托给它,即以前的控制器的控制逻辑部分;2。页面控制器接收到请求后,进行功能处理,首先需要收集和绑定请求参数到一个对象,并进行验证,然后将命令对象委托给业务对象进行处理;处理完毕后返回一个ModelAndView(模型数据和逻辑视图名);3。前端控制器收回控制权,然后根据返回的逻辑视图名,选择相应的视图进行渲染,并把模型数据传入以便视图渲染;4。前端控制器再次收回控制权,将响应返回给用户。控制反转如何实现:我们每次使用spring框架都要配置xml文件,这个xml配置了bean的id和class。spring中默认的bean为单实例模式,通过bean的class引用反射机制可以创建这个实例。因此,spring框架通过反射替我们创建好了实例并且替我们维护他们。A需要引用B类,spring框架就会通过xml把B实例的引用传给了A的成员变量。
63、@transactional注解在什么情况下会失效,为什么?:调用同一个类的方法的时候,spring容器通过aop提供为bean提供事务管理功能,方法内部调用是调用的对象本身的方法,不是调用的spring容器的bean
64、SpringMVC的Controller是如何将参数和前端传来的数据一一对应的。65、Quartz是如何完成定时任务的。68、Spring的IOC有什么优势。69、Spring如何维护它拥有的bean。:BeanDefination集合来管理。。
82、Spring事务的隔离性,并说说每个隔离性的区别
85、Struts跟Springmvc的优缺点,让你选会如何选
86、简单说说Spring事务机制
89、Spring的原理
90、JDK动态代理如何实现?(加分点)
答:JDK动态代理,只能对实现了接口的类生成代理,而不是针对类,该目标类型实现的接口都将被代理。原理是通过在运行期间创建一个接口的实现类来完成对目标对象的代理。
92、SpringMVC的核心控制器是什么?消息处理流程有哪些?
答:核心控制器为DispatcherServlet。消息流程如下:
16、JDK和CGLIB生成动态代理类的区别:JDK动态代理只能针对实现了接口的类生成代理(实例化一个类)。此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑CGLIB是针对类实现代理,主要是对指定的类生成一个子类(没有实例化一个类),覆盖其中的方法。
17、SpringAOP应用场景性能检测,访问控制,日志管理,事务等。
87、Spring4.0新特性
1、为什么选择Netty:因为netty是nio实现的,高并发的情况下比mina表现要好
2、说说业务中,Netty的使用场景:通信组件,rpc通信组件,mq通信组件
4、什么是TCP粘包/拆包:链路层对数据进行拆分数据包和合并数据包
5、TCP粘包/拆包的解决办法:业务曾手动拆分数据包
7、说说Netty的零拷贝:内核态,不用在用户态之间切换
14、了解哪几种序列化协议?包括使用场景和如何去选择
16、Netty的高性能表现在哪些方面:nio
18.NIO的组成?:Channel(通道),Selector(选择器),ByteBuffer(各种缓冲器)
26.NIOEventLoopGroup源码?
6、Netty线程模型:Reactor模型
8、Netty内部执行流程:
9、Netty重连实现:在final里重现连接
11、Netty的各大组件:
Channel、EventLoop和ChannelFuture
ChannelHandler和ChannelPipeline
Bootstrapping
12、Netty的线程模型:BossGroup,WorkerGroup
13、TCP粘包/拆包的原因及解决方法
1、Mybatis流程每一个Mybatis的应用程序都以一个SqlSessionFactory对象的实例为核心。首先用字节流通过Resource将配置文件读入,然后通过SqlSessionFactoryBuilder().build方法创建SqlSessionFactory,然后再通过SqlSessionFactory.openSession()方法创建一个SqlSession为每一个数据库事务服务。经历了Mybatis初始化–>创建SqlSession–>运行SQL语句,返回结果三个过程
3、mybatis如何处理结果集MyBatis的结果集是通过反射来实现的。并不是通过get/set方法。在实体类中无论是否定义get/set()方法,都是可以接收到的。
9、Mybatis如何找到指定的Mapper的,如何完成查询的。
17、Dubbo的底层实现原理和机制
22、Dubbo的服务请求失败怎么处理:
集群容错策略
failover:失败则尝试访问其他provider
failfast:失败立马返回
failsafe:失败直接忽略
failback:失败定时重发
forking:并行调用多个provider,只要有一个返回则返回
broadcast:所有provider都调一遍
41、dubbo的组件有哪些,各有什么作用。
dubbo-rpc:提供rpc以及序列化功能
dubbo-remoting:提供rpc访问通信功能
43、dubbo是如何利用接口就可以通信的。:动态代理,封装了rpc,序列化,通信等复杂性
5、说说Dubbo的实现原理:
服务提供方暴露自己的服务,并注册到zk上,服务消费者在zk上订阅服务
消费者订阅到服务后,将客户端访问参数组装成一个消息对象,加密传输到服务提供方,服务提供方解密参数并调用本地方法,将返回结果加密返回,客户端再解密返回结果
1、前后端分离是如何做的:m站,前后端同学统一制定好接口定义,APP前端同学页面展示效果,后端提供业务接口功能,并通过mtop平台暴露给前端团队使用
2、微服务哪些框架:eurke
3、你怎么理解RPC框架:业务提供者暴露服务,并提供一个访问地址,客户端通过访问地址访问暴露的服务,涉及到数据传输和数据序列化|序列化、反序列化,IO传输,服务注册和订阅,服务路由
4、说说RPC的实现原理:客户端调用=>消息对象=>数据加密=>网络传输=>服务端数据解密成消息对象=>服务端调用服务=>返回结果数据加密=>网络传输回写=>客户端解密成返回结果
6、你怎么理解RESTful
7、说说如何设计一个良好的API
可读性:一眼就能看出接口含义
。。。
8、如何理解RESTfulAPI的幂等性
同一个请求访问多次系统的影响与访问一次相同,比如查询
9、如何保证接口的幂等性
查询,删除,唯一索引校验,token机制防止重复提交,访问带seq做唯一索引
10、说说CAP定理、BASE理论
11、怎么考虑数据一致性问题
由于分布式环境下,CAP只能满足俩,所以可以采用弱一致性的方案来解决一致性问题,比如弹外添加观演人,采用谈外异步更新到弹内,保证了分区容忍性和有效性,弱一致性方案
12、说说最终一致性的实现方案
比如数据同步,或者分库分表数据汇总到一个库
13、你怎么看待微服务
14、微服务与SOA的区别
15、如何拆分服务
按照业务拆分,高内聚低耦合
16、微服务如何进行数据库管理
17、如何应对微服务的链式调用异常:调用链路跟踪,全链路日志
18、对于快速追踪与定位问题
19、微服务的安全
1、谈谈业务中使用分布式的场景
业务层分布出去形成分布式服务,消息队列分布出去形成分布式消息队列,数据访问分布出去形成分布式数据存储。。。
11、zookeeper是什么;
分布式协调服务,常用在分布式系统中,屏蔽分布式系统访问底层的复杂配置
12、zookeeper哪里用到;
分布式服务的服务注册+订阅
13、zookeeper的选主过程;:zab协议
14、zookeeper集群之间如何通讯;
zab协议
15、你们的zookeeper的节点加密是用的什么方式;
26、Zookeeper的用途,选举的原理是什么?
分布式协调服务,屏蔽分布式访问的复杂细节
28、zookeeper原理和适用场景
29、zookeeperwatch机制
30、redis/zk节点宕机如何处理
36、zookeeper的选举策略
42、zookeeper的负载均衡算法有哪些。?zk有负载均衡?zk在集群负载均衡中的协调
18、描述一个服务从发布到被消费的详细过程
provider暴露服务,注册服务到zk--》consumer订阅在zk上订阅服务
19、分布式系统怎么做服务治理
20、接口的幂等性的概念
33、用过哪些MQ,怎么用的,和其他mq比较有什么优缺点,MQ的连接是线程安全的吗
ActiveMq,MetaQ,
34、MQ系统的数据如何保证不丢失
消息刷盘,消息消费确认
46、消息队列的原理和实现
47、Redis实现消息队列
2、Session分布式方案:session复制,session粘连,session共享
9、分布式Session框架配置服务器,Zookeeper集群管理服务器可以统一管理所有服务器的配置文件共享这些Session存储在一个分布式缓存中,可以随时写入和读取,而且性能要很好,如Memcache,Tair。封装一个类继承自HttpSession,将Session存入到这个类中然后再存入分布式缓存中由于Cookie不能跨域访问,要实现Session同步,要同步SessionID写到不同域名下。
40、分布式session如何设计。
44、集群环境中,session如何实现共享
3、分布式锁的场景:弹内选座生成静态页,抽奖专题扣减名额和库存
4、分布是锁的实现方案:zookeeper(临时节点),redis(setnx)
16、分布式锁的实现过程;:setnx成功则视为获取锁成功,释放锁的时候删除key
39、分布式锁如何设计。
5、分布式事务:TCC,1pc,2pc,3pc,txc
24、对分布式事务的理解:保证分布式系统之间的数据一致性问题
38、分布式事务的控制。
6、集群与负载均衡的算法与实现:dubbo负载均衡算法(roundrobin,random,leastactive,conisistenHash)
25、如何实现负载均衡,有哪些算法可以实现?
23、重连机制会不会造成错误:有可能,比如接口超时重连,需要保证接口幂等性,否则对数据有影响
7、说说分库与分表设计
8、分库与分表带来的分布式困境与应对之策
27、数据的垂直拆分水平拆分。:垂直拆分为按照业务来拆分,水平拆分是把数据量很多的表拆分成很多个小表,加快读写速度,提高性能
35、列举出你能想到的数据库分库分表策略;分库分表后,如何解决全表查询的问题
策略:按照id取模分表,按照字符串hash分表
将分库分表的数据同步汇总到一个全量库,在全量库上全表查询
31、分布式集群下如何做到唯一序列号
数据库单条记录+ID批量生成服务
37、全局ID
45、分布式、集群环境中,缓存如何刷新,如何保持同步?
A、缓存如何刷新?1、定时刷新2、主动刷新覆盖,每个缓存框架都有自带的刷新机制,或者说缓存失效机制,就拿Redis和Ehcache举例,他们都有自带的过期机制,另外主动刷新覆盖时,只需获取对应的key进行数据的覆盖即可
48、谈谈你对分布式的理解
1、性能指标有哪些
2、如何发现性能瓶颈
3、性能调优的常见手段
4、说说你在项目中如何进行性能调优
5、web如何项目优化
6、日常项目中,如果你接手,你准备从哪些方面调优?
答:这个呢首先是了解哪些需要优化,需要优化肯定是项目性能遭遇瓶颈或者猜测即将遭遇了,我们才会去考虑优化。那么怎么优化?
a、扩容,扩容的理解,就是扩充服务器并行处理的能力,简单来说就是加服务器,增加处理请求的能力,例如增加nginx、tomcat等应用服务器的个数,或者物理服务器的个数,还有加大服务器带宽等等,这里考虑的是硬件方面
1、你如何对需求原型进行理解和拆分
2、说说你对功能性需求的理解
3、说说你对非功能性需求的理解
4、你针对产品提出哪些交互和改进意见
5、你如何理解用户痛点
1、说说你在项目中使用过的UML图
2、你如何考虑组件化
3、你如何考虑服务化
4、你如何进行领域建模
5、你如何划分领域边界
6、说说你项目中的领域建模
7、说说概要设计
1、你项目中有使用哪些设计模式
2、说说常用开源框架中设计模式使用分析
3、说说你对设计原则的理解
4、23种设计模式的设计理念
5、设计模式之间的异同,例如策略模式与状态模式的区别
6、设计模式之间的结合,例如策略模式+简单工厂模式的实践
7、设计模式的性能,例如单例模式哪种性能更好。
1、你系统中的前后端分离是如何做的
2、说说你的开发流程
3、你和团队是如何沟通的
4、你如何进行代码评审
5、说说你对技术与业务的理解
6、说说你在项目中经常遇到的Exception
7、说说你在项目中遇到感觉最难Bug,怎么解决的
8、说说你在项目中遇到印象最深困难,怎么解决的
9、你觉得你们项目还有哪些不足的地方
10、你是否遇到过CPU100%,如何排查与解决
11、你是否遇到过内存OOM,如何排查与解决
12、说说你对敏捷开发的实践
13、说说你对开发运维的实践
14、介绍下工作中的一个对自己最有价值的项目,以及在这个过程中的角色
15、重构过代码没有?说说经验;
16、一千万的用户实时排名如何实现;:zset的score特性(ZINCRBY修改score)
17、五万人并发抢票怎么实现;:反向代理,页面静态化+cdn,限流|动静分离,冷热分离,集群+负载均衡,缓存,缓存预热|读写分离,分库分表,连接池
20、在一个千万级的数据库查寻中,如何提高查询效率?:
分库分表,读写分离,建立索引
或者
建立索引,避免全表扫描|避免notin,!=之类,因为全表扫描|unionall替换or,避免全表扫描(不同索引字段or)|like没有满足最左原则也会全表扫描|where中使用参数,等号左边使用表达式,函数也会全表扫描
避免使用*返回无用的字段|exisits代替in
21、用wait-notify写一段代码来解决生产者-消费者问题,更进一步,在分布式的环境下怎么解决
wait()和notify()都是线程间通信的方法,可以直接对线程的行为进行操作。他们的本质其实是传递生产者-消费者各自的消息,理解了这一点,那么在分布式环境下就很简单了,只要找到一个第三方的可以用来传递消息的媒介(Zookeeper、Redis、Kafka等)就可以了。
22.、设计一个线程池
如果对JDK的线程池java.util.concurrent.ThreadPoolExecutor比较了解,可以把一些简单的特性放上去。如果不了解,可以直接设计一个线程数组,然后加一些业务逻辑。所谓线程池,基本也就如此。
对客户端做身份验证:参数加签,oauth协议
27、项目并发如何处理?(我们是web项目)
29、平台上的图片如何防盗链:refer字段
30、如何区分上传的图片是不是木马?
31、你的接口服务数据被人截包了,你如何防止数据恶意提交?
答:我们可以在接口传输参数里面设置一个业务编号,这个编号用来区分是否重复提交。这样即使数据被抓包了,对方也无法区分每个字段你的含义,这时,这个业务编号的作用就来了
32、假设服务器经常宕机,你从哪些方面去排查问题?
答:先重启,并开启jvm输出gc日志||看是不是系统问题,如果不是则看是不是jvm问题,在看是不是oom,sof等