少吃了一餐飯,省下的錢買了份資料,我把它分享出來,給和我同樣迷茫的底層人員一些幫助吧

博主太痛苦了,沒有任何資源,一我的奮戰着(可能別人家的孩子都有礦吧,嚶嚶嚶),對java面試也沒有經驗,對面試毫無經驗,因此少吃了一餐飯,省下的錢買了份資料,我把它分享出來, 目的是想給和我同樣沒有任何資源,同時想在互聯網混口飯吃的底層人員一些幫助。前端

話很少說,下面是正文java

序言

我是一名在 IT 行業闖蕩了 8 年的程序員,從最初剛畢業時的迷茫到找到一份工做的喜悅,從一個小白慢慢成長爲一個行業老兵,從一個初創型的公司到一個幾千人的大型互聯網公司,從初級程序員到架構師、技術經理,回顧這 8 年來,也有許多可圈可點的地方。程序員

最近幾年公司的大小招聘,社招、校招都有參與,面試過許多大牛,也遇到過不少職場小白。有 10 年 工做經驗的,也有剛剛畢業來面外包的、擔任技術一面的面試官,深知技術面試之重要,來面試的不乏一輪遊的,看着有些同窗基礎浮誇、作着重複的項目也沒有任何總結沉澱,自我介紹徹底不知道在說啥等等諸如此類的現狀,這也讓我很是苦惱,面試也很累的,一坐就大半天,聊十幾二十我的,若是你還在東拉西扯不知所云,抑或是對面試官問的問題答非所問,基本在面試官內心已經給你 pass 掉了,之因此面試還在持續,只是由於職業素養罷了,爲了避免讓面試者感受太挫敗,畢竟大老遠的跑來求職都不容易,可是心裏裏卻已經沒有聊下去的慾望了。想一想本身也是從那個層次一步步走上來的,也經歷了許多坎坷,以爲有必要把個人面試經驗跟你們分享一下,但願能幫助你們找到一份滿意的工做。web

面試須要有的放矢、機會是留給有準備的人。我相信通過你的努力,必定會有滿意的收穫。我挑出來面試官常問的知識點給你們有的放矢地強化,有助於快速提升,哪怕是臨時抱佛腳也能跟面試官搭上話。面試

適宜閱讀人羣:算法

準備面試的初(中)級 Java 程序員或者面試官
文章分爲八個部分,從 Java 基礎、Java 核心、Java 進階、Java 框架、分佈式中間件、MySQL、JVM 到如何準備技術面試。先幫讀者梳理知識點,這是咱們的硬實力,打鐵還需自身硬;而後咱們還要有準備的去打好面試這場仗,不管是技術一面、二面 仍是 HR 面試,都要認真準備,把本身的軟實力也充分發揮出來,畢竟不是每一個面試官都能一眼看透你的價值,你須要把發光點主動地表現出來。sql

下面開始進入主題。數據庫

1、Java 基礎知識

1. 面向對象的特性有哪些?apache

封裝、繼承、多態。編程

還有一個抽象,問三個就說上面三個,問四個就再補一個抽象

2. Java 中 Override 和 Overload 有什麼區別?

  • 重寫(Override):方法名、參數、返回值相同;子類方法不能縮小父類方法的訪問權限,且只能比父類拋出更少的異常;被覆蓋的方法不能爲 private,不然在其子類中只是新定義了一個方法,並無對其進行覆蓋。
  • 重載(Overload):同一個類中能夠有多個名稱相同的方法,但這些方法的參數類型、個數、順序至少有一個不相同。

追問:什麼狀況下方法不能被重寫?

方法被定義爲 final 的時候不能被重寫。

3. 抽象類和接口有什麼區別?

抽象類:

  • 抽象類使用 abstract 修飾;
  • 抽象類不能使用 new 關鍵字來實例化對象;
  • 抽象類能夠含有抽象方法,也能夠不包含抽象方法抽象類中能夠有具體的方法;
  • 抽象類中的抽象方法只有方法體,沒有具體實現。

接口:

  • 接口使用 interface 修飾;
  • 接口不能被實例化;
  • 一個類只能繼承一個抽象類,可是能夠實現多個接口;
  • 接口中方法均爲抽象方法
  • 接口中方法是抽象方法,不能實現。

追問:什麼狀況下選擇接口,什麼狀況下選擇抽象類?

當要建立不帶任何方法定義和成員變量的基類,應該選擇接口;當有方法定義和成員變量的時候,應該選擇抽象類。

4. JRE、JDK、JVM 有什麼區別?

  • JRE: Java 運行環境,爲 Java 的運行提供了所需環境。
  • JDK: Java 開發工具包,提供了 Java 的開發環境和運行環境,JDK 包含 - JRE 還有 Java 編譯器、Java 調試和分析工具等。
  • JVM 是 Java 虛擬機,負責將 Java 字節碼轉換爲機器碼,正是 Java 可以跨平臺的緣由。它還提供了內存管理垃圾回收安全機制等。

