面試八股文-1


  • 在瀏覽器輸入URL,按下回車之后的流程?

    DNS域名解析,得到IP地址

    解析出IP地址后,根據IP地址和默認端口80和服務器建立連接

    瀏覽器發出讀取文件(URL中域名后邊部分對應的文件)的HTTP請求,該請求報文作為TCP三次握手的第三個報文的數據發送給服務器

    服務器對瀏覽器的請求作出響應,並把對應的html文本發送給瀏覽器

    釋放TCP連接(四次揮手斷開連接)

    瀏覽器解析該HTML文本並顯示內容

  • 說一下Java的內存模型

    Java內存模型(JMM)規定了所有的變量都存儲在主內存中(類比操作系統的主內存)。每條線程還有自己的工作內存(類比前面講的處理器高速緩存),線程的工作內存中保存了主內存的變量副本,線程對變量的所有操作都必須在工作內存中進行,而不能直接讀寫主內存中的數據

    JMM最重要的3點內容分別是重排序、內存可見性、原子性。

  • Java的內存結構

  • 什么是棧幀

    每一次函數的調用,都會在調用棧(call stack)上維護一個獨立的棧幀(stack frame).每個獨立的棧幀一般包括:

    • 函數的返回地址和參數
    • 臨時變量: 包括函數的非靜態局部變量以及編譯器自動生成的其他臨時變量
    • 函數調用的上下文
  • 什么是索引

    索引可以大大提高MySQL的檢索速度

    索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。

    實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。

    雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。建立索引會占用磁盤空間的索引文件

  • Innodb對比其他數據庫引擎的優勢是什么

    InnoDB給MySQL提供了具有提交、回滾和崩潰恢復能力的事物安全(ACID兼容)存儲引擎

    nnoDB是為處理巨大數據量的最大性能設計。它的CPU效率可能是任何其他基於磁盤的關系型數據庫引擎鎖不能匹敵的

    InnoDB支持外鍵完整性約束

    InnoDB被用在眾多需要高性能的大型數據庫站點上

    主鍵盡可能小.包括索引
    盡量避免全表掃描.因為會造成表鎖
    盡量緩存所有的數據和索引,提高響應速度,

  • myisam引擎

    1.mysql默認引擎,不支持事務*
    2.表級鎖定,更新時,鎖定機制是整張表被鎖定,其它連接無法更新表的數據,效率比較低下.鎖的機制成本很少,但大大降低了並發性能*
    3.讀寫互相阻塞,寫的時候阻塞讀,讀的時候也阻塞寫,但讀與讀之間不阻塞*
    4.只對索引進行緩存,雖然key_buffer可以大幅提高性能,減少磁盤IO,但對數據不緩存
    5.適合讀業務比較多的生產環境,比如BLOG等,讀的速度比較快.
    6.占用資源比較少.服務器硬件不好時.可以考慮使用
    7.數據恢復沒有innodb引擎恢復的完美
    8.支持全文索引,不支持外鍵約束1.盡量索引,緩存機制
    調整讀寫優先級
    用延遲插入.
    生產環境應用memcache緩存的多.Mysql本身的緩存為用少

  • 了解JVM嗎?說一下.class文件加載過程。

    (1) Loading:把class采用雙親委派機制load到內存中,也就是把class文件中的字節裝載到內存上。

    (2) Linking:

    ​ Linking過程中又分為以下三步:

    ​ a. Verification:檢驗文件類型,class的魔數是CAFEBABE,如果是其他的格式就會被剔除掉, 不進入下一階段。

    ​ b. Preparation:為靜態變量賦默認值。

    ​ c. Resolution:將類、方法、屬性等符號引用解析為直接引用;將class文件中常量池中的符號 引用解析為指針、偏移量等內存地址的直接引用。

    (3) Initializing:靜態變量賦初始值,也是在這個階段調用靜態代碼塊。

  • 說一下Java堆,新生代是怎么轉化為老年代的?

    Java堆 = 老年代 + 新生代

    新生代 = Eden + S0 + S1

    當 Eden 區的空間滿了, Java虛擬機會觸發一次 Minor GC,以收集新生代的垃圾,存活下來的對象,則會轉移到 Survivor區。

    大對象(需要大量連續內存空間的Java對象,如那種很長的字符串)直接進入老年態;

    如果對象在Eden出生,並經過第一次Minor GC后仍然存活,並且被Survivor容納的話,年齡設為1,每熬過一次Minor GC,年齡+1,若年齡超過一定限制(15),則被晉升到老年態。即長期存活的對象進入老年態。

    老年代滿了而無法容納更多的對象,Minor GC 之后通常就會進行Full GC,Full GC 清理整個內存堆 – 包括年輕代和年老代。

    Major GC 發生在老年代的GC,清理老年區,經常會伴隨至少一次Minor GC,比Minor GC慢10倍以上。

  • 什么情況下會發生棧內存溢出

    棧是線程私有的,他的生命周期與線程相同,每個方法在執行的時候都會創建一個棧幀,用來存儲局部變量表,操作數棧,動態鏈接,方法出口等信息。局部變量表又包含基本數據類型,對象引用類型

    如果線程請求的棧深度大於虛擬機所允許的最大深度,將拋出StackOverflowError異常,方法遞歸調用產生這種結果。

    如果Java虛擬機棧可以動態擴展,並且擴展的動作已經嘗試過,但是無法申請到足夠的內存去完成擴展,或者在新建立線程的時候沒有足夠的內存去創建對應的虛擬機棧,那么Java虛擬機將拋出一個OutOfMemory 異常。(線程啟動過多)

  • 垃圾收集器

    CMS(Concurrent Mark Sweep) 收集器: 是一種以獲得最短回收停頓時間為目標的收集器,標記清除算法,運作過程:初始標記,並發標記,重新標記,並發清除,收集結束會產生大量空間碎片。

    G1收集器: 標記整理算法實現,運作流程主要包括以下:初始標記,並發標記,最終標記,篩選標記。不會產生空間碎片,可以精確地控制停頓。

  • 怎么判斷一個Object需要回收

    • 引用計數算法
    • 可達性分析算法(Java使用的這一種)

    引用計數算法是在對象中加入一個計數器,當對象被引用,計數器+1,當引用失效,計數器-1這種算法實現簡單,效率高,但是有一個嚴重的問題會導致內存泄漏,那就是對象之間循環引用,比如說A對象持有B對象的引用,B對象持有A對象的引用,那么A和B的計數器值永遠>=1,也就是說這兩個對象永遠不會被回收

    可達性分析算法,Java中定義了一些起始點,稱為GC Root,當有對象引用它的時候,就把對象掛載在它下面,形成一個樹狀結構,當一個對象處於一個這樣的樹里時,就認為此對象是可達的,反之是不可達,

    如圖 Object1,Object2,Object3是對象可達的,Object4,Object5,Object6是不可達的

    那么有哪些可以作為GC Root呢?

    靜態屬性(被static修飾的屬性)
    常量(被static final修飾的屬性)
    虛擬機棧(本地變量表)中引用的對象
    本地方法棧中引用的對象

  • 多線程,怎么解決死鎖?

    所謂死鎖是指多個線程因競爭資源而造成的一種僵局(互相等待),若無外力作用,這些進程都將無法向前推進。

    解決:

    1. 加鎖順序(線程按照一定的順序加鎖)
    2. 加鎖時限(線程嘗試獲取鎖的時候加上一定的時限,超過時限則放棄對該鎖的請求,並釋放自己占有的鎖)
    3. 死鎖檢測
  • 進程間的通信方式

    管道( pipe ):
    管道是一種半雙工的通信方式,數據只能單向流動,而且只能在具有親緣關系的進程間使用。進程的親緣關系通常是指父子進程關系。
    有名管道 (namedpipe) :
    有名管道也是半雙工的通信方式,但是它允許無親緣關系進程間的通信。
    信號量(semophore ) :
    信號量是一個計數器,可以用來控制多個進程對共享資源的訪問。它常作為一種鎖機制,防止某進程正在訪問共享資源時,其他進程也訪問該資源。因此,主要作為進程間以及同一進程內不同線程之間的同步手段。
    消息隊列( messagequeue ) :
    消息隊列是由消息的鏈表,存放在內核中並由消息隊列標識符標識。消息隊列克服了信號傳遞信息少、管道只能承載無格式字節流以及緩沖區大小受限等缺點。
    信號 (sinal ) :
    信號是一種比較復雜的通信方式,用於通知接收進程某個事件已經發生。
    共享內存(shared memory ) :
    共享內存就是映射一段能被其他進程所訪問的內存,這段共享內存由一個進程創建,但多個進程都可以訪問。共享內存是最快的 IPC 方式,它是針對其他進程間通信方式運行效率低而專門設計的。它往往與其他通信機制,如信號兩,配合使用,來實現進程間的同步和通信。
    套接字(socket ) :
    套接口也是一種進程間通信機制,與其他通信機制不同的是,它可用於不同設備及其間的進程通信。

  • 線程間的通信方式

    鎖機制:包括互斥鎖、條件變量、讀寫鎖
    互斥鎖提供了以排他方式防止數據結構被並發修改的方法。
    讀寫鎖允許多個線程同時讀共享數據,而對寫操作是互斥的。
    條件變量可以以原子的方式阻塞進程,直到某個特定條件為真為止。對條件的測試是在互斥鎖的保護下進行的。條件變量始終與互斥鎖一起使用。
    信號量機制(Semaphore):包括無名線程信號量和命名線程信號量
    信號機制(Signal):類似進程間的信號處理
    線程間的通信目的主要是用於線程同步,所以線程沒有像進程通信中的用於數據交換的通信機制。

  • HTML常用標簽

    <div>、<a>、<img>、<h1>-<h6>、<p>、<table>、<form>、<ul>、<ol>、<dl>
    


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM