Skip to content

Commit

Permalink
面试题目完善
Browse files Browse the repository at this point in the history
  • Loading branch information
whx123 committed May 16, 2020
1 parent 1afde6f commit 64d954e
Show file tree
Hide file tree
Showing 68 changed files with 848 additions and 158 deletions.
Empty file.
11 changes: 11 additions & 0 deletions Java面试题集结号/Elasticsearch/Elasticsearch面试.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
### Elasticsearch
1. 详细描述一下Elasticsearch索引文档的过程。
2. 详细描述一下Elasticsearch搜索的过程。
3. Elasticsearch 的倒排索引是什么。
4. Elasticsearch是如何实现master选举的。
5. lucence内部结构是什么。
6. Lucene全文搜索的原理
7. 在并发情况下,Elasticsearch 如何保证读写一致呢?
8. 详细阐述一下 Elasticsearch 搜索的过程。
9. Elasticsearch 索引数据多了怎么办呢,如何调优,部署
10. Elasticsearch 对于大数据量(上亿量级)的聚合如何实现?
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
![](https://user-gold-cdn.xitu.io/2020/5/14/1720eda10954cb6b?w=1120&h=549&f=png&s=128315)
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
垃圾回收的目的是识别并且丢弃应用不再使用的对象来释放和重用资源。

触发主GC(Garbage Collector,垃圾回收)的条件:
(1)当应用程序空闲时,即没有应用线程在运行时,GC会被调用。
(2)Java堆内存不足时,GC会被调用。
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
这两个方法用来提示JVM要进行垃圾回收。但是,立即开始还是延迟进行垃圾回收是取决于JVM的。
42 changes: 33 additions & 9 deletions Java面试题集结号/JVM 篇/JVM面试题.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
### JVM 篇
1. 什么情况下会发生栈内存溢出。什么时候发生堆溢出?你怎么排错
2. JVM怎么判断对象是无用对象?有哪些方法。
1. 什么情况下会发生栈内存溢出。什么时候发生堆溢出?你是怎么排错的?
2. JVM怎么判断对象是可回收对象?有哪些方法。
3. JVM的内存结构,新生代与老年代的比例,Eden和Survivor比例。
4. 你知道哪几种垃圾收集器,各自的优缺点,重点讲下cms和G1,包括原理,流程,优缺点。
5. 简单说说你了解的类加载器,可以打破双亲委派么,怎么打破。
Expand All @@ -10,19 +10,43 @@
9. 垃圾回收算法的实现原理。
10. JVM内存模型的相关知识了解多少,比如重排序,内存屏障,happen-before,主内存,工作内存等。
11. 说一下Java对象的创建过程
12. 你们线上应用的JVM参数有哪些
13. g1和cms区别,吞吐量优先和响应优先的垃圾收集器选择
12. 你们线上应用的JVM参数配置了哪些
13. G1和cms区别
14. 怎么打出线程栈信息。
15. 说一下类加载的执行过程
16. JVM垃圾回收机制,何时触发MinorGC等操作
17. 各种回收器,各自优缺点,重点CMS、G1。
16. JVM垃圾回收机制,何时触发MinorGC等操作呢?
17. ZGC 垃圾收集器,了解过吗
18. 对象的访问定位有哪两种方式?
19. 说一下 jvm 调优的工具?
20. 什么时候对象会进入老年代
21. 什么是内存泄漏和内存溢出?(溢出是指创建太多对象导致内存空间不足,泄漏是无用对象没有回收)
20. 对象什么时候会进入老年代
21. 内存泄漏和内存溢出区别?
22. 什么是tomcat类加载机制?
23. 了解逃逸分析技术吗
24. 调用System.gc()会发生什么?
25. 谈谈Minor GC条件,full GC条件
26. Stop The World 了解过吗?
27. 谈谈你认识多少种OOM?
27. 谈谈你认识多少种OOM?如何避免OOM?
28. 了解过JVM调优没,基本思路是什么?如何确定它们的大小呢?
29. 淘宝热门商品信息在JVM哪个内存区域
30. 字节码的编译过程
31. Java需要开发人员回收内存垃圾吗?
32. Java中垃圾回收有什么目的?什么时候进行垃圾回收?
33. System.gc()和Runtime.gc()会做什么事情?
34. 主内存与工作内存
35. 内存间交互操作
36. volatile 禁止内存重排序
37. 内存模型三大特性
38. 谈谈先行发生原则
39. JVM 堆内存溢出后,其他线程是否可继续工作?
40. 说一下JVM 常用参数有哪些?
41. VM 为什么使用元空间替换了永久代?
42. Java堆的结构是什么样子的?什么是堆中的永久代(Perm Gen space)?
43. JVM的永久代中会发生垃圾回收么?
44. 什么是字节码?采用字节码的最大好处是什么?什么Java是虚拟机?
45. MinorGC 的过程
46. CPU 占用过高如何分析
47. Serial与Parallel GC之间的不同之处?
48. WeakHashMap 是怎么工作的?
49. 解释 Java 堆空间及 GC?
50. 你能保证 GC 执行吗?
51. JVM中哪个参数是用来控制线程的栈堆栈小的?
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
![](https://user-gold-cdn.xitu.io/2020/5/14/172108007fefffe5?w=1280&h=617&f=png&s=254427)

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
这个是在ReentrankLock中实现的,synchronized没有,是用一个队列实现的,在公平锁好理解,就是先进这个队列的,也先出队列获得资源,而非公平锁的话,则是还没有进队列之前可以与队列中的线程竞争尝试获得锁,如果获取失败,则进队列,此时也是要乖乖等前面出队才行
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
如果一个线程获得过该锁,可以再次获得,主要是用途就是在递归方面,还有就是防止死锁,比如在一个同步方法块中调用了另一个相同锁对象的同步方法块
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
共享锁可以由多个线程获取使用,而独享锁只能由一个线程获取。
对ReentrantReadWriteLock其读锁是共享锁,其写锁是独占锁
读锁的共享锁可保证并发读是非常高效的,读写,写读,写写的过程是互斥的。其中获得写锁的线程还能同时获得读锁,然后通过释放写锁来降级。读锁则不能升级
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
- 在jdk1.6中做了第synchronized的优化,偏向锁指的是当前只有这个线程获得,没有发生争抢,此时将方法头的markword设置成0,然后每次过来都cas一下就好,不用重复的获取锁
- 轻量级锁:在偏向锁的基础上,有线程来争抢,此时膨胀为轻量级锁,多个线程获取锁时用cas自旋获取,而不是阻塞状态
- 重量级锁:轻量级锁自旋一定次数后,膨胀为重量级锁,其他线程阻塞,当获取锁线程释放锁后唤醒其他线程。(线程阻塞和唤醒比上下文切换的时间影响大的多,涉及到用户态和内核态的切换)
- 自旋锁:在没有获取锁的时候,不挂起而是不断轮询锁的状态
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- volatile 通过内存屏障
- synchronized 通过修饰的程序段同一时间只能由同一线程运行,释放锁前会刷新到主内存
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
- 1、互斥条件:一个资源每次只能被一个进程使用。
- 2、保持和请求条件:一个进程因请求资源而阻塞时,对已获得资源保持不放。
- 3、不可剥夺性:进程已获得资源,在未使用完成前,不能被剥夺。
- 4、循环等待条件(闭环):若干进程之间形成一种头尾相接的循环等待资源关系。

如何避免死锁?只要破坏其中任意一个条件,就可以避免死锁

一种非常简单的避免死锁的方式就是:指定获取锁的顺序,并强制线程按照指定的顺序获取锁。因此,如果所有的线程都是以同样的顺序加锁和释放锁,就不会出现死锁了。
Original file line number Diff line number Diff line change
@@ -1,40 +1,82 @@
## Java 并发 && 多线程
### Java 并发 && 多线程
1. synchronized 的实现原理以及锁优化?
2. 现在有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
3. synchronized 和 lock 有什么区别
4. 说说 CountDownLatch 与 CyclicBarrier 区别
2. ThreadLocal原理,使用注意点,应用场景有哪些
3. synchronized和ReentrantLock的区别
4. 说说CountDownLatch与CyclicBarrier 区别
5. Fork/Join框架的理解
6. 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
7. Java中的volatile关键是什么作用?怎样使用它?在Java中它跟synchronized方法有什么不同?volatile 的实现原理
8. CAS?CAS 有什么缺陷,如何解决?
9. 如何检测死锁?怎么预防死锁?
9. 如何检测死锁?怎么预防死锁?死锁四个必要条件
10. 如果线程过多,会怎样?
11. 说说 Semaphore 原理
11. 说说 Semaphore原理
12. AQS组件,实现原理
13. ThreadLocal原理,使用注意点
14. LockSupport工具
13. 假设有T1、T2、T3三个线程,你怎样保证T2在T1执行完后执行,T3在T2执行完后执行
14. LockSupport作用是?
15. Condition接口及其实现原理
16. 说说并发与并行的区别?
17. 为什么要用线程池?Java的线程池内部机制,参数作用,几种工作阻塞队列,线程池类型以及使用场景
18. 如何保证多线程下 i++ 结果正确?
19. 10 个线程和 2 个线程的同步代码,哪个更容易写?
19. 10 个线程和2个线程的同步代码,哪个更容易写?
20. 什么是多线程环境下的伪共享(false sharing)?
21. 线程池如何调优,最大数目如何确认?
22. Java 内存模型?
23. 怎么实现所有线程在等待某个事件的发生才会去执行?
24. 说一下 Runnable和 Callable有什么区别?
25. 用Java编程一个会导致死锁的程序,你将怎么解决?
26. 线程的生命周期
26. 线程的生命周期,线程的几种状态。
27. ReentrantLock实现原理
28. java并发包concurrent及常用的类
29. wait(),notify()和suspend(),resume()之间的区别
30. FutureTask是什么
30. FutureTask是什么
31. 一个线程如果出现了运行时异常会怎么样
32. 生产者消费者模型的作用是什么
33. ReadWriteLock是什么
34. Java中用到的线程调度算法是什么
35. 线程池中的阻塞队列如果满了怎么办
34. Java中用到的线程调度算法是什么
35. 线程池中的阻塞队列如果满了怎么办
36. 线程池中 submit()和 execute()方法有什么区别?
37. 说一下 atomic 的原理
37. 介绍一下 AtomicInteger 类的原理
38. 多线程锁的升级原理是什么?
39. 指令重排序,内存栅栏等?
39. 指令重排序,内存栅栏等?
40. Java 内存模型 happens-before原则
41. 公平锁/非公平锁
42. 可重入锁
43. 独享锁、共享锁
44. 偏向锁/轻量级锁/重量级锁
45. 如何保证内存可见性
46. 非核心线程延迟死亡,如何实现?
47. ConcurrentHashMap读操作为什么不需要加锁?
48. ThreadLocal 如何解决 Hash 冲突?
49. ThreadLocal 的内存泄露是怎么回事?
50. 为什么ThreadLocalMap 的 key是弱引用,设计理念是?
51. 同步方法和同步代码块的区别是什么?
52. 在Java中Lock接口比synchronized块的优势是什么?如果你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它?
53. 用Java实现阻塞队列。
54. 用Java写代码来解决生产者——消费者问题。
55. 什么是竞争条件?你怎样发现和解决竞争?
56. 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法?
57. Java中你怎样唤醒一个阻塞的线程?
58. 什么是不可变对象,它对写并发应用有什么帮助?
59. 你在多线程环境中遇到的共同的问题是什么?你是怎么解决它的?
60. Java 中能创建 volatile数组吗
61. volatile 能使得一个非原子操作变成原子操作吗
62. 你是如何调用 wait()方法的?使用 if 块还是循环?为什么?
63. 我们能创建一个包含可变对象的不可变对象吗?
64. 在多线程环境下,SimpleDateFormat是线程安全的吗
65. 为什么Java中 wait 方法需要在 synchronized 的方法中调用?
66. BlockingQueue,CountDownLatch及Semeaphore的使用场景
67. Java中interrupted 和 isInterruptedd方法的区别?
68. 怎么检测一个线程是否持有对象监视器
69. 什么情况会导致线程阻塞
70. 如何在两个线程间共享数据
71. Thread.sleep(1000)的作用是什么?
72. 使用多线程可能带来什么问题
73. 说说线程的生命周期和状态?
74. 什么是上下文切换
75. Java Monitor 的工作机理
76. 按线程池内部机制,当提交新任务时,有哪些异常要考虑。
77. 线程池都有哪几种工作队列?
78. 说说几种常见的线程池及使用场景?
79. 使用无界队列的线程池会导致内存飙升吗?
80. 为什么阿里发布的 Java开发手册中强制线程池不允许使用 Executors 去创建?
81. Future有缺陷嘛?
46 changes: 31 additions & 15 deletions Java面试题集结号/Java集合/Java集合面试题.md
Original file line number Diff line number Diff line change
@@ -1,35 +1,51 @@
### Java 集合
1. Arraylist 与 LinkedList 区别
2. Collections.sort排序内部原理,Arrays.sort 实现原理
3. HashMap原理,java8做的改变
1. Arraylist与LinkedList区别
2. Collections.sort和Arrays.sort的实现原理
3. HashMap原理,java8做了什么改变
4. List 和 Set,Map 的区别
5. poll() 方法和 remove() 方法的区别?
5. poll()方法和 remove()方法的区别?
6. HashMap,HashTable,ConcurrentHash的共同点和区别
7. 写一段代码在遍历 ArrayList 时移除一个元素
8. Java 中怎么打印数组
9. Java 中的 TreeMap 是采用什么树实现的
8. Java中怎么打印数组
9. TreeMap底层
10. HashMap 的扩容过程
11. HashSet 是如何保证不重复的
11. HashSet是如何保证不重复的
12. HashMap 是线程安全的吗,为什么不是线程安全的?死循环问题?
13. LinkedHashMap的应用,底层,原理
14. 哪些集合类是线程安全的?哪些安全
15. Vector 与 Array,ArrayList 的区别
14. 哪些集合类是线程安全的?哪些不安全
15. ArrayList 和 Vector 的区别是什么?
16. Collection与Collections的区别是什么?
17. 如何决定使用 HashMap 还是 TreeMap
18. 如何实现数组和 List 之间的转换
17. 如何决定使用 HashMap 还是TreeMap
18. 如何实现数组和 List之间的转换
19. 迭代器 Iterator 是什么?怎么用,有什么特点?
20. Iterator 和 ListIterator 有什么区别?
21. 怎么确保一个集合不能被修改?
22. 快速失败(fail-fast)和安全失败(fail-safe)的区别是什么?
23. 什么是Java优先级队列(Priority Queue)?
24. JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗,如果你来设计,你如何设计。
25. Java 中怎么打印数组
26. Java 中的 LinkedList 是单向链表还是双向链表
27. 说一说 ArrayList 的扩容机制吧
25. 阻塞队列的实现,ArrayBlockingQueue的底层实现
26. Java 中的 LinkedList是单向链表还是双向链表
27. 说一说ArrayList 的扩容机制吧
28. HashMap 的长度为什么是2的幂次方,以及其他常量定义的含义~
29. ConcurrenHashMap 介绍?1.8 中为什么要用红黑树?
29. ConcurrenHashMap 原理?1.8 中为什么要用红黑树?
30. ArrayList的默认大小
31. 为何Collection不从Cloneable和Serializable接口继承?
32. Enumeration和Iterator接口的区别?
33. 我们如何对一组对象进行排序?
34. 当一个集合被作为参数传递给一个函数时,如何才可以确保函数不能修改它?
35. 说一下 HashSet 的实现原理?
36. Array 和 ArrayList 有何区别?
37. 在 Queue中poll()和 remove()有什么区别?
38. ArrayList 如何删除重复的元素或者指定的元素;
39. 讲讲红黑树的特点?
40. Java集合类框架的最佳实践有哪些?
41. Enumeration接口和Iterator 接口的区别有哪些?
42. HashSet和TreeSet有什么区别?
43. Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()?
44. 说出ArrayList,LinkedList的存储性能和特性
45. Java中HashMap的key值要是为类对象则该类需要满足什么条件?
46. ArrayList集合加入1万条数据,应该怎么提高效率
47. 如何对Object的list排序
48. ArrayList 和 HashMap 的默认大小是多数?
49. 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的
50. HashMap是怎么解决哈希冲突的
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Iterator的安全失败是基于对底层集合做拷贝,因此,它不受源集合上修改的影响。

java.util包下面的所有的集合类都是快速失败的;

java.util.concurrent包下面的所有的类都是安全失败的。快速失败的迭代器会抛出ConcurrentModificationException异常,而安全失败的迭代器永远不会抛出这样的异常。
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
PriorityQueue是一个基于优先级堆的无界队列,它的元素是按照自然顺序(natural order)排序的。
在创建的时候,我们可以给它提供一个负责给元素排序的比较器。PriorityQueue不允许null值,因为他们没有自然顺序,或者说他们没有任何的相关联的比较器。最后,PriorityQueue不是线程安全的,入队和出队的时间复杂度是O(log(n))。

Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
克隆(cloning)或者是序列化(serialization)的语义和含义是跟具体的实现相关的。因此,应该由集合类的具体实现来决定如何被克隆或者是序列化。
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- 使用Set删除重复元素
- 迭代器删除指定元素
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
- root节点和叶子节点是黑色
- 红色节点后必须为黑色节点
- 从root到叶子每条路径的黑节点数量相同
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
- 根据应用的需要正确选择要使用的集合的类型对性能非常重要,比如:假如元素的大小是固定的,而且能事先知道,我们就应该用Array而不是ArrayList。
- 有些集合类允许指定初始容量。因此,如果我们能估计出存储的元素的数目,我们可以设置初始容量来避免重新计算hash值或者是扩容。
- 为了类型安全,可读性和健壮性的原因总是要使用泛型。同时,使用泛型还可以避免运行时的ClassCastException。
- 使用JDK提供的不变类(immutable class)作为Map的键可以避免为我们自己的类实现hashCode()和equals()方法。
- 编程的时候接口优于实现。
- 底层的集合实际上是空的情况下,返回长度是0的集合或者是数组,不要返回null。

Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Enumeration速度是Iterator的2倍,同时占用更少的内存。但是,Iterator远远比Enumeration安全,因为其他线程不能够修改正在被iterator遍历的集合里面的对象。同时,Iterator允许调用者删除底层集合里面的元素,这对Enumeration来说是不可能的。

Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
HashSet是由一个hash表来实现的,因此,它的元素是无序的。add(),remove(),contains()方法的时间复杂度是O(1)。
另一方面,TreeSet是由一个树形的结构来实现的,它里面的元素是有序的。因此,add(),remove(),contains()方法的时间复杂度是O(logn)。

26 changes: 26 additions & 0 deletions Java面试题集结号/dubbo/dubbo面试题/dubbo面试题.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
### dubbo框架
1. Dubbo的服务请求失败怎么处理
2. dubbo的负载均衡有几种算法?(随机,轮询,最少活跃请求数,一致性hash)
3. Dubbo 和 Spring Cloud 有什么区别?
4. dubbo都支持什么协议,推荐用哪种?
5. 画一画服务注册与发现的流程图
6. Dubbo默认使用什么注册中心,还有别的选择吗?
7. 在 Provider 上可以配置的 Consumer 端的属性有哪些?
8. Dubbo启动时如果依赖的服务不可用会怎样?
9. Dubbo推荐使用什么序列化框架,你知道的还有哪些?
10. Dubbo默认使用的是什么通信框架,还有别的选择吗?
11. 服务上线怎么兼容旧版本?
12. Dubbo服务之间的调用是阻塞的吗?
13. Dubbo telnet 命令能做什么?
14. Dubbo如何一条链接并发多个调用。
15. Dubbo 的使用场景有哪些?
16. Dubbo 核心功能有哪些?
17. Dubbo 核心组件有哪些?
18. Dubbo 服务器注册于发现的流程?
19. Dubbo 支持哪些协议,它们的优缺点有哪些?
20. Dubbo 的注册中心集群挂掉,发布者和订阅者之间还能通信么?
21. Dubbo源码使用了哪些设计模式
22. Dubbo集群提供了哪些负载均衡策略?
23. Dubbo的集群容错方案有哪些?
24. Dubbo 支持哪些序列化方式?
25. Dubbo超时重试,Dubbo超时时间设置
Loading

0 comments on commit 64d954e

Please sign in to comment.