5. 值傳遞和引用傳遞有什麼區別?

  • 值傳遞:指的是在方法調用時,傳遞的參數是按值的拷貝傳遞,傳遞的是值的拷貝,也就是說傳遞後就互不相關了。
  • 引用傳遞:指的是在方法調用時,傳遞的參數是按引用進行傳遞,其實傳遞的引用的地址,也就是變量所對應的內存空間的地址。傳遞的是值的引用,也就是說傳遞前和傳遞後都指向同一個引用(也就是同一個內存空間)。

6. JDK 中經常使用的包有哪些?

  • java.lang:這個是系統的基礎類;
  • java.io:這裏面是全部輸入輸出有關的類,好比文件操做等;
  • java.nio:爲了完善 io 包中的功能,提升 io 包中性能而寫的一個新包;
  • java.net:這裏面是與網絡有關的類;
  • java.util:這個是系統輔助類,特別是集合類;
  • java.sql:這個是數據庫操做的類。

7. 訪問修飾符 public、protected、 default、private 的區別?在這裏插入圖片描述

  • 類的成員不寫訪問修飾符默認爲default,默認對於同一個包的其餘類至關於公開(public),對於不是同一個包的其餘類至關於私有(private)。

  • 受保護(protected)對子類至關於公開,對於不是同一個包沒有父子關係的類至關於私有。

  • Java中,外部類的修飾符只能是public或默認,類的成員(包括內部類)的修飾符能夠是以上四種。

8. 數據基礎類型有哪些?

基礎類型有 8 種:byte、boolean、char、short、int、float、long、double,注意 String 不屬於基礎類型, 屬於對象。

9. final 有什麼用?

用於修飾類、屬性和方法;凡是引用 final 關鍵字的地方皆不可修改!

  • 修飾類:表示該類不能被繼承;
  • 修飾方法:表示方法不能被重寫;
  • 修飾變量:表示變量只能一次賦值之後,值不能被修改。

2、Java 核心知識

10. 經常使用的集合類有哪些?

最經常使用的集合類是 List 和 Map。List 的具體實現包括 ArrayList 和 Vector,它們是可變大小的列表,比較適合構建、存儲和操做任何類型對象的元素列表。 List 適用於按數值索引訪問元素的情形。Map 提供了一個更通用的元素存儲方法。Map 集合類用於存儲元素對(稱做」 鍵」 和」 值」),其中每一個鍵映射到一個值。

  • Map 接口的實現類主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap 等;
  • List 接口的實現類主要有:ArrayList、LinkedList、Vector 等。

11. HashMap 和 Hashtable 有什麼區別?

HashMap 運行 key 和 value 爲 null,而 Hashtable 不容許。Hashtable 是線程安全的,而 HashMap 是非線程安全的。

12. HashMap 的實現原理是什麼?

HashMap 基於 Hash 算法實現的,咱們經過 put(key,value) 存儲,get(key) 來獲取。當傳入 key 時,HashMap 會根據 key. hashCode() 計算出 hash 值,存儲時,若是出現 hash 值相同的 key,此時有兩種狀況,若是 key 相同,則覆蓋原始值;若是 key 不一樣,即出現衝突,則將當前的 key-value 放入鏈表中。獲取時,直接找到 hash 值對應的下標,在進一步判斷 key 是否相同,從而找到對應值。

13. ConcurrentHashMap 的實現原理是什麼?

ConcurrentHashMap 是 Java1.5 中引用的一個線程安全支持高併發的 HashMap 集合類。該類包含兩個靜態內部類 HashEntrySegment,前者用來封裝映射表的鍵值對,後者用來充當鎖的角色。Segment 採用了很是精妙的「分段鎖」策略,每一個 Segment 對應一個 HashEntry 數組,當對 HashEntry 數組的數據進行修改時,必須首先得到對應的 Segment 鎖。

14. ArrayList 和 LinkedList 的區別是什麼?

  • ArrayList 的實現是基於數組,LinkedList 的實現是基於雙向鏈表
  • 對於隨機訪問,ArrayList 優於 LinkedList;
  • 對於插入和刪除操做,LinkedList 優於 ArrayList,由於當元素被添加到 LinkedList 任意位置的時候,不須要像 ArrayList 那樣從新計算大小或者是更新索引;
  • LinkedList 比 ArrayList 更佔內存,由於 LinkedList 的節點除了存儲數據,還存儲了兩個引用,一個指向前一個元素,一個指向後一個元素。

15. 如何實現 Array 和 List 之間的轉換?

  • Array 轉 List: Arrays. asList(array)
  • List 轉 Array:List 的 toArray() 方法。

16. 在 Queue 中 poll() 和 remove() 有什麼區別?

二者都是返回第一個元素,並在隊列中刪除返回的對象。不一樣的是若是沒有元素 poll() 會返回 null,而 remove() 會直接拋出異常

17. 哪些集合類是線程安全的?

Vector、Hashtable 都是線程安全的,而 HashMap 是非線程安全的,不過 Java. util. concurrent 併發包中,ConcurrentHashMap 是線程安全的。

18. 什麼是 Java 反射?

在 Java 運行時環境中,對於任意一個,可以知道這個類有哪些屬性和方法,對於任意一個對象,可以調用它的任意一個方法

19. Java 怎麼實現動態代理?

Java 中,經常使用的動態代理實現方式有兩種,一種是利用 JDK 反射機制生成代理,另一種是使用 CGLIB 代理。JDK 代理必需要提供接口,而 CGLIB 則不須要,能夠直接代理類,是基於繼承當前類的子類實現的。

3、Java 必問專題

20. 進程和線程有什麼區別?

  • 進程:是具備必定獨立功能的程序、它是系統進行資源分配和調度的一個獨立單位,重點在系統調度和單獨的單位,也就是說進程是能夠獨 立運行的一段程序
  • 線程:線程進程的一個實體,是 CPU 調度和分派的基本單位,他是比進程更小的能獨立運行的基本單位。

二者關係:一個線程只能屬於一個進程,而一個進程能夠有多個線程,但至少有一個線程,資源分配給進程,同一進程的全部線程共享該進程的全部資源。

追問:GC(垃圾回收)知道嗎?

垃圾回收線程是特殊的守護線程,守護線程是運行在後臺的一種特殊進程。它獨立於控制終端而且週期性地執行某種任務或等待處理某些發生的事件。

21. 建立線程有哪幾種方式?

建立線程有三種方式:

  • 繼承 Thread 類重寫 run 方法;
  • 實現 Runnable 接口;
  • 實現 Callable 接口。

22. 什麼是多線程,多線程的優劣?

多線程:多線程是指程序中包含多個執行流,即在一個程序中能夠同時運行多個不一樣的線程來執行不一樣的任務。

多線程的好處:

能夠提升 CPU 的利用率。在多線程程序中,一個線程必須等待的時候,CPU 能夠運行其它的線程而不是等待,這樣就大大提升了程序的效率。也就是說容許單個程序建立多個並行執行的線程來完成各自的任務。

多線程的劣勢:

線程也是程序,因此線程須要佔用內存,線程越多佔用內存也越多; 多線程須要協調和管理,因此須要 CPU 時間跟蹤線程; 線程之間對共享資源的訪問會相互影響,必須解決競用共享資源的問題。

  1. 你知道怎麼建立線程池嗎?

建立線程池的方式有多種,這裏你只須要答 ThreadPoolExecutor 便可。

ThreadPoolExecutor() 是最原始的線程池建立,也是阿里巴巴 Java 開發手冊中明確規範的建立線程池的方式。

24. 線程池的經常使用參數有了解嗎?

ThreadPoolExecutor 包含如下七個參數:

  • corePoolSize:線程池中的核心線程數
  • maximumPoolSize:線程池中容許存在的工做線程的最大數量
  • keepAliveTime:閒置超時時間
  • unit:超時時間的單位(時/分/秒等)
  • workQueue:線程池中的任務隊列
  • threadFactory:爲線程池提供建立新線程的線程工廠
  • rejectedExecutionHandler:線程池任務隊列超過 maxinumPoolSize 以後的拒絕策略

前兩個參數能夠這麼理解,若是運行的線程少於 corePoolSize,Executor 則能夠不排隊直接添加新的線程;若是大於等於 corePoolSize,則將請求加入隊列,若是沒法加入,則建立新線程;若是超出 maxinumPoolSize,任務被拒絕。

25. 怎麼保證線程安全?

  • 使用安全類,好比 Java. util. concurrent 下的類;
  • 使用鎖,例如 synchronized、Lock。

26. synchronized 和 Lock 有什麼區別?

  • synchronized 會自動釋放鎖,Lock 需手工釋放鎖(unlock() 方法釋放鎖),不然容易形成線程死鎖;
  • synchronized 是 Java 的關鍵字,在 JVM 層面上;Lock 是一個類;
  • synchronized 沒法判斷是否獲取鎖的狀態,Lock 能夠判斷是否獲取到鎖。

27. 什麼是死鎖?

死鎖是指兩個或兩個以上的進程在執行過程當中,因爲競爭資源或者因爲彼此通訊而形成的一種阻塞的現象。

追問:怎麼避免?

  • 加鎖順序,一個線程若是要獲取多個鎖,必須按照必定的順序去獲取;
  • 加鎖時限,一個線程嘗試去獲取鎖,若是在指定的時間內獲取不到,就放棄等待鎖,並釋放本身如今所持有的鎖,而後隨機等待必定時間,再去獲取鎖。

28. ThreadLocal 是什麼?有哪些使用場景?

當使用 ThreadLocal 維護變量時,ThreadLocal 爲每一個使用該變量的線程提供獨立的變量副本,因此每個線程均可以獨立地改變本身的副本,而不會影響其它線程所對應的副本。

ThreadLocal 的經典使用場景是 session 管理(不一樣的線程對應不一樣的 session)和數據庫連接(爲每一個線程建立不一樣的連接)。

