信也科技一面涼經

1.在項目經歷里挑一個詳細介紹一下 項目的應用場景?

2.項目里用到多線程是怎么用的?回答:線程池?

用通過?ThreadPoolExecutor?構造函數的方式創建的線程池

3.線程池有哪些重要參數?回答:核心線程數、最大線程數、阻塞隊列類型、拋出策略還有線程池類型。

線程池的核心線程數、最大線程數,當線程數大于核心線程數時多余的線程存活的時間,任務隊列,拒絕策略。

4.線程池類型有哪些?回答:有固定一個線程的還有按照參數指定線程數的,還有按時執行任務的。

基于ThreadPoolExecutor共有四種類型線程池

FixedThreadPool:固定數量線程池

SingleThreadExecutor:單線程線程池

CachedThreadPool:緩存線程池(是一種大小可變的線程池,線程數量根據任務的數量自動調整。)

ScheduledThreadPoolExecutor:調度線程池(周期性地執行任務,或者在指定的時間執行任務。)

一般不建議采用Excutors類創建上述線程池,而是建議大家使用構造函數去創建線程池,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險

(1)FixedThreadPoolSingleThreadExecutor:使用的是無界阻塞隊列,任務隊列最大長度為 Integer.MAX_VALUE,可能堆積大量的請求,從而導致 OOM。

(2)CachedThreadPool:使用的是同步隊列,允許創建的線程數量為?Integer.MAX_VALUE?,如果任務數量過多且執行速度較慢,可能會創建大量的線程,從而導致 OOM。

(3)ScheduledThreadPoolSingleThreadScheduledExecutor : 使用的無界的延遲阻塞隊列DelayedWorkQueue,任務隊列最大長度為 Integer.MAX_VALUE,可能堆積大量的請求,從而導致 OOM。

  • 容量為 Integer.MAX_VALUELinkedBlockingQueue(無界隊列):FixedThreadPoolSingleThreadExector 。由于隊列永遠不會被放滿,因此FixedThreadPool最多只能創建核心線程數的線程。
  • SynchronousQueue(同步隊列):CachedThreadPoolSynchronousQueue 沒有容量,不存儲元素,目的是保證對于提交的任務,如果有空閑線程,則使用空閑線程來處理;否則新建一個線程來處理任務。也就是說,CachedThreadPool 的最大線程數是 Integer.MAX_VALUE ,可以理解為線程數是可以無限擴展的,可能會創建大量線程,從而導致 OOM。
  • DelayedWorkQueue(延遲阻塞隊列):ScheduledThreadPoolSingleThreadScheduledExecutorDelayedWorkQueue 的內部元素并不是按照放入的時間排序,而是會按照延遲的時間長短對任務進行排序,內部采用的是“堆”的數據結構,可以保證每次出隊的任務都是當前隊列中執行時間最靠前的。DelayedWorkQueue 添加元素滿了之后會自動擴容原來容量的 1/2,即永遠不會阻塞,最大擴容可達 Integer.MAX_VALUE,所以最多只能創建核心線程數的線程。

5.實際工作中參數怎么選擇呢?比如核心線程數?回答:核心線程數和cpu個數有關,一般是2n+1個

這是固定的?不是固定的,要看任務是主要使用cpu的還是占用cpu比較少的。

如果我們設置的線程池數量太小的話,如果同一時間有大量任務/請求需要處理,可能會導致大量的請求/任務在任務隊列中排隊等待執行,甚至會出現任務隊列滿了之后任務/請求無法處理的情況,或者大量任務堆積在任務隊列導致 OOM。這樣很明顯是有問題的,CPU 根本沒有得到充分利用。

如果我們設置線程數量太大,大量線程可能會同時在爭取 CPU 資源,這樣會導致大量的上下文切換,從而增加線程的執行時間,影響了整體執行效率。

假設機器有N個CPU,那么對于計算密集型的任務(壓縮、解壓縮、加密、解密、科學計算等),應該設置線程數為N+1;對于IO密集型的任務(MySQL 數據庫、文件的讀寫、網絡通信),應該設置線程數為2N;對于同時有計算工作和IO工作的任務,應該考慮使用兩個線程池,一個處理計算任務,一個處理IO任務,分別對兩個線程池按照計算密集型和IO密集型來設置線程數。

