要跳槽的你在備戰金九銀十了嘛,整理數道Java面試助你拿下offer

要跳槽的你在備戰金九銀十了嘛,整理數道Java面試助你拿下offer

前言:

又是一年跳槽季,俗話說不打無準備的仗,你開始備戰金九銀十了嘛。不少人出於職業規劃的考慮,會開始出現跳槽的想法。跳槽念頭一旦產生,所有的諮詢都不過是爲了“說服自己”而已。於是,我們要關注的重點就變成“怎麼跳得更好?怎麼能不掉進坑裏?怎麼樣纔可以順利拿到offer?”本文整理了一些大廠面試題分享給大家,助你們順利拿到自己想去的公司offer

.jvm篇

1.簡述 Java 垃圾回收機制

在 Java 中,程序員是不需要顯示的去釋放一個對象的內存的,而 是由虛擬機自行執行。在 JVM 中,有一個垃圾回收線程,它是低 優先級的,在正常情況下是不會執行的,只有在虛擬機空閒或者當 前堆內存不足時,纔會觸發執行,掃面那些沒有被任何引用的對象, 並將它們添加到要回收的集合中,進行回收

2.垃圾回收的優點和原理,並考慮 2 種回收機制。

Java 語言中一個顯著的特點就是引入了垃圾回收機制,使 C++ 程序員最頭疼的內存管理的問題迎刃而解,它使得 Java 程序員在 編寫程序的時候不再需要考慮內存管理。由於有個垃圾回收機制, Java 中的對象不再有“作用域”的概念,只有對象的引用纔有" 作用域"。垃圾回收可以有效的防止內存泄露,有效的使用可以使 用的內存。垃圾回收器通常是作爲一個單獨的低級別的線程運行, 不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用的 對象進行清楚和回收,程序員不能實時的調用垃圾回收器對某個對 象或所有對象進行垃圾回收。 回收機制有分代複製垃圾回收和標記垃圾回收,增量垃圾回收。

3. System.gc() 和 Runtime.gc() 會做什麼事情?

這兩個方法用來提示 JVM 要進行垃圾回收。但是,立即開始還是 延遲進行垃圾回收是取決於 JVM 的。

4. 如果對象的引用被置爲 null,垃圾收集器是否會立即釋放對象佔 用的內存?

不會,在下一個垃圾回收週期中,這個對象將是可被回收的。

5.簡述 Java 內存分配與回收策率以及 Minor GC 和 Major GC。

• 對象優先在堆的 Eden 區分配 • 大對象直接進入老年代 • 長期存活的對象將直接進入老年代 當 Eden 區沒有足夠的空間進行分配時,虛擬機會執行一次 Minor GC。Minor GC 通常發生在新生代的 Eden 區,在這個區 的對象生存期短,往往發生 Gc 的頻率較高,回收速度比較快; Full GC/Major GC 發生在老年代,一般情況下,觸發老年代 GC 的時候不會觸發 Minor GC,但是通過配置,可以在 Full GC 之 前進行一次 Minor GC 這樣可以加快老年代的回收速度。

併發編程專題

1.Synchronized 用 過 嗎 , 其 原 理 是 什 麼 ?

這 是 一 道 Java 面 試 中 幾 乎 百 分 百 會 問 到 的 問 題 , 因 爲 沒 有 任 何 寫 過 並 發 程 序 的 開 發 者 會 沒 聽 說 或 者 沒 接 觸 過 Synchronized。 Synchronized 是 由 JVM 實 現 的 一 種 實 現 互 斥 同 步 的 一 種 方 式 , 如 果 你 查 看 被 Synchronized 修 飾 過 的 程 序 塊 編 譯 後 的 字 節 碼 , 會 發 現 , 被 Synchronized 修 飾 過 的 程 序 塊 , 在 編 譯 前 後 被 編 譯 器 生 成 了 monitorenter 和 monitorexit 兩 個 字 節 碼 指 令 。 這 兩 個 指 令 是 什 麼 意 思 呢 ? 在 虛 擬 機 執 行 到 monitorenter 指 令 時 , 首 先 要 嘗 試 獲 取 對 象 的 鎖 : 如 果 這 個 對 象 沒 有 鎖 定 , 或 者 當 前 線 程 已 經 擁 有 了 這 個 對 象 的 鎖 , 把 鎖 的 計 數 器 +1; 當 執 行 monitorexit 指 令 時 將 鎖 計 數 器 -1; 當 計 數 器 爲 0 時 , 鎖 就 被 釋 放 了 。 如 果 獲 取 對 象 失 敗 了 , 那 當 前 線 程 就 要 阻 塞 等 待 , 直 到 對 象 鎖 被 另 外 一 個 線 程 釋 放 爲 止 。 Java 中 Synchronize 通 過 在 對 象 頭 設 置 標 記 , 達 到 了 獲 取 鎖 和 釋 放 鎖 的 目 的 。