29. 你瞭解哪些設計模式?

  • 建立型模式,共五種:簡單工廠模式、抽象工廠模式、單例模式、建造者模式、原型模式。
  • 結構型模式,共七種:適配器模式、裝飾器模式、代理模式、外觀模式、橋接模式、組合模式、享元模式。
  • 行爲型模式,共十一種:策略模式、模板方法模式、觀察者模式、迭代子模式、責任鏈模式、命令模式、備忘錄模式、狀態模式、訪問者模式、中介者模式、解釋器模式。

30. 簡單工廠模式和抽象工廠模式有什麼區別?

  • 簡單工廠模式:是由一個工廠對象建立產品實例,簡單工廠模式的類通常是使用靜態方法,經過不一樣的參數的建立不一樣的對象實例,能夠生產結構中的任意產品,不能增長新的產品。
  • 抽象工廠模式:提供一個建立一系列相關或相互依賴對象的接口,而無需制定他們具體的類,用來生產不一樣產品族的所有產品,對於增長新的產品,無能爲力;支持增長產品族。

4、Java 框架

31. Spring 框架的優勢有哪些?

  • Spring 提供 IoC 技術,控制反轉,容器會幫你管理依賴的對象,將對象的建立交給了 Spring,簡化了開發,下降了代碼之間的耦合性和侵入性。
  • Spring 提供了面向切片編程,這樣對某一類的問題,好比日誌,異常統一處理。
  • Spring 提供了事務支持,咱們只需經過配置就能夠完成對事物管理。
  • 集成各類優秀的框架,提供了對各類優秀框架如(Hibernate,MyBatis)等的直接支持。

32. 什麼是 Spring AOP?

即面向切面編程,經過預編譯方式和運行期動態代理實現程序功能的統一維護的一種技術。它將業務邏輯的各個部分進行隔離,使開發人員在編寫業務邏輯時能夠專心於核心業務,從而提升了開發效率。主要體如今事務處理、日誌管理、權限控制、異常處理等方面。

33. 什麼是 Spring IoC?

即 inverse of control(控制反轉),是 Spring 的核心,是一種建立對象的思想。將建立對象的權力交給 Spring 容器,其實就是讓 Spring 容器幫你建立對象,而你不須要在 Java 代碼中 new 對象了。

34. Spring 經常使用的注入方式有哪些?

  • setter 注入
  • 構造方法注入
  • 註解注入

35. Spring 自動裝配 bean 有哪些方式?

Spring 配置文件中 節點的 autowire 參數能夠控制 bean 自動裝配的方式:

  • default:默認的方式和「no」方式同樣
  • no:不自動裝配,須要使用節點或參數
  • byName:根據名稱進行裝配
  • byType:根據類型進行裝配
  • constructor:根據構造函數進行裝配

36. @Autowired 是作什麼用?

@Autowired 是一個註釋,它能夠對類成員變量、方法及構造函數進行標註,讓 Spring 完成 bean 自動裝配的工做。

37. Spring Boot 有什麼優點?

Spring Boot 繼承了 Spring 優勢,使得開發更加方便快捷。

  • 簡化編碼
  • 簡化配置
  • 簡化部署
  • 提供了監控系統
  • 上手快,開發效率高

38. Spring Boot 配置文件有哪幾種類型?

配置文件有 . properties 格式和 . yml 格式,它們主要的區別是書法風格不一樣。

39. Spring Cloud 是什麼?

Spring Cloud 是基於 Spring Boot 的一整套實現微服務的框架。它它利用 Spring Boot 的開發便利性巧妙地簡化了分佈式系統基礎設施的開發,提供了微服務開發所需的配置管理、服務發現、斷路器、智能路由、微代理、控制總線、全局鎖、決策競選、分佈式會話和集羣狀態管理等組件。

40. Spring Cloud 的核心組件有哪些?

  • Eureka:服務註冊和服務發現。
  • Hystrix:斷路器,旨在經過熔斷機制控制服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。
  • Zuul:網關,提供動態路由、監控、彈性、安全等邊緣服務的框架。
  • SpringCloudConfig:配置中心,配置管理工具包,讓你能夠把配置放到遠程服務器,集中化管理集羣配置。
  • SpringCloudBus:消息總線,用於在集羣(例如,配置變化事件)中傳播狀態變化。

固然,除了以上還有不少,就不一一列舉了。

41. MyBatis 和 Hibernate 的區別有哪些?

  • 靈活性:MyBatis 更加靈活,MyBatis 能夠進行更爲細緻的 SQL 優化。
  • 可移植性: Hibernate 數據庫移植性很好,MyBatis 的數據庫移植性很差,不一樣的數據庫須要寫不一樣 SQL。
  • 技術門檻:MyBatis 入門比較簡單。
  • 二級緩存: Hibernate 有更好的二級緩存機制,可使用第三方緩存。MyBatis 自己提供的緩存機制不佳。

5、分佈式系統基礎中間件

42. ZooKeeper 是什麼?

