2019面試總結

1.線程和進程的定義 java

   定義:mysql

  進程:是併發執行的程序在執行過程當中分配和管理資源的基本單位,是一個動態概念,競爭計算機系統資源的基本單位。linux

  線程:是進程的一個執行單元,是進程內科調度實體。比進程更小的獨立運行的基本單位。線程也被稱爲輕量級進程。android

  注:一個程序至少一個進程,一個進程至少一個線程。redis

   區別: spring

  地址空間:同一進程的線程共享本進程的地址空間,而進程之間則是獨立的地址空間sql

  資源擁有:同一進程內的線程共享本進程的資源如內存、I/O、cpu等,可是進程之間的資源是獨立的 shell

   優缺點: 數據庫

  線程執行開銷小,可是不利於資源的管理和保護。線程適合在SMP機器(雙CPU系統)上運行。
api

  進程執行開銷大,可是可以很好的進行資源管理和保護。進程能夠跨機器前移。 

 使用場景:

  對資源的管理和保護要求高,不限制開銷和效率時,使用多進程。

  要求效率高,頻繁切換時,資源的保護管理要求不是很高時,使用多線程

 

2.NIO和AIO的區別;

  AIO 是完全的異步通訊。
       NIO 是同步非阻塞通訊。 
3.HTTP協議、TCP協議、IP協議和TCP/IP協議區別
 

  TCP/IP:協議叫作網絡通訊協議,它包括上百個協議,而HTTP協議、TCP協議、IP協議只是TCP/IP協議中的一部分. 

  TCP協議:是一種面向鏈接的、可靠的、基於字節流的{傳輸層}通訊協議 

注:tcp連接須要三次握手: 

  (1)第一次握手:Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。 

  (2)第二次握手:Server收到數據包後由標誌位SYN=1知道Client請求創建鏈接,Server將標誌位SYN和ACK都置爲1,ack=J+1,隨機產生一個值seq=K,並將該數據包發送給Client以確認鏈接請求,Server進入SYN_RCVD狀態。 

  (3)第三次握手:Client收到確認後,檢查ack是否爲J+1,ACK是否爲1,若是正確則將標誌位ACK置爲1,ack=K+1,並將該數據包發送給Server,Server檢查ack是否爲K+1,ACK是否爲1,若是正確則鏈接創建成功,Client和Server進入ESTABLISHED狀態,完成三次握手,隨後Client與Server之間能夠開始傳輸數據了 

注:tcp 關閉須要4次揮手: 

1)第一次揮手:Client發送一個FIN,用來關閉Client到Server的數據傳送,Client進入FIN_WAIT_1狀態。 

(2)第二次揮手:Server收到FIN後,發送一個ACK給Client,確認序號爲收到序號+1(與SYN相同,一個FIN佔用一個序號),Server進入CLOSE_WAIT狀態。 

(3)第三次揮手:Server發送一個FIN,用來關閉Server到Client的數據傳送,Server進入LAST_ACK狀態。 

(4)第四次揮手:Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。 


 IP協議:是無鏈接的通訊協議,負責將每一個包路由至它的目的地。 

HTTP協議:是一個屬於應用層的面向對象的協議,因爲其簡捷、快速的方式,適用於分佈式超媒體信息系統 

4.kafka的架構和幾個模塊組成 

    Broker:Kafka 集羣包含一個或多個服務器,這種服務器被稱爲 broker。 

    Topic:每條發佈到 Kafka 集羣的消息都有一個類別,這個類別被稱爲 Topic。

    Partition:Partition 是物理上的概念,每一個 Topic 包含一個或多個 Partition。

    Producer:負責發佈消息到 Kafka broker。 

   Consumer:消息消費者,向 Kafka broker 讀取消息的客戶端。 

   Consumer Group:每一個 Consumer 屬於一個特定的 Consumer Group(可爲每一個 Consumer 指定 group name,若不指定 group name 則屬於默認的 group)。 

5.ioc是什麼,有幾種注入方式 

    IOC:所謂IoC,對於spring框架來講,就是由spring來負責控制對象的生命週期和對象間的關係 