2.爲 什 麼 說 Synchronized 是 非 公 平 鎖 ?

非 公 平 主 要 表 現 在 獲 取 鎖 的 行 爲 上 , 並 非 是 按 照 申 請 鎖 的 時 間 前 後 給 等 待 線 程 分 配 鎖 的 , 每 當 鎖 被 釋 放 後 , 任 何 一 個 線 程 都 有 機 會 競 爭 到 鎖 , 這 樣 做 的 目 的 是 爲 了 提 高 執 行 性 能 , 缺 點 是 可 能 會 產 生 線 程 飢 餓 現 象 。

3. 什 麼 是 鎖 消 除 和 鎖 粗 化 ?

鎖 消 除 : 指 虛 擬 機 即 時 編 譯 器 在 運 行 時 , 對 一 些 代 碼 上 要 求 同 步 , 但 被 檢 測 到 不 可 能 存 在 共 享 數 據 競 爭 的 鎖 進 行 消 除 。 主 要 根 據 逃 逸 分 析 。 程 序 員 怎 麼 會 在 明 知 道 不 存 在 數 據 競 爭 的 情 況 下 使 用 同 步 呢 ? 很 多 不 是 程 序 員 自 己 加 入 的 。  鎖 粗 化 : 原 則 上 , 同 步 塊 的 作 用 範 圍 要 盡 量 小 。 但 是 如 果 一 系 列 的 連 續 操 作 都 對 同 一 個 對 象 反 復 加 鎖 和 解 鎖 , 甚 至 加 鎖 操 作 在 循 環 體 內 , 頻 繁 地 進 行 互 斥 同 步 操 作 也 會 導 致 不 必 要 的 性 能 損 耗 。 鎖 粗 化 就 是 增 大 鎖 的 作 用 域 。

4.爲 什 麼 說 Synchronized 是 一 個 悲 觀 鎖 ? 樂 觀 鎖 的 實 現 原 理 又 是 什 麼 ? 什 麼 是 CAS, 它 有 什 麼 特 性 ?

Synchronized 顯 然 是 一 個 悲 觀 鎖 , 因 爲 它 的 並 發 策 略 是 悲 觀 的 : 不 管 是 否 會 產 生 競 爭 , 任 何 的 數 據 操 作 都 必 須 要 加 鎖 、 用 戶 態 核 心 態 轉 換 、 維 護 鎖 計 數 器 和 檢 查 是 否 有 被 阻 塞 的 線 程 需 要 被 喚 醒 等 操 作 。 隨 着 硬 件 指 令 集 的 發 展 , 我 們 可 以 使 用 基 於 衝 突 檢 測 的 樂 觀 並 發 策 略 。 先 進 行 操 作 , 如 果 沒 有 其 他 線 程 徵 用 數 據 , 那 操 作 就 成 功 了 ; 如 果 共 享 數 據 有 徵 用 , 產 生 了 衝 突 , 那 就 再 進 行 其 他 的 補 償 措 施 。 這 種 樂 觀 的 並 發 策 略 的 許 多 實 現 不 需 要 線 程 掛 起 , 所 以 被 稱 爲 非 阻 塞 同 步 。

樂 觀 鎖 的 核 心 算 法 是 CAS( Compareand Swap, 比 較 並 交 換 ) , 它 涉 及 到 三 個 操 作 數 : 內 存 值 、 預 期 值 、 新 值 。 當 且 僅 當 預 期 值 和 內 存 值 相 等 時 才 將 內 存 值 修 改 爲 新 值 。

這 樣 處 理 的 邏 輯 是 , 首 先 檢 查 某 塊 內 存 的 值 是 否 跟 之 前 我 讀 取 時 的 一 樣 , 如 不 一 樣 則 表 示 期 間 此 內 存 值 已 經 被 別 的 線 程 更 改 過 , 舍 棄 本 次 操 作 , 否 則 說 明 期 間 沒 有 其 他 線 程 對 此 內 存 值 操 作 , 可 以 把 新 值 設 置 給 此 塊 內 存 。 CAS 具 有 原 子 性 , 它 的 原 子 性 由 CPU 硬 件 指 令 實 現 保 證 , 即 使 用 JNI 調 用 Native 方 法 調 用 由 C++ 編 寫 的 硬 件 級 別 指 令 , JDK 中 提 供 了 Unsafe 類 執 行 這 些 操 作 。

MySQL篇

1.Mysql 的技術特點是什麼?