ZooKeeper 是一個分佈式的,開放源碼的分佈式應用程序協調服務,是 Google 的 Chubby 一個開源的實現,是 Hadoop 和 HBase 的重要組件。它是一個爲分佈式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分佈式同步、組服務等。

43. ZooKeeper 集羣選主和同步的機制是什麼?

ZooKeeper 的核心是原子廣播,這個機制保證了各個 Server 之間的同步,實現這個機制的協議叫作 ZAB 協議。ZAB 協議有兩種模式:分別是恢復模式和廣播模式。

  • 恢復模式,ZooKeeper 配置爲集羣模式時,系統啓動或者是當前 Leader 崩潰或者是當前 Leader 丟失大多數的 Follower,ZK 進入恢復模式,恢復模式須要從新選舉出一個新的 Leader,當領導者被選舉出來,且大多數 Server 的完成了和 Leader 的狀態同步之後,恢復模式就結束了。
  • 廣播模式,狀態同步保證了 Leader 和全部 Server 都具備相同的系統狀態。這時候當 Server 加入 ZooKeeper 集羣后,會先在恢復模式下啓動該 Server,發現 Leader 後,並和 Leader 進行狀態同步,待到同步結束,它也參與消息廣播,即進入廣播狀態。ZooKeeper 服務一直維持在 Broadcast 狀態,直到 Leader 崩潰了或者 Leader 失去了大部分的 Followers 支持,纔會進入恢復模式,重新選舉 Leader。

44. 集羣中有 3 臺服務器,宕機 1 臺,這個時候 ZooKeeper 還可使用嗎?

能夠,根據選票過半的選舉原則,所以集羣節點最好爲奇數;單數服務器只要沒超過一半的宕機就能夠繼續使用;因此 ZooKeeper 集羣的容災數量 =(集羣總節點數 - 1)/2;也就是說 3 臺服務器集羣的話,最多容許 1 臺宕機。

45. Redis 是什麼?都有哪些使用場景?

Redis 是一個使用 C 語言開發的高效緩存內存數據庫

Redis 使用場景:

  • 緩存熱點信息
  • 緩存用戶會話信息

46. 你使用過 Redis 的哪些經常使用功能?

  • 數據緩存
  • 分佈式鎖

47. Redis 支持的數據類型有哪些?

Redis 支持的數據類型:string、list、hash、set、zset(sorted set)。

48. Redis 和 Memcache 有什麼區別?

  • Redis 支持數據的持久化,而 Memcache 不行,由於 Redis 能夠把數據持久化在硬盤,而 Memcache 只能放在內存。
  • 支持的數據類型不一樣:Redis 有複雜的數據類型,Memcache 對數據類型支持相對簡單。
  • value 值大小不一樣:Redis 最大能夠達到 512mb;Memcache 只有 1mb。

49. 什麼是緩存穿透?怎麼解決?

  • 緩存穿透:指查詢一個必定不存在的數據,因爲緩存是不命中時須要從數據庫查詢,查不到數據則不寫入緩存,這將致使這個不存在的數據每次請求都要到數據庫去查詢,形成緩存穿透。
  • 解決方案:緩存空對象。若是一個查詢返回的數據爲空(無論是數 據不存在,仍是系統故障),咱們仍然把這個空結果進行緩存,但它的過時時間會很短,最長不超過五分鐘。

50. 緩存和數據庫之間怎麼保證雙寫一致性?

  • 讀請求和寫請求串行化,串到一個內存隊列裏去,這樣就能夠保證必定不會出現不一致的狀況,但串行化以後,就會致使系統的吞吐量會大幅度的下降,實際上通常不用這個辦法。
  • 讀的時候,先讀緩存,緩存沒有的話,就讀數據庫,而後取出數據後放入緩存,同時返回響應;更新的時候,先刪除緩存,而後再更新數據庫,可使用事物機制來保證數據的一致性。而後還要合理的設置緩存過時時間。

51. Redis 持久化有幾種方式?

  • RDB(Redis Database):原理是將 Reids 在內存中的數據庫記錄定時 dump 到磁盤上的 RDB 持久化)。
  • AOF(Append Only File):原理是將 Reids 的操做日誌以追加的方式寫入文件。

52. Redis 怎麼實現分佈式鎖?

Redis 分佈式鎖通常使用 setnx(set if not exists)指令,只容許被一個程序佔有,佔用成功了就能夠繼續執行,失敗了就只能放棄或稍後重試,使用完調用 del 釋放鎖。

僞代碼示例(這裏只是簡述,實際應用沒有那麼簡單的,感興趣的同窗能夠詳細查一下資料):

  • 加鎖:setnx(key,threadId)
  • 設置超時時間:expire(key,60)
  • 解鎖:del(key)

53. 消息隊列的使用場景有哪些?

  • 秒殺活動,削峯填谷(雙十一),延遲業務處理。
  • 模塊解耦,把兩個模塊獨立,好比支付完成後,給用戶返積分,這個時候不用在支付模塊裏添加新增積分的功能,只須要把新增積分的接口添加到支付確認的消息隊列便可,後面再添加任何功能只須要訂閱對應的消息隊列便可。

54. 消息隊列包含哪些核心角色?

  • 生產者(producer):負責產生消息;
  • 消費者(Consumer):負責消費消息;
  • 消息代理(Message Broker):負責存儲消息和轉發消息。

55. JMS 和消息隊列的關係?

JMS(Java Messaging Service)是 Java 平臺上有關面向消息中間件的技術規範,經過提供標準的產生、發送、接收消息的接口簡化企業應用的開發,翻譯爲 Java 消息服務。它是 Java EE 中定義的一組標準 API,它自身並非一個消息服務系統。

56. ActiveMQ 的基本使用?

Linux 下安裝 ActiveMQ:下載 activemq 壓縮包(apache-activemq-5.13.0-bin.tar.gz)解壓,執行 apache-activemq-5.13.0/bin/activemq,檢測 activemq 是否安裝成功:netstat -an | grep 61616

ActiveMQ 前端控制檯端口默認 8161 端口,在 jetty.xml 中的 jettyPort 對應的 port 能夠改爲你想要設置的端口。部署完畢後能夠打開 http://localhost:8161/admin/ 進入控制檯頁面,帳號密碼默認 admin。

在 conf/activemq.xml 中 61616 的默認端口來自 transportConnector 對應的 URI 地址,若是想要修改或新增端口,也能夠在這個地方新增或修改。

ActiveMQ 啓動命令爲 activemq start,中止命令爲 activemq stop,查看運行狀態命令爲 activemq status

57. ActiveMQ 消息傳輸模式

點對點模式

在點對點模型中,一個消費者對應一個生產者,生產者將消息放入隊列中,當消費者請求隊列中的消息時,消息會從隊列中取出,並投遞給消費者,消息投遞後會從隊列中刪除,這樣就能夠保證消息只能投遞給一個接收者。並且消息發送客戶端與接收客戶端沒有時間上的依賴,發送客戶端能夠在任什麼時候刻發送信息到隊列,而不須要知道接收客戶端是否是在運行。

發佈/訂閱模式

一個生產者產生消息發送後,能夠被多個消費者進行接收。消息會發送給一個主題,與隊列相似,多個接收者均可以監聽一個主題。但與隊列不一樣的是,消息主題的全部訂閱者都會接收到此消息。而且必須建立一個訂閱者以後,才能消費發佈者的消息,並且爲了消費消息,訂閱者必須保持運行的狀態。

58. ActiveMQ 的消息持久化策略

消息持久性對於可靠消息傳遞來講是一種比較好的方法,即時發送者和接受者不是同時在線或者消息中心在發送者發送消息後宕機了,在消息中心重啓後仍然能夠將消息發送出去。消息持久性的原理很簡單,就是在發送消息出去後,消息中心首先將消息存儲在本地文件、內存或者遠程數據庫,而後把消息發送給接受者,發送成功後再把消息從存儲中刪除,失敗則繼續嘗試。

ActiveMQ 的消息持久化的默認機制是 KahaDB,還有 JDBC 不過通常不用,KahaDB 可用於任何場景, 提升了性能和恢復能力。消息存儲使用一個事務日誌和僅僅用一個索引文件來存儲它全部的地址。KahaDB 是一個專門針對消息持久化的解決方案, 它對典型的消息使用模式進行了優化。在 Kaha 中,數據被追加到 data logs 中。當再也不須要 log 文件中的數據的時候, log 文件會被丟棄。

配置方式:在 conf/activemq.xml 文件中

在這裏插入圖片描述

6、MySQL

59. 數據庫的三範式是什麼?

  • 第一範式:強調的是列的原子性,即列不可以再分紅其餘幾列;
  • 第二範式:一是表必須有一個主鍵;二是沒有包含在主鍵中的列必須徹底依 賴於主鍵,而不能只依賴於主鍵的一部分;
  • 第三範式:任何非主屬性不依賴於其它非主屬性。

60. ACID 分別指的是什麼?

  • 原子性(Atomic):事務中各項操做,要麼全作要麼全不作,任何一項操做的失敗都會致使整個事務的失敗;
  • 一致性(Consistent):事務結束後系統狀態是一致的;
  • 隔離性(Isolated):併發執行的事務彼此沒法看到對方的中間狀態;
  • 持久性(Durable):事務完成後所作的改動都會被持久化,即便發生災難性的失敗。經過日誌和同步備份能夠在故障發生後重建數據。

61. SQL 的內鏈接、左鏈接、右鏈接有什麼區別?

內鏈接是把匹配的關聯字段顯示出來;左鏈接會讀取左邊數據表的所有數據,即便右邊數據表沒有對應數據。右鏈接會讀取右邊數據表的所有數據,即便左邊數據表沒有對應數據。

62. MySQL 索引是怎麼實現的?

MySQL 官方對索引的定義爲:索引(Index)是幫助 MySQL 高效獲取數據的數據結構。提取句子主幹,就能夠獲得索引的本質:索引是一種數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。目前主流的數據庫引擎的索引都是 B+ 樹實現的,索引的性能也是更好的。