最佳線程數 = N(CPU 核心數)?(1+WT(線程等待時間)/ST(線程計算時間)),其中?WT(線程等待時間)=線程運行總時間 - ST(線程計算時間),WT/ST可以通過VisualVM 來查看。

綜合來看,我們可以根據自己的業務場景,從“N+1”和“2N”兩個公式中選出一個適合的,計算出一個大概的線程數量,之后通過實際壓測,逐漸往“增大線程數量”和“減小線程數量”這兩個方向調整,然后觀察整體的處理時間變化,最終確定一個具體的線程數量。

6.多線程會帶來一些并發問題,一般用鎖來處理。樂觀鎖和悲觀鎖你了解嗎都是什么概念?應用于什么場景

悲觀鎖總是假設最壞的情況,認為共享資源每次被訪問的時候就會出現問題(比如共享數據被修改),所以每次在獲取資源操作的時候都會上鎖,這樣其他線程想拿到這個資源就會阻塞直到鎖被上一個持有者釋放。也就是說,共享資源每次只給一個線程使用,其它線程阻塞,用完后再把資源轉讓給其它線程。常見的悲觀鎖有java的synchronized、ReentrantLock等獨占鎖。悲觀鎖通常用于寫比較多的情況,可以避免頻繁失敗和重試影響性能,開銷是固定的。

樂觀鎖總是假設最好的情況,認為共享資源每次被訪問的時候不會出現問題,線程可以不停地執行,無需加鎖也無需等待,只是在提交修改的時候去驗證對應的資源(也就是數據)是否被其它線程修改了(具體方法可以使用版本號機制或 CAS 算法)。JUC包下的原子變量類,比如AtomicInteger、LongAdder就是使用了樂觀鎖的一種實現方式CAS實現的。樂觀鎖通常用于寫比較少的情況,比如多讀場景,競爭比較少,可以避免頻繁加鎖影響性能。不過樂觀鎖主要針對的對象是單個共享變量。

從 JDK 1.5 開始,提供了AtomicReference類來保證引用對象之間的原子性,你可以把多個變量放在一個對象里來進行 CAS 操作.所以我們可以使用鎖或者利用AtomicReference類把多個共享變量合并成一個共享變量來操作。

7.你用過的鎖有哪些,sychronized鎖升級的流程

8.看你的簡歷有一個oom的排查和一個循環依賴的排查,能詳細講講嗎(這里講的不好,再深入一下)

日志顯示OOM,是一個堆內存的泄漏 OutOfMemoryError: Java heap space

查看dump文件,默認存儲在啟動該jar的用戶根目錄下,用MemoryAnalyzer對dump文件進行分析,發現占用內存異常的是一個map,定位到DistributedFileSystem,以此為關鍵字在項目里排查。

定位到代碼中發現是之前為解決“兩個HDFS集群namespace同名時會造成兩個集群讀取到同一套文件系統”的問題,由調用get(hadoopConfig)方法換為調用newInstance方法新建實例。但是該方法中會一直往一個靜態的cache的map里放值,在定時多次調用的情況下,map一直不會被回收但是內部一直在添加新值造成OOM。后續解決方法是將FileSystem保存到map緩存里,FileSystem是通過集群名和集群配置生成的,如果map緩存中存在該實例就從緩存中讀取,不存在才新增。

FileSystem是根據集群名和配置生成的,之前的get方法只用配置拿,因此同名的集群區分不了。

9.你項目哪里用到了redis 怎么用的(這里因為沒問過也沒深入下去,接下來把redis加入到項目里)

10.項目主要用mysql,處理過海量數據嗎 有哪些優化手段?一般對哪些字段建索引,索引的個數為什么不是越多越好?

哪些情況需要創建索引:(1)主鍵會自動建立唯一索引 (2)頻繁作為查詢條件的字段需要建立索引,在where語句用到的字段加索引 (3)查詢與其他表關聯的字段,會在on的外鍵關系上建立索引 (4)多字段查詢可以創建組合索引 (5)有序字段適合創建索引 (6)查詢中統計或者分組字段(有區分度的字段,可能會拿來做分組的字段)

不適合加索引的地方:(1)頻繁更新的字段不適合創建索引。更新字段的過程中,需要維護B+樹結構,會頻繁更新索引文件,降低SQL性能。(2)過長的字段不適合創建索引。(占用空間多)(3)無序的字段不適合創建索引。

優先使用聯合索引,聯合索引時將高區分度的字段放到前面。