Mysql 數據庫軟件是一個客戶端或服務器系統,其中包括:支持各種客戶端程序和庫的多 線程 SQL 服務器、不同的後端、廣泛的應用程序編程接口和管理工具。

2.與 Oracle 相比,Mysql 有什麼優勢?

Mysql 是開源軟件,隨時可用,無需付費。 Mysql 是便攜式的 帶有命令提示符的 GUI。 使用 Mysql 查詢瀏覽器支持管理

3.在 Mysql 中 ENUM 的用法是什麼?

ENUM 是一個字符串對象,用於指定一組預定義的值,並可在創建表時使用。 Create table size(name ENUM('Smail,'Medium','Large');

4.Mysql 中使用什麼存儲引擎?

存儲引擎稱爲表類型,數據使用各種技術存儲在文件中。

技術涉及:

Storage mechanism

Locking levels

Indexing

Capabilities and functions.

5.Mysql 驅動程序是什麼?

以下是 Mysql 中可用的驅動程序:

PHP 驅動程序

JDBC 驅動程序

ODBC 驅動程序

CWRAPPER PYTHON 驅動程序

PERL 驅動程序

RUBY 驅動程序

CAP11PHP 驅動程序

Ado.net5.mxj

Dubbo篇

1. Dubbo 在安全機制方面是如何解決的

Dubbo 通過 Token 令牌防止用戶繞過註冊中心直連,然後在註冊中心上管理授權。Dubbo 還提供服務黑白名單,來控 制服務所允許的調用方。

2.dubbo 連接註冊中心和直連的區別

在開發及測試環境下,經常需要繞過註冊中心,只測試指定服務提供者,這時候可能需要點對點直連, 點對點直聯方式,將以服務接口爲單位,忽略註冊中心的提供者列表,

服務註冊中心,動態的註冊和發現服務,使服務的位置透明,並通過在消費方獲取服務提供方地址列表,實現軟負載 均衡和 Failover, 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據給 消費者。

服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調 用。註冊中心負責服務地址的註冊與查找,相當於目錄服務,服務提供者和消費者只在啓動時與註冊中心交互,註冊 中心不轉發請求,服務消費者向註冊中心獲取服務提供者地址列表,並根據負載算法直接調用提供者,註冊中心,服 務提供者,服務消費者三者之間均爲長連接,監控中心除外,註冊中心通過長連接感知服務提供者的存在,服務提供 者宕機,註冊中心將立即推送事件通知消費者

註冊中心和監控中心全部宕機,不影響已運行的提供者和消費者,消費者在本地緩存了提供者列表 註冊中心和監控中心都是可選的,服務消費者可以直連服務提供者。

3.dubbo 通信協議 dubbo 協議爲什麼要消費者比提供者個數多

因 dubbo 協議採用單一長連接,假設網絡爲千兆網卡(1024Mbit=128MByte),

根據測試經驗數據每條連接最多隻能壓滿 7MByte(不同的環境可能不一樣,供參考),理論上 1 個服務提供者需要 20 個服務消費者才能壓滿網卡。

4. dubbo 通信協議 dubbo 協議爲什麼不能傳大包

因 dubbo 協議採用單一長連接,

如果每次請求的數據包大小爲 500KByte,假設網絡爲千兆網卡(1024Mbit=128MByte),每條連接最大 7MByte(不同的 環境可能不一樣,供參考),

單個服務提供者的 TPS(每秒處理事務數)最大爲:128MByte / 500KByte = 262。 單個消費者調用單個服務提供者的 TPS(每秒處理事務數)最大爲:7MByte / 500KByte = 14。 如果能接受,可以考慮使用,否則網絡將成爲瓶頸。

5.dubbo 通信協議 dubbo 協議適用範圍和適用場景 適用範圍

傳入傳出參數數據包較小(建議小於 100K),消費者比提供者個數 多,單一消費者無法壓滿提供者,儘量不要用 dubbo 協議傳輸大文件或超大字 符串。

適用場景:常規遠程服務方法調用 dubbo

協議補充: 連接個數:單連接 連接方式:長連接 傳輸協議:TCP 傳輸方式:NIO 異步傳輸 序列化:Hessian 二進制序列化

spring boot面試專題

1.什麼是 Spring Boot?

多年來,隨着新功能的增加,spring 變得越來越複雜。只需訪問 https://spring.io/projects 頁面,我們就會看到可以在我們的應用程序中使用的所有 Spring 項目的不同功能。如果必 須啓動一個新的 Spring 項目,我們必須添加構建路徑或添加 Maven 依賴關係,配置應用程 序服務器,添加 spring 配置。因此,開始一個新的 spring 項目需要很多努力,因爲我們現 在必須從頭開始做所有事情。

Spring Boot 是解決這個問題的方法。Spring Boot 已經建立在現有 spring 框架之上。使用 spring 啓動,我們避免了之前我們必須做的所有樣板代碼和配置。因此,Spring Boot 可以 幫助我們以最少的工作量,更加健壯地使用現有的 Spring 功能。

2.Spring Boot 中的監視器是什麼?

Spring boot actuator 是 spring 啓動框架中的重要功能之一。Spring boot 監視器可幫助您訪 問生產環境中正在運行的應用程序的當前狀態。有幾個指標必須在生產環境中進行檢查和 監控。即使一些外部應用程序可能正在使用這些服務來向相關人員觸發警報消息。監視器 模塊公開了一組可直接作爲 HTTP URL 訪問的 REST 端點來檢查狀態。

3.如何實現 Spring Boot 應用程序的安全性?

爲了實現 Spring Boot 的安全性,我們使用 spring-boot-starter-security 依賴項,並且必須添 加安全配置。它只需要很少的代碼。配置類將必須擴展 WebSecurityConfigurerAdapter 並覆 蓋其方法。

4.什麼是 Swagger?你用 Spring Boot 實現了它嗎?

Swagger 廣泛用於可視化 API,使用 Swagger UI 爲前端開發人員提供在線沙箱。Swagger 是 用於生成 RESTful Web 服務的可視化表示的工具,規範和完整框架實現。它使文檔能夠以 與服務器相同的速度更新。當通過 Swagger 正確定義時,消費者可以使用最少量的實現邏 輯來理解遠程服務並與其進行交互。因此,Swagger 消除了調用服務時的猜測。

5. 什麼是 Spring Profiles?

Spring Profiles 允許用戶根據配置文件(dev,test,prod 等)來註冊 bean。因此,當應用 程序在開發中運行時,只有某些 bean 可以加載,而在 PRODUCTION 中,某些其他 bean 可 以加載。假設我們的要求是 Swagger 文檔僅適用於 QA 環境,並且禁用所有其他文檔。這 可以使用配置文件來完成。Spring Boot 使得使用配置文件非常簡單。

spring cloud面試專題

1.什麼是 Spring Cloud?

Spring cloud 流應用程序啓動器是基於 Spring Boot 的 Spring 集成應用程序,提供與外部系統的集成。 Spring cloud Task,一個生命週期短暫的微服務框架,用於快速構建執行有限數據處理的應用程序。

2.使用 Spring Cloud 有什麼優勢?

使用 Spring Boot 開發分佈式微服務時,我們面臨以下問題 

與分佈式系統相關的複雜性-這種開銷包括網絡問題,延遲開銷,帶寬問題,安全問題。

服務發現-服務發現工具管理羣集中的流程和服務如何查找和互相交談。它涉及一個服務目錄,在該 目錄中註冊服務,然後能夠查找並連接到該目錄中的服務。 

冗餘-分佈式系統中的冗餘問題。 

負載平衡 --負載平衡改善跨多個計算資源的工作負荷,諸如計算機,計算機集羣,網絡鏈路,中央 處理單元,或磁盤驅動器的分佈。 

性能-問題 由於各種運營開銷導致的性能問題。 

部署複雜性-Devops 技能的要求。

3.服務註冊和發現是什麼意思?

Spring Cloud 如何實現? 當我們開始一個項目時,我們通常在屬性文件中進行所有的配置。隨着越來越多的服務開發和部署,添加 和修改這些屬性變得更加複雜。有些服務可能會下降,而某些位置可能會發生變化。手動更改屬性可能會 產生問題。 Eureka 服務註冊和發現可以在這種情況下提供幫助。由於所有服務都在 Eureka 服務器上注 冊並通過調用 Eureka 服務器完成查找,因此無需處理服務地點的任何更改和處理。

4.負載平衡的意義什麼?

在計算中,負載平衡可以改善跨計算機,計算機集羣,網絡鏈接,中央處理單元或磁盤驅動器等多種計算 資源的工作負載分佈。負載平衡旨在優化資源使用,最大化吞吐量,最小化響應時間並避免任何單一資源 的過載。使用多個組件進行負載平衡而不是單個組件可能會通過冗餘來提高可靠性和可用性。負載平衡通 常涉及專用軟件或硬件,例如多層交換機或域名系統服務器進程。

結束:

今天就先分享到這裏,只是每個分享了幾個面試題,由於篇幅的限制我們下次在分享其他專題的面試題,以及上文發的專題的更多面試題後續都會有更多的分享,大家可以關注下我,或者大家可以關注我的微信公衆號 Java周某人 即可免費領取一些面試題資料

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章