5.2注入方式: 
(1)使用屬性的setter方法注入 這是最經常使用的方式(xml注入dao層); 

(2)使用構造器注入; 

(3)使用Filed注入(用於註解方式) 

主要有四種註解能夠註冊bean,每種註解能夠任意使用,只是語義上有所差別:
   @Component:能夠用於註冊全部bean 

   @Repository:主要用於註冊dao層的bean 

   @Controller:主要用於註冊控制層的bean 

    @Service:主要用於註冊服務層的bean 


6.hashmap和hashtab的區別 

     hashtab:底層數組+鏈表實現,不管key仍是value都不能爲null,線程安全,實現線程安全的方式是在修改數據時鎖住整個HashTable,效率低 

    hshmap:底層數組+鏈表實現,能夠存儲null鍵和null值,線程不安全 

7.MySQL優化 

1. 爲查詢緩存優化你的查詢

2.字段建索引

3.避免 SELECT *

4.遠爲每張表設置一個ID

5.用 ENUM 而不是 VARCHAR

6.可能的使用 NOT NULL

7固定長度的表會更快

8 拆分大的 DELETE 或 INSERT 語句

9 設計合適的索引,基於主鍵的查找,上億數據也是很快的;
10反範式化設計,以空間換時間,避免join,有些join操做能夠在用代碼實現,不必用數據庫來實現;
11buffer,儘可能讓內存大於數據.

8.netty的架構

  Netty是基於Java NIO client-server的網絡應用框架,使用Netty能夠快速開發網絡應用,例如服務器和客戶端協議。Netty提供了一種新的方式來開發網絡應用程序,這種新的方式使它很容易使用和具備很強的擴展性。Netty的內部實現是很複雜的,可是Netty提供了簡單易用的API從網絡處理代碼中解耦業務邏輯。Netty是徹底基於NIO實現的,因此整個Netty都是異步的 。

 

9同步、異步,同步阻塞、同步非阻塞 

  同步和異步: 

同步:在發出一個同步調用時,在沒有獲得結果以前,該調用就不返回。

 

異步:在發出一個異步調用後,調用者不會馬上獲得結果,該調用就返回了。

 阻塞和非阻塞:  

阻塞調用是指調用結果返回以前,調用者會進入阻塞狀態等待。只有在獲得結果以後纔會返回。

非阻塞調用是指在不能馬上獲得結果以前,該函數不會阻塞當前線程,而會馬上返回。

  併發和並行:

併發是指一個時間段內,有幾個程序都在同一個CPU上運行,但任意一個時刻點上只有一個程序在處理機上運行。

並行是指一個時間段內,有幾個程序都在幾個CPU上運行,任意一個時刻點上,有多個程序在同時運行,而且多道程序之間互不干擾

 

10.rocitmq和kafka的區別以及Kafka的性能 

11.javaMap的遍歷方式 

12.es不適用什麼場景 

14.int[] arr=new int[0]打印的是對象仍是引用 

15.MySQL引擎的區別 

16.MySQL使用個8個lift jion會怎麼樣 

17.秒殺架構的設計 

19.arrysList邊遍歷邊刪除值該怎麼作(使用同一個list) 

20.mysql 的分庫和分表 

21.Java有了垃圾回收機制爲何還會出現內存泄漏 

22.linux系統的模塊 

  linux系統通常分爲4個主要部分:內核、shell+庫、文件系統和應用.

23.在數據量單線程能知足的狀況下使用單線程好,仍是多線程好。 

思路:多線程的線程調用十分耗cpu,多線程調用線程的調用要保存起來因此耗費內存 

24.springcloud和duboo的區別 

  通訊方式:

dubbo是純粹的RPC框架,實現遠程服務調用。spring cloud採用的是其於HTTP 的 REST方式。 嚴格來講,這兩種方式各有優劣。雖然從必定程度度上來講,後者犧牲了服務調用的性能,但也避免了上面提到的原生RPC帶來的問題。

並且REST相比RPC更爲靈活,服務提供方和調用方的依賴只依堂一紙契約,不存在代碼級的強依賴,這在強調快速微服務環境下,顯得更加合適。這也是dubbo和spring cloud最本質的區別

