欧美1区2区3区激情无套,两个女人互添下身视频在线观看,久久av无码精品人妻系列,久久精品噜噜噜成人,末发育娇小性色xxxx

(高頻問題)201-220 計算機 Java后端 實習 and 秋招 面試高頻問題匯總

專欄簡介

200. 利用 Rand7() 構造 Rand10():均勻隨機數(shù)生成

要利用已有的 rand7() 方法(生成 [1,7] 范圍內(nèi)的均勻隨機整數(shù))來實現(xiàn) rand10() 方法(生成 [1,10] 范圍內(nèi)的均勻隨機整數(shù)),核心在于構造一個更大的、均勻分布的中間范圍,然后通過拒絕采樣法篩選出適用于目標范圍的數(shù)值。

具體實現(xiàn)中,可以通過兩次調(diào)用 rand7() 來構造一個更大的隨機數(shù)范圍。表達式 (rand7() - 1) * 7 + rand7() 能夠等概率地生成 [1,49] 范圍內(nèi)的整數(shù)。第一次 rand7() - 1 產(chǎn)生 [0,6] 之間的隨機數(shù),乘以 7 后得到 [0, 7, 14, 21, 28, 35, 42] 中的一個值,這代表了7個等概率的“基數(shù)”。第二次 rand7() 產(chǎn)生 [1,7] 之間的隨機數(shù),與基數(shù)相加后,就構成了從 1 (0+1) 到 49 (42+7) 的均勻分布。

為了得到 [1,10] 的均勻分布,我們采用拒絕采樣。我們只接受生成的 num 在 [1,40] 范圍內(nèi)的值。如果 num 大于 40(即 41 到 49),則丟棄該值并重新生成,直到獲得一個在 [1,40] 區(qū)間內(nèi)的數(shù)。這樣做可以保證每個選中的數(shù)字(從1到40)出現(xiàn)的概率是相等的。最后,通過 num % 10 + 1 的操作,可以將 [1,40] 范圍內(nèi)的數(shù)映射到 [1,10] 范圍內(nèi)的數(shù),且保持均勻性。例如,1, 11, 21, 31 都會映射到 1;而 10, 20, 30, 40 都會映射到 10。

201. 重放攻擊的防御策略

重放攻擊(Replay Attack)是一種網(wǎng)絡攻擊手段,攻擊者會截獲合法的網(wǎng)絡通信數(shù)據(jù)包,并在稍后重新發(fā)送這些數(shù)據(jù)包給接收方,以達到欺騙系統(tǒng)、獲取未授權訪問或重復執(zhí)行操作的目的。攻擊者通常無需破解數(shù)據(jù)包內(nèi)容,僅利用其重放特性。

為有效抵御重放攻擊,常用的防御機制包括:

使用時間戳(Timestamp):在每個傳輸?shù)臄?shù)據(jù)包中嵌入當前的時間戳。接收方在收到數(shù)據(jù)包后,會校驗時間戳是否在其預設的有效時間窗口內(nèi)。若時間戳過舊或與當前時間差異過大,則判定為潛在的重放數(shù)據(jù)包并予以丟棄。這種方法能有效防止舊數(shù)據(jù)包的重放,但其挑戰(zhàn)在于需要通信雙方維持較為精確的時間同步,并且時間戳的校驗與管理會帶來一定的處理開銷。

使用序列號或隨機數(shù)(Nonce/Sequence Number):在通信會話的每個數(shù)據(jù)包中包含一個唯一的、單調(diào)遞增的序列號,或者一個一次性的隨機數(shù) (Nonce)。接收方會維護一個已接收序列號的記錄或期望的下一個序列號(對于序列號機制),或者一個已使用的 Nonce 集合(對于 Nonce 機制)。若收到的數(shù)據(jù)包序列號重復、不符合預期順序,或 Nonce已被使用,則視為重放攻擊。這種方法實現(xiàn)相對簡單且有效,但挑戰(zhàn)在于序列號或 Nonce 的生成、同步和管理,尤其是在分布式或高并發(fā)環(huán)境下