創建過多的索引,會占用更多存儲空間,另外也會嚴重影響SQL性能,每次更刪改查SQL都需要更新大量索引文件。

11.看簡歷寫到過設計模式,你熟悉哪些設計模式? 回答了建造者、簡單工廠。

了解代理模式嗎?哪里用過代理模式

12.hashmap結構

13.怎么判斷能獲取到的mysql鎖是表級鎖還是行級鎖?

14.平時使用update select這些語句什么情況下會上鎖,會上哪種鎖

一些非技術相關提問:

1.過去開發時候 產品 測試 前端這些都有吧 介紹一下大概多少人 都有哪些角色參與生產

提問:組里的人員構成和架構?組里主要做什么 信貸平臺的底層平臺 做一些支付或者用戶權限的認證 十個人 每兩三個一組。初中高級比例大概怎么樣?一比一

2.如果已經開發要完成了,產品提出加需求怎么辦

3.今天面試我很多地方深入的了解都不夠,你比較看中求職者哪些方面技術能力。比如redis這種我沒有實際沒有應用的,但是自己也看了一下,但沒有實際經驗面試官也不接著問下去了,比如這種知識我怎么準備呢

這還是每個面試官有不同的側重點,從我的角度我更看重對你用過的技術的考察,如果工作三到四年沒用過redis就不正常,但是你經驗一年可以理解,但是目前大多數面試的十個人里面只有一兩個沒用過,所以還是建議多一些實際使用的經驗。

總結:

1.多線程、mysql調優這些用過的但是不深入的東西需要重點學習!

2.redis看完基礎教程以后加入到項目里,不要讓他成為短板。

3.OOM和循環依賴那個的介紹要再熟悉深入一下。

4.leetcode還是要繼續刷。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/40435.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/40435.shtml
英文地址,請注明出處:http://en.pswp.cn/news/40435.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【愛書不愛輸的程序猿】公網訪問本地搭建的WEB服務器之詳細教程

歡迎來到愛書不愛輸的程序猿的博客, 本博客致力于知識分享,與更多的人進行學習交流 本地電腦搭建Web服務器并用cpolar發布至公網訪問 前言1. 首先將PHPStudy、WordPress、cpolar下載到電腦2. 安裝PHPStudy3. 安裝cpolar,進入Web-UI界面4.安裝wordpress5.…

KU Leuven TU Berlin 推出“RobBERT”,一款荷蘭索塔 BERT