架構:

spring cloud比dubbo的功能更完善,涵蓋更廣,並且做爲spring的拳頭產品,它能與spring framework,spring boot,springdata等其餘spring項目完美融合,使用dubbo就像組裝電腦,各個環節的自由度很高,例如註冊中心,能夠用zookeeper,redis等。spring cloud就像品牌機,在spring source的整合下,作了大量的兼容性測試,保證了機器擁有更高的穩定性

 

25.MySQL和postgresql的區別 

     PG相對於MySQL的優點:

一、在SQL的標準實現上要比MySQL完善,並且功能實現比較嚴謹;

二、存儲過程的功能支持要比MySQL好,具有本地緩存執行計劃的能力;

三、對錶鏈接支持較完整,優化器的功能較完整,支持的索引類型不少,複雜查詢能力較強;

四、PG主表採用堆表存放,MySQL採用索引組織表,可以支持比MySQL更大的數據量。

五、PG的主備複製屬於物理複製,相對於MySQL基於binlog的邏輯複製,數據的一致性更加可靠,複製性能更高,對主機性能的影響也更小。

六、MySQL的存儲引擎插件化機制,存在鎖機制複雜影響併發的問題,而PG不存在。

 

   MySQL相對於PG的優點:

一、innodb的基於回滾段實現的MVCC機制,相對PG新老數據一塊兒存放的基於XID的MVCC機制,是佔優的。新老數據一塊兒存放,須要定時觸 發VACUUM,會帶來多餘的IO和數據庫對象加鎖開銷,引發數據庫總體的併發能力降低。並且VACUUM清理不及時,還可能會引起數據膨脹;

二、MySQL採用索引組織表,這種存儲方式很是適合基於主鍵匹配的查詢、刪改操做,可是對錶結構設計存在約束;

三、MySQL的優化器較簡單,系統表、運算符、數據類型的實現都很精簡,很是適合簡單的查詢操做;

四、MySQL分區表的實現要優於PG的基於繼承表的分區實現,主要體如今分區個數達到上千上萬後的處理性能差別較大。

五、MySQL的存儲引擎插件化機制,使得它的應用場景更加普遍,好比除了innodb適合事務處理場景外,myisam適合靜態數據的查詢場景。

 

整體上來講,開源數據庫都不是很完善,商業數據庫oracle在架構和功能方面都仍是完善不少的。從應用場景來講,

PG更加適合嚴格的企業應用場景(好比金融、電信、ERP、CRM),

而MySQL更加適合業務邏輯相對簡單、數據可靠性要求較低的互聯網場景(好比google、facebook、alibaba)

 

26.jvm(java)的內存結構

    JVM把內存劃分紅了以下幾個區域:

 

1.方法區(Method Area):方法區存放了要加載的類的信息(如類名、修飾符等)、靜態變量、構造函數、final定義的常量、類中的字段和方法等信息。方法區是全局共享的,在必定條件下也會被GC。當方法區超過它容許的大小時,就會拋出OutOfMemory:PermGen Space異常。

2.堆區(Heap): 堆區是GC最頻繁的,也是理解GC機制最重要的區域。堆區由全部線程共享,在虛擬機啓動時建立。堆區主要用於存放對象實例及數組,全部new出來的對象都存儲在該區域。

3.虛擬機棧(VM Stack):   虛擬機棧佔用的是操做系統內存,每一個線程對應一個虛擬機棧,它是線程私有的,生命週期和線程同樣,每一個方法被執行時產生一個棧幀(Statck Frame),棧幀用於存儲局部變量表、動態連接、操做數和方法出口等信息,當方法被調用時,棧幀入棧,當方法調用結束時,棧幀出棧。

 注:虛擬機棧定義了兩種異常類型:StackOverFlowError(棧溢出)和OutOfMemoryError(內存溢出)。若是線程調用的棧深度大於虛擬機容許的最大深度,則拋出StackOverFlowError;不過大多數虛擬機都容許動態擴展虛擬機棧的大小,因此線程能夠一直申請棧,直到內存不足時,拋出OutOfMemoryError。

 