202. Java 進程 CPU 占用率飆升的排查與定位方法

當 Java 進程出現(xiàn) CPU 占用率異常飆升時,可采用以下步驟和工具進行定位:

首先,在服務器層面,可以使用 Linux 系統(tǒng)自帶的命令進行初步排查。top 命令能夠?qū)崟r顯示系統(tǒng)中各個進程的資源占用情況,包括 CPU 使用率、內(nèi)存使用等,通過 Shift + P 可以按 CPU 使用率排序,快速找出消耗 CPU 最多的 Java 進程ID(PID)。另外,ps -eo pid,ppid,cmd,%mem,%cpu --sort=-%cpu 命令也可以按 CPU 使用率降序顯示進程信息。

在定位到具體的 Java 進程后,可以進一步使用 JDK 提供的工具進行深入分析。jps 命令用于列出當前系統(tǒng)中所有 Java 進程及其 PID,方便確認目標進程。jstack <PID> 命令則非常關鍵,它可以打印出指定 Java 進程內(nèi)所有線程的堆棧跟蹤信息。通過分析線程堆棧,可以找出哪些線程正在執(zhí)行、是否處于死鎖狀態(tài),或者哪個方法調(diào)用消耗了大量 CPU 時間。通常,會多次執(zhí)行 jstack,對比不同時間點的線程狀態(tài),定位繁忙的線程。此外,jstat 可用于監(jiān)控 JVM 的各類運行時數(shù)據(jù),如 GC 活動、類加載等。如果懷疑是內(nèi)存問題間接導致 CPU 升高(例如頻繁 GC),jmap 命令可以生成堆轉(zhuǎn)儲快照(heap dump),后續(xù)可使用 MAT (Memory Analyzer Tool) 等工具進行分析。

203. 雙重檢查鎖定單例模式中 volatile 關鍵字的必要性分析

在雙重檢查鎖定(Double-Checked Locking)實現(xiàn)的單例模式中,volatile 關鍵字對于保證線程安全至關重要。其必要性主要體現(xiàn)在防止指令重排序?qū)е碌某跏蓟瘑栴}。

考慮以下典型的雙重檢查鎖定代碼片段:

// instance 變量需要被 volatile 修飾
private static volatile Singleton instance;

public static Singleton getInstance() {
    if (instance == null) { // 第一次檢查
        synchronized (Singleton.class) {
            if (instance == null) { // 第二次檢查
                instance = new Singleton(); // 關鍵賦值操作
            }
        }
    }
    return instance;
}

問題出在 instance = new Singleton(); 這一行。在 JVM 中,對象的創(chuàng)建并非原子操作,大致可以分解為以下三個步驟:

  1. Singleton 實例分配內(nèi)存空間。
  2. 調(diào)用 Singleton 的構造函數(shù),初始化成員字段。
  3. instance 引用指向分配的內(nèi)存地址。

如果沒有 volatile 修飾 instance 變量,編譯器或處理器可能會對上述步驟進行指令重排序。例如,實際執(zhí)行順序可能變成 1 -> 3 -> 2。在這種情況下,線程 A 執(zhí)行到步驟 3,instance 引用已經(jīng)指向了內(nèi)存地址,不再是 null。但此時對象的初始化(步驟 2)可能尚未完成。如果線程 B 在此刻進入第一個 if (instance == null) 判斷,它會發(fā)現(xiàn) instance 不為 null,從而直接返回一個尚未完全初始化的 instance 對象,后續(xù)使用該對象就可能引發(fā)錯誤。

volatile 關鍵字通過其內(nèi)存屏障作用,可以禁止特定類型的指令重排序,確保了對象初始化的有序性 (具體來說,它保證了在將引用賦值給 instance 之前,對象的構造函數(shù)一定已經(jīng)執(zhí)行完畢并完成了所有成員變量的初始化),同時也保證了 instance 變量在多線程之間的可見性。因此,volatile 在此場景下是確保單例模式線程安全的關鍵。