63. 怎麼驗證 MySQL 的索引是否知足需求?

須要根據查詢需求來判斷配置哪一種索引,肯定索引後,能夠經過 explain 命令來查看執行計劃,確認是否知足需求。explain 語法:explain select * from table

64. 說一下數據庫的樂觀鎖和悲觀鎖?

  • 樂觀鎖:每次去拿數據的時候都認爲別人不會修改,因此不會上鎖,可是在更新的時候會判斷一下在此期間別人有沒有去更新這個數據,可使用版本號等機制。樂觀鎖適用於多讀的應用類型,這樣能夠提升吞吐量。
  • 悲觀鎖:每次去拿數據的時候都認爲別人會修改,因此每次在拿數據的時候都會上鎖。傳統的關係型數據庫裏邊就用到了不少這種鎖機制,好比行鎖,表鎖等,讀鎖,寫鎖等,都是在作操做以前先上鎖。

65. MySQL 問題排查都有哪些手段?

  • 使用 show PROCESSLIST 命令查看當前鏈接信息,經過 MySQL 的端口定位是哪一個線程佔用(netstat -ntp |grep 46888),經過線程號排查是哪一個應用(ps -ef | grep pid);
  • 使用 explain 命令查詢 SQL 語句執行計劃;
  • 開啓慢查詢日誌,查看慢查詢的 SQL。

66. 如何作 MySQL 的性能優化?

  • 合理建立索引;
  • 禁止使用 select *,列出查詢字段;
  • 按期歸檔數據並拆分表。

7、JVM

67. 你瞭解類加載過程嗎?

  • 類加載的過程包括了加載、驗證、準備、解析、初始化五個階段:
  • 加載:經過一個類的全限定名來獲取其定義的二進制字節流,將這個字節流所表明的的靜態存儲結構轉化爲方法區的運行時數據結構,在堆中生成一個表明這個類的 Class 對象,做爲方法區中這些數據的訪問入口;
  • 驗證:主要做用就是確保被加載的類的正確性,主要包含文件格式的驗證,元數據驗證,字節碼驗證和符號引用驗證;
  • 準備:主要爲類變量分配內存並設置初始值;
  • 解析:主要是虛擬機將常量池中的符號引用轉化爲直接引用的過程。符號引用指的是一個標示,而直接引用是指向內存中的地址;
  • 初始化:主要爲類的靜態變量賦予正確的初始值,JVM 負責對類進行初始化,主要對類變量進行初始化。

68. 什麼是雙親委派模型?

當收到加載一個類的請求時,子類加載器並不會立刻去加載,而是依次去請求父類加載器加載,一直往上請求到最高類加載器:啓動類加載器。當啓動類加載器加載不了的時候,依次往下讓子類加載器進行加載。當達到最底下的時候,若是仍是加載不到該類,就會出現 ClassNotFound 的異常。

69. 你熟悉 JVM 哪些垃圾回收算法?

  • 標記—清除算法:標記無用對象,而後進行清除回收。缺點:會帶來另外一個新的問題:內存碎片化。
  • 複製算法:首先仍是先標記處待回收內存和不用回收的內存,而後將不用回收的內存複製到新的內存區域,這樣舊的內存區域就能夠所有回收,而新的內存區域則是連續的,解決了內存碎片化的問題,可是缺點是會損失掉部分系統內存,通常是新生代使用。
  • 標記—整理算法:首先仍是「標記」,標記事後,將不用回收的內存對象壓縮到內存一端,此時便可直接清除邊界處的內存,通常是老年代使用。

70. 你熟悉 JVM 哪些垃圾回收器?

這裏簡述幾個經典經常使用的便可:

  • Serial:單線程串行垃圾回收器。
  • ParNew:多線程的串行垃圾回收器。
  • ParallelParNew 相似是多線程的,但 Parallel 是吞吐量優先的收集器,能夠犧牲等待時間換取系統的吞吐量。
  • CMS:一種以得到最短回收停頓時間爲目標的收集器,採用標記—清除算法。

71. 你熟悉 JVM 哪些調優參數?

  • -Xms2g 堆初始值 2G
  • -Xmx2g 堆最大可用內存 2G
  • -XX:NewRatio=4 新生代: 老年代內存比例 = 1:4
  • -XX:PrintGC 觸發 GC 時打印日誌
  • -XX:PrintGCDetails 觸發 GC 時打印詳細日誌
  • -XX:UseSerialGC 使用 Serial 串行回收器
  • -XX+UseParNewGC 使用 ParNew + Serial Old 垃圾回收器組合

8、如何準備技術面試

1. 明確技術方向,匹配崗位要求

學歷、工做年限、技能、項目經歷、軟實力。找準定位,是要作技術仍是偏管理。劃重點:作技術就不要提管理。面試官很是討厭技術不紮實的人,明明是面試技術,卻老是提管理。這裏不是說不須要管理能力,而是要分清楚主次,只有你的技術使面試官滿意了,管理能力才能爲你加分。