4.本地方法棧(Native Method Stack):本地方法棧用於支持native方法的執行,存儲了每一個native方法的執行狀態。本地方法棧和虛擬機棧他們的運行機制一致,惟一的區別是,虛擬機棧執行Java方法,本地方法棧執行native方法。在不少虛擬機中(如Sun的JDK默認的HotSpot虛擬機),會將虛擬機棧和本地方法棧一塊兒使用。

5.程序計數器(Program Counter Register):程序計數器是一個很小的內存區域,不在RAM上,而是直接劃分在CPU上,程序猿沒法操做它,它的做用是:JVM在解釋字節碼(.class)文件時,存儲當前線程執行的字節碼行號,只是一種概念模型,各類JVM所採用的方式不同。字節碼解釋器工做時,就是經過改變程序計數器的值來取下一條要執行的指令,分支、循環、跳轉等基礎功能都是依賴此技術區完成的。

引用的種類:

       強引用:new出來的對象都是強引用,GC不管如何都不會回收,即便拋出OOM異常。
       軟引用:只有當JVM內存不足時纔會被回收。
       弱引用:只要GC,就會立馬回收,無論內存是否充足。
       虛引用:能夠忽略不計,JVM徹底不會在意虛引用。它惟一的做用就是作一些跟蹤記錄,輔助finalize函數的使用。

什麼樣的類會被回收:

a.該類的全部實例都已經被回收;
b.加載該類的ClassLoad已經被回收;
c.該類對應的反射類java.lang.Class對象沒有被任何地方引用。

 

GC機制:在上面介紹的五個內存區域中,有3個是不須要進行垃圾回收的:本地方法棧、程序計數器、虛擬機棧。由於他們的生命週期是和線程同步的,隨着線程的銷燬,他們佔用的內存會自動釋放。因此,只有方法區和堆區須要進行垃圾回收,回收的對象就是那些不存在任何引用的對象。

內存分區:

         新生代(Youn Generation):大體分爲Eden區和Survivor區,Survivor區又分爲大小相同的兩部分:FromSpace和ToSpace。新建的對象都是重新生代分配內存,Eden區不足的時候,會把存活的對象轉移到Survivor區。當新生代進行垃圾回收時會出發Minor GC(也稱做Youn GC)。

       舊生代(Old Generation):舊生代用於存放新生代屢次回收依然存活的對象,如緩存對象。當舊生代滿了的時候就須要對舊生代進行回收,舊生代的垃圾回收稱做Major GC(也稱做Full GC)。

       持久代(Permanent Generation):在Sun 的JVM中就是方法區的意思,儘管大多數JVM沒有這一代。

參考地址:http://www.javashuo.com/article/p-klharcol-gx.html

27.Synchronize 和 Lock 的區別

>1.原始構成
 synchronized 是關鍵字屬於JVM層面

  monitorenter(底層是經過monitor對象來完成,其實wait/notify等方法也依賴於monitor對象只有在同步塊或方法中才能調wait/notify等方法,)

  monitorexit

Lock是具體類(java.util.concurrent.locks.Lock)是api層面的鎖

>2.使用方法

synchronized 不須要用戶去手動釋放鎖,當synchroized代碼執行完成後系統會自動讓線程釋放對鎖的佔用

ReentrantLock則須要用戶去手動釋放鎖若沒有主動釋放鎖,就有可能致使出現死鎖現象。(須要lock()和unlock()方法配合try/finally語句塊來完成。)

>3.等待是否可中斷

synchronized不可中斷,出非拋出異常或者正常運行完成

ReentrantLock可中斷:1.設置超時方法try lock(long timeout,TimeUnit unit)2.lockInterruptibly()放代碼塊中,調用interrupt()方法可中斷

>4.加鎖是否公平

synchronized是非公平鎖

ReentrantLock二者皆可,默認非公平鎖,構造方法能夠傳入boolean值,true爲公平鎖,false爲非公平鎖

>5.鎖綁定多個條件

synchronized 沒有

ReentrantLock用來實現分組喚醒的線程們,能夠精確喚醒。而不是像synchronized要麼隨機喚醒一個線程要麼喚醒所有。

相關文章
相關標籤/搜索