204. Java 應用響應緩慢或卡頓的線上排查思路

當線上 Java 應用程序出現(xiàn)運行卡頓、響應延遲增長等不符合預期的情況時,通常需要一套系統(tǒng)性的排查思路來定位問題根源。

首先,應全面檢查服務器的系統(tǒng)資源使用狀況。使用 tophtop 命令監(jiān)控 CPU 使用率,若 CPU 持續(xù)高位運行,可能指示計算密集型任務或死循環(huán)。通過 free -mvmstat 查看內(nèi)存使用情況,高內(nèi)存占用可能指向內(nèi)存泄漏或需要優(yōu)化內(nèi)存分配策略。同時,利用 iostat 關注磁盤 I/O,高 I/O 負載可能意味著磁盤讀寫瓶頸。

其次,深入分析 Java 應用程序本身的線程活動通過 jstack <PID> 命令獲取 Java 進程的線程堆棧信息,仔細分析是否存在死鎖、鎖競爭激烈或長時間運行的線程??梢远啻巫ト《褩_M行對比,找出持續(xù)占用 CPU 的熱點代碼。圖形化工具如 JConsole 或 VisualVM 也能直觀展示線程狀態(tài)和 CPU 消耗。

接下來,重點排查垃圾回收(GC)行為。分析 GC 日志(通過 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log 等參數(shù)開啟),關注 GC 的頻率(尤其是 Full GC)和單次停頓時間。jstat -gcutil <PID> <interval> 命令可以實時監(jiān)控 GC 分代變化、GC 次數(shù)和耗時。頻繁或耗時過長的 GC 是導致應用卡頓的常見原因,可能需要調(diào)整堆大小、GC 策略或排查內(nèi)存泄漏。

同時,審查應用程序日志是必不可少的環(huán)節(jié)。仔細檢查應用輸出的日志文件,尋找異常堆棧、錯誤信息或處理緩慢的業(yè)務邏輯記錄,這些往往能直接或間接指向問題所在。

最后,如果應用與數(shù)據(jù)庫交互頻繁,還需評估數(shù)據(jù)庫的性能表現(xiàn)。檢查慢查詢?nèi)罩荆治鰯?shù)據(jù)庫連接池狀態(tài),確認是否存在數(shù)據(jù)庫瓶頸或 SQL 優(yōu)化空間。

205. 通過 Java GC 日志判斷應用性能及預期符合度

通過分析 Java 的垃圾回收(GC)日志,可以有效地判斷應用程序是否存在性能卡頓以及其運行狀態(tài)是否符合預期。關鍵考察點包括:

GC 停頓時間(Pause Time):GC 日志會記錄每次 GC 事件造成的應用停頓時間。例如,在 2024-08-04T12:00:00.123+0000: 123.456: [GC (Allocation Failure) [PSYoungGen: 2048K->256K(6144K)] 2048K->256K(19840K), 0.0056780 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 這樣的日志中,0.0056780 secs (或者更準確地看 real=0.01 secs,代表實際停頓時間) 即表示該次 GC 的停頓時間。需要關注單次停頓時間是否過長,以及在特定時間窗口內(nèi)(如1分鐘)累積的總停頓時間。如果總停頓時間占比過高,例如在1分鐘內(nèi)累積停頓超過幾百毫秒甚至數(shù)秒,則表明 GC 對應用吞吐量和響應時間產(chǎn)生了顯著負面影響。

GC 頻率(Frequency)頻繁的 GC,特別是 Full GC,會導致應用程序頻繁停頓。通過統(tǒng)計單位時間內(nèi) Minor GC 和 Full GC 的發(fā)生次數(shù),可以評估內(nèi)存分配壓力和老年代的健康狀況。GC 日志中通常會記錄 GC 的觸發(fā)原因,如 Allocation Failure(年輕代空間不足導致 Minor GC)或 Ergonomics(JVM 根據(jù)當前堆狀況自動觸發(fā) Full GC)、System.gc()(顯式調(diào)用)。若 Allocation Failure 頻繁出現(xiàn),可能意味著對象創(chuàng)建速率過快或 Eden 區(qū)設置不當。

GC 類型(Type):GC 日志會明確標識 Minor GC(通常標記為 [GC ...] 或針對特定年輕代收集器的名稱如 [PSYoungGen ...])和 Full GC(標記為 [Full GC ...]。Full GC 通常涉及整個堆的回收,停頓時間遠長于 Minor GC,因此應重點關注 Full GC 的頻率和耗時。

堆內(nèi)存使用情況(Heap Usage):GC 日志詳細記錄了每次 GC 前后堆內(nèi)各區(qū)域(如年輕代、老年代)以及整個堆內(nèi)存的使用量變化。在上述示例日志 [PSYoungGen: 2048K->256K(6144K)] 2048K->256K(19840K) 中:

  • [PSYoungGen: 2048K->256K(6144K)] 表示:年輕代(PSYoungGen)在此次 GC 前使用了 2048K 內(nèi)存,GC 后降至 256K,其總大小為 6144K。
  • 2048K->256K(19840K) 表示:整個堆(包括年輕代和老年代)在此次 GC 前總共使用了 2048K 內(nèi)存,GC 后降至 256K,整個堆的總大小為 19840K。 通過觀察 GC 后內(nèi)存是否有效下降,可以判斷內(nèi)存回收效果;若 Full GC 后老年代內(nèi)存依然居高不下,可能存在內(nèi)存泄漏。

為了更高效地分析,可以借助 GC 日志分析工具,如 GCViewer 或 GCeasy。這些工具能將原始日志數(shù)據(jù)可視化,生成圖表和報告,幫助快速定位 GC 瓶頸。

206. 阻塞式I/O (BIO) 服務器:連接數(shù)與線程數(shù)的關系

在基于同步阻塞I/O (BIO) 模型實現(xiàn)的服務器中,其典型的網(wǎng)絡服務模式是為每一個客戶端連接分配一個獨立的線程進行處理。這種模式下,主線程(或稱為Acceptor線程)負責監(jiān)聽并接受新的客戶端連接請求。

當一個新的連接成功建立后,為了不阻塞主線程繼續(xù)接受其他連接,服務器通常會創(chuàng)建一個新的處理線程專門負責該連接上的數(shù)據(jù)讀取、業(yè)務處理和數(shù)據(jù)寫入。因此,如果此時服務器建立了100個客戶端連接,那么除了一個負責接收新連接的Acceptor線程外,還會額外創(chuàng)建100個用于處理這些已建立連接的線程。所以,總共會有 1 (Acceptor) + 100 (Handler) = 101 個線程在運行。這種模型的缺點是,如果連接被建立后長時間沒有數(shù)據(jù)交互,對應的處理線程也會處于阻塞等待狀態(tài),造成線程資源的浪費。

207. 非阻塞式I/O (NIO) 服務器:連接數(shù)與線程數(shù)的關系及Selector機制

與BIO模型不同,非阻塞I/O (NIO) 模型采用多路復用 (Multiplexing) 技術,允許服務器使用少量線程處理大量并發(fā)連接。其核心組件是Selector (選擇器),它能夠同時監(jiān)控多個通道 (Channel) 上的I/O事件(如連接就緒、數(shù)據(jù)可讀、數(shù)據(jù)可寫等)。

當服務器采用NIO模型時,即使建立了100個客戶端連接,也不需要為每個連接都創(chuàng)建一個獨立的線程。通常,服務器會啟動一個或少數(shù)幾個專門的I/O線程(通常稱為Reactor線程)來運行Selector。這個Selector會監(jiān)聽所有注冊給它的Channel。當任何一個Channel上發(fā)生I/O事件時(例如,一個新的客戶端連接請求到達,或者某個已連接的客戶端發(fā)送了數(shù)據(jù)),Selector會被喚醒,相應的I/O線程則可以獲取到這些就緒的事件,并進行處理。對于連接建立事件,服務器會接受連接并將新的Channel注冊到Selector上;對于數(shù)據(jù)讀寫事件,I/O線程會讀取數(shù)據(jù),然后可以將業(yè)務處理分發(fā)給后端的業(yè)務線程池。

因此,在NIO模型下,處理100個連接的I/O線程數(shù)量通常是固定的,且遠小于連接數(shù),例如CPU核心數(shù)個線程。實際的線程總數(shù)還會包括用于執(zhí)行耗時業(yè)務邏輯的線程池中的線程,但負責網(wǎng)絡I/O本身的線程數(shù)量得到了顯著優(yōu)化。

208. 處理器核心類型(大核/小核)與線程技術(物理/邏輯/超線程)解析

現(xiàn)代處理器為了平衡性能與功耗,常采用多種核心設計和線程技術。

大核與小核

大核 (Big Core) 通常設計有更強的單核計算能力和更復雜的指令流水線,適合處理計算密集型和對性能要求高的任務,但其功耗也相對較高。小核 (Little Core) 則側重于能效,其計算能力相對較弱,但功耗顯著低于大核,適合處理后臺任務、輕量級應用或在系統(tǒng)負載不高時維持基本運行。大小核架構 (Big.LITTLE Architecture) 或類似混合架構將這兩種核心集成在同一處理器中,操作系統(tǒng)通過動態(tài)調(diào)度,將高負載任務分配給大核執(zhí)行,低負載或后臺任務則交由小核處理,以實現(xiàn)性能與功耗的最佳平衡。大核和小核均屬于物理核心。

物理核心、邏輯核心與超線程

物理核心 (Physical Core) 是處理器芯片上實際存在的、獨立的中央處理單元。每個物理核心都具備完整的執(zhí)行單元、寄存器等。超線程技術 (Hyper-Threading,Intel的技術名稱,AMD有類似SMT技術) 是一種允許單個物理核心模擬出兩個或多個邏輯核心 (Logical Core) 的技術。從操作系統(tǒng)的視角來看,每個邏輯核心都表現(xiàn)為一個獨立的處理單元,可以被分配和調(diào)度任務。操作系統(tǒng)在啟動時會檢測到處理器提供的所有邏輯核心數(shù)量,并基于這些邏輯核心進行任務調(diào)度。雖然操作系統(tǒng)主要與邏輯核心交互,但現(xiàn)代操作系統(tǒng)也能夠感知物理核心的拓撲結構,并可能利用這些信息進行更優(yōu)化的調(diào)度,例如盡量將關聯(lián)不大的任務分散到不同的物理核心上,以減少資源競爭。

209. 負載均衡場景下客戶端長連接池的挑戰(zhàn)與缺點

在客戶端使用長連接池訪問經(jīng)過負載均衡器(Load Balancer, LB)代理的后端服務集群時,雖然長連接可以減少連接建立的開銷,但也可能引入一系列問題:

負載不均 (Uneven Load Distribution) 是一個核心問題。負載均衡器通常在建立新連接時根據(jù)其策略(如輪詢、最少連接數(shù)等)將請求分發(fā)到不同的后端服務實例。然而,客戶端一旦與某個后端服務實例建立了長連接,后續(xù)通過該連接的所有請求都會固定發(fā)送到此實例,負載均衡器無法對這些后續(xù)請求進行再次分發(fā)。這可能導致某些后端服務實例因承載了過多的長連接而過載,而其他實例則相對空閑。

連接滯留 (Connection Staleness):長連接長時間處于空閑狀態(tài)后,可能因為網(wǎng)絡設備(如防火墻、NAT網(wǎng)關)的超時策略或服務器端的意外重啟而變得無效或“死亡”,但客戶端連接池對此并不知情。當客戶端嘗試復用這些失效連接時,會導致請求失敗,影響應用的可用性。

資源消耗 (Resource Consumption):每個長連接都會持續(xù)占用客戶端和服務器端的內(nèi)存、文件描述符等系統(tǒng)資源。如果連接池維護了大量不活躍的長連接,會造成不必要的資源浪費。

連接數(shù)限制 (Connection Limits):服務器通常對單個客戶端或總體的并發(fā)連接數(shù)設有上限。大量長連接,尤其是在多客戶端場景下,可能迅速耗盡服務器的可用連接數(shù)配額,導致新的連接請求被拒絕。

維護和更新挑戰(zhàn) (Maintenance and Update Challenges):當需要對后端服務實例進行維護、更新或縮容時,長連接的存在會使這些操作變得復雜。例如,要下線一個服務實例,必須妥善處理其上已建立的長連接,否則可能導致服務中斷。如果強制斷開,客戶端需要有相應的重連和容錯機制。

210. 連接池的典型位置:調(diào)用方(客戶端)的實踐

連接池(Connection Pool)這一機制,通常部署在服務的調(diào)用方,也就是客戶端一側。其核心目的是管理客戶端與服務器之間的網(wǎng)絡連接,以提高通信效率和系統(tǒng)性能。

當一個應用程序(作為客戶端)需要頻繁地與另一個服務(如數(shù)據(jù)庫、遠程API服務)進行通信時,如果每次請求都重新建立TCP連接,并在請求結束后關閉連接,將會帶來顯著的開銷。這包括TCP三次握手建立連接的延遲和資源消耗,以及四次揮手關閉連接的過程。連接池通過預先創(chuàng)建并維護一定數(shù)量的連接,使得客戶端在需要發(fā)送請求時,可以直接從池中獲取一個已經(jīng)建立好的空閑連接,使用完畢后將其歸還給池中,而不是直接關閉。這樣避免了每次請求都建立和關閉連接的開銷,提高了連接的復用率,顯著減少了請求延遲,提升了應用的整體性能和吞吐量。

例如,一個Web應用在訪問數(shù)據(jù)庫時,會在Web應用內(nèi)部(調(diào)用方)維護一個數(shù)據(jù)庫連接池。同樣,一個微服務A在調(diào)用微服務B時,微服務A(調(diào)用方)可以針對到微服務B的HTTP請求維護一個HTTP連接池。

211. Java 中通過代碼精確控制 GC 行為:觸發(fā)特定次數(shù)的 Young GC 與 Full GC

要在 Java 程序中精確地觸發(fā)特定序列的垃圾回收(例如,兩次 Young GC,然后一次 Full GC,接著再兩次 Young GC),需要精心配置 JVM 參數(shù)并結合特定的對象分配和釋放策略。直接且穩(wěn)定地控制 GC 的確切發(fā)生時機是困難的,因為 GC 的行為受到多種因素影響,但可以通過以下方法盡可能地接近目標。

首先,配置合適的 JVM 啟動參數(shù)至關重要。例如,通過 -Xms(初始堆大?。┖?-Xmx(最大堆大?。┰O置一個固定的堆內(nèi)存,通過 -Xmn 設置一個相對較小的新生代大小,以便更容易填滿并觸發(fā) Young GC。使用 -XX:+PrintGCDet 可以觀察 GC 的詳細日志,幫助驗證 GC行為。為了更可控,可以指定使用 (串行收集器),它的行為相對簡單和可預測。

剩余60%內(nèi)容,訂閱專欄后可繼續(xù)查看/也可單篇購買

曾獲多國內(nèi)大廠的 ssp 秋招 offer,且是Java5年的沉淀老兵(不是)。專注后端高頻面試與八股知識點,內(nèi)容系統(tǒng)詳實,覆蓋約 30 萬字面試真題解析、近 400 個熱點問題(包含大量場景題),60 萬字后端核心知識(含計網(wǎng)、操作系統(tǒng)、數(shù)據(jù)庫、性能調(diào)優(yōu)等)。同時提供簡歷優(yōu)化、HR 問題應對、自我介紹等通用能力。考慮到歷史格式混亂、質(zhì)量較低、也在本地積累了大量資料,故準備從頭重構專欄全部內(nèi)容

全部評論

相關推薦

評論
1
收藏
分享

創(chuàng)作者周榜

更多
??途W(wǎng)
牛客企業(yè)服務