2. 盤點我的價值,找亮點

《天道》中的一句話,博主分享給你們,不要太把本身當人,由於在 HR 們的眼中,咱們都是商品,你要把本身的價值以最直觀的方式體現出來,不要扯其餘沒用的。明確了本身有什麼價值,你須要問本身一個問題:以行業標準衡量,你以爲你是哪一個領域的專家?由於你只有是某個領域或者方向的專家,性價比高,HR 們纔會以爲這筆買賣很划算。不要自慚形穢,你之因此平庸,是由於你沒有深挖本身的亮點,在簡歷最後一欄自我評價裏,把亮點一一列舉出來,若是你實在是找不到,那總作過項目吧,能吃苦吧,善與人相處吧,逐條寫出來。

劃重點:項目經驗多不表明能力強,要總結而不是敘述,千萬不要逐個項目長篇敘述業務模塊,面試官對你作過的項目業務邏輯根本不感興趣,你須要把項目中你用過的技術列舉出來,最好是隻寫最近的或者你最有成就感的項目,把你瞭解的技術棧全都寫上。

3. 內推和獵頭,機會大不少

選擇公司也很重要,是互聯網公司仍是傳統企業,傳統企業相對重視業務,而互聯網公司比較重視技術。公司主要是作什麼產品、用的什麼技術 。若是你的資歷不夠,學歷雙非,但技術很強,想去大廠也不是沒機會。劃重點:找內推、找獵頭推薦要比本身投簡歷要機會大得多

4. 知己知彼百戰不殆

薪資、福利、平臺優點、晉升機制、工做環境、人際關係、工做強度、社會地位等等,把這些全都列出來,作個表格,排好優先級。如今業界對於跳槽漲薪的幅度大都控制在 30% 之內,瞭解一下你的城市、這個企業這個技術方向的平均薪酬來參考。劃重點:知己知彼纔好跟 HR 談薪

5. 一份簡歷闖天下?不可取

不一樣的企業、崗位須要的技能不一樣,你須要制定有針對性的簡歷。

劃重點:

  • 不要隨便寫與崗位不匹配的技能;
  • 只寫項目中你負責的工做便可;
  • 簡歷中的內容不要坑本身,每一句都要作到心中有數;
  • 把項目成果最好能量化體現。

6. 練習自我介紹

直接劃重點:

  • 限時 3 分鐘,不要太長不知所云,也不要過短顯得你沒準備;
  • 姓名、年齡、學校、學歷、工做年限,一個都不能落下,不要由於學校或者學歷通常而不介紹,躲不過去的不如坦然面對;
  • 兩三句話歸納你作過的項目,千萬不要攤開了講,不然你下面就不要說了,面試官通常會直接打斷你,進入問答環節;
  • 以總述的方式來說你所擅長的技術,注意只談技術別扯其餘,諸如管理能力、組織能力、興趣愛好等等千萬別扯。

最後,拿得出手的經典項目準備一個,刷刷面試題,還要準備一些非技術類問題,好比這個必問的經典問題:你爲何離職?關於這個問題,說內心話,不必那麼執拗。不要回答「上個公司加班太多,工做生活不能兼顧諸如此類 「,這樣回答雖然沒毛病,可是卻不是標準答案,試問哪一個互聯網公司不加班?若是有,誰不想去?這個問題標準答案是:個人我的職業規劃的緣由,我須要一個更大的平臺來施展,不斷地見識、學習和成長。

最後還要準備一兩個問面試官的問題,標準答案:貴公司當前使用的主流技術棧有哪些?若是我順利經過面試,我將會加入哪一個團隊?我將來的工做方向是什麼?千萬別扯別的,諸如大家公司薪酬大概是多少?(保密的不知道嗎),大家加班多很少?(廢話)。管住好奇心,這些問題等你過了技術面試,留着 HR 來回答你。

你們看看,面試前都要準備那麼多,若是是資深工程師崗位或者技術專家崗位,你可能起碼要準備 3 個月,即使是初/中級工程師,面試前也要認真準備 1 個月,這樣你的面試成功率纔會高不少。

寫了不少,你們發現我很愛說「劃重點」、「標準答案」、「千萬別扯」 之類,由於真的就是這樣。彷彿回到高三時,語文老師教我答題,他的口頭禪是:不要亂寫、不要你覺得、按標準答案去「套」。很是感謝我當時的語文老師(語文沒有拖個人後腿,偷笑),以理科狀元的優異成績考入華科。因此,我認爲求職並非一場對等的談判,而是一場考試(固然若是你是 BAT 系的大神,另當別論,這裏不糾結哈),高考有考霸,那麼面試呢天然也會有面霸,都有套路,這取決於你對套路的掌握程度。

其實還有不少話,擔憂思路一旦打開,噴涌而出,剎不住車了(大多也是在倒苦水,面試官也很無奈,哈哈,把面試者在面試過程當中的不按套路出牌的地方梳理總結一下,給後來的人以指引,不至於掉坑)。

相關文章
相關標籤/搜索