荷蘭語是大約24萬人的第一語言,也是近5萬人的第二語言,是繼英語和德語之后第三大日耳曼語言。來自比利時魯汶大學和柏林工業大學的一組研究人員最近推出了基于荷蘭RoBERTa的語言模型RobBERT。 谷歌的BERT(來自Transformers的B idirectional …

C語言 常用工具型API --------system()

函數名: system() 用 法: int system(char *command); 原理: 創建一個子進程去加載一個新程序執行,而Linux命令基本都是一個單獨的進程實現的,所以你所掌握的Linux命令越多,該函數…

AUTOSAR規范與ECU軟件開發(實踐篇)4.2 基于Matlab/Simulink的軟件組件開發

目錄 前言 1 、Matlab/Simulink與AUTOSAR基本概念的對應關系 2 、軟件組件內部行為建模方法

由淺入深學習Tapable

文章目錄 由淺入深學習TapableTapable是什么Tapable的Hook分類同步和異步的 使用Sync*同步類型鉤子基本使用bailLoopWaterfall Async*異步類型鉤子ParallelSeries 由淺入深學習Tapable webpack有兩個非常重要的類:Compiler和Compilation。他們通過注入插件的方式&a…

CentOS系統環境搭建(一)——Centos7更新

Centos7更新 更新 yum(包括centos內核) yum update執行后,系統將更新到centos 7.9。 從這一篇文章開始開始,我將開始在centos系統環境搭建🔗https://blog.csdn.net/weixin_43982359/category_12411496.html中開始對C…

【數據分析入門】Numpy進階

目錄 一、數據重塑1.1 透視1.2 透視表1.3 堆棧/反堆棧1.3 融合 二、迭代三、高級索引3.1 基礎選擇3.2 通過isin選擇3.3 通過Where選擇3.4 通過Query選擇3.5 設置/取消索引3.6 重置索引3.6.1 前向填充3.6.2 后向填充 3.7 多重索引 四、重復數據五、數據分組5.1 聚合5.2 轉換 六、…

回溯算法詳解

目錄 回溯算法詳解 回溯VS遞歸 回溯算法的實現過程 n個結點構造多本節要討論的是當給定 n(n>0)個結點時,可以構建多少種形態不同的樹。 回溯算法詳解 回溯算法,又稱為“試探法”。解決問題時,每進行一步&#…

主成分分析Python代碼

對于主成分分析詳細的介紹:主成分分析(PCA)原理詳解https://blog.csdn.net/zhongkelee/article/details/44064401 import numpy as np import pandas as pd標準PCA算法 def standeredPCA(data,N): #data:…

【golang】鏈表(List)

List實現了一個雙向鏈表,而Element則代表了鏈表中元素的結構。 可以把自己生成的Element類型值傳給鏈表嗎? 首先來看List的四種方法。 MoveBefore方法和MoveAfter方法,它們分別用于把給定的元素移動到另一個元素的前面和后面。 MoveToFro…

十種排序算法(附動圖)

排序算法 一、基本介紹 ? 排序算法比較基礎,但是設計到很多計算機科學的想法,如下: ? 1、比較和非比較的策略 ? 2、迭代和遞歸的實現 ? 3、分而治之思想 ? 4、最佳、最差、平均情況時間復雜度分析 ? 5、隨機算法 二、排序算法的分類 …

RabbitMq-1基礎概念

RabbitMq-----分布式中的一種通信手段 1. MQ的基本概念(message queue,消息隊列) mq:消息隊列,存儲消息的中間件 分布式系統通信的兩種方式:直接遠程調用,借助第三方完成間接通信 消息的發送方是生產者&#xff0c…

面試熱題(二叉樹的鋸齒形層次遍歷)

給你二叉樹的根節點 root ,返回其節點值的 鋸齒形層序遍歷 。(即先從左往右,再從右往左進行下一層遍歷,以此類推,層與層之間交替進行) 輸入:root [3,9,20,null,null,15,7] 輸出:[[3…

MySQL數據庫-字符串函數詳解

前言 MySQL數據庫提供了多種不同類型的函數,用于處理字符串、日期、數值等數據類型,以及實現條件、聚合等操作,下面我們主要介紹字符串函數 CONCAT() 函數 CONCAT() 可用于將多個字符串連接在一起。 示例: SELECT CONCAT(Hell…

C++ STL stack queue

目錄 一.stack 介紹 二.stack 使用 三.stack 模擬實現 普通版本: 適配器版本: 四.queue的介紹 五. queue使用 六.queue模擬實現 七.deque介紹 1.容器適配器 2.deque的簡單介紹 3.deque的缺陷 4.為什么選擇deque作為stack和queue的底層默認容…

System.Text.Encoding不同字符編碼之間進行轉換

System.Text.Encoding 是 C# 中用于處理字符編碼和字符串與字節之間轉換的類。它提供了各種靜態方法和屬性,用于在不同字符編碼之間進行轉換,以及將字符串轉換為字節數組或反之。 在處理多語言文本、文件、網絡通信以及其他字符數據的場景中&#xff0c…

Spring Boot 獲取前端參數

Spring Boot 獲取前端參數 在開發 Web 應用程序時,前端參數是非常重要的。Spring Boot 提供了多種方法來獲取前端參數,本文將介紹其中的一些常用方法。 1. 使用 RequestParam 注解 RequestParam 注解是 Spring MVC 提供的一種常用方式,用于…

C++ 函數

函數是一組一起執行一個任務的語句。每個 C 程序都至少有一個函數,即主函數 main() ,所有簡單的程序都可以定義其他額外的函數。 您可以把代碼劃分到不同的函數中。如何劃分代碼到不同的函數中是由您來決定的,但在邏輯上,劃分通常…

pycharm調整最大堆發揮最大

python程序運行時,怎么提高效率,設置pycharm最大堆過程如下; 一、進入設置pycharm最大堆; 二、進入設置pycharm最大堆; 如果8g設置為6g左右,占75%左右最佳

5個實用的 Vue 技巧

在這篇文章中,我們將探討五個實用的 Vue 技巧,這些技巧可以使你日常使用 Vue 編程更高效、更富有成效。無論你是Vue的初學者還是經驗豐富的開發者,這些技巧都能幫助你編寫更清晰、更簡潔、更有效的代碼。那么,讓我們開始吧。 1. …