主頁 > 資料庫 > 面試官:說一下你們線上JVM是如何優化的?一不小心聊了2個小時!!

面試官:說一下你們線上JVM是如何優化的?一不小心聊了2個小時!!

2020-09-23 18:05:23 資料庫

面試官:說一下你們線上JVM是如何優化的?一不小心聊了2個小時!!

說一JVM的記憶體模型是什么樣子的?什么時候物件可以被識訓?常見的垃圾回收器演算法有哪些,各有什么優劣?什么時候物件會進入老年代?什么是空間分配擔保策略?如何優化減少Full
GC?

面對這一大波JVM面試題,你真的Hold住嗎?

這里把重要的知識點都寫出來了,不管是核心知識點也好還是面試題也好,讓大家對知識框架有個基本輪廓
同時也整理了283頁的PDF檔案,也是Java的核心知識點,
需要的朋友可以,點擊這里領取!!!,暗號是:CSDN

在這里插入圖片描述

JVM的記憶體模型是什么樣子的?

JVM記憶體模型可以大致可劃分為執行緒私有區域和共享區域,執行緒私有區域由虛擬機堆疊、本地方法堆疊、程式計數器組成,而共享區域由堆、元資料空間(方法區)組成,在這里插入圖片描述

再有人問你JVM的記憶體模型就回想下上面的圖,但是知道JVM的記憶體模型的樣子還是不行的,還要知道他們分別干什么的,

虛擬機堆疊/本地方法堆疊

當你碰到過StackOverflowException這個例外的時候,有沒有思考下為什么會出現這樣的例外呢?答案就在虛擬機堆疊中,JVM會為每個方法生成堆疊幀然后將堆疊幀壓入虛擬機堆疊中,

舉個粟子:假設JVM引數-Xss設定為1m,如果某個方法里面創建一個128kb的陣列,那這個方法在同一個執行緒中只能遞回4次,再遞回第五次的時候就會報StackOverflowException例外,因為虛擬機堆疊的大小只有1m,每次遞回都需要為方法在虛擬機堆疊中分配128kb的空間,很顯示到第五次的時候就空間不足了,
在這里插入圖片描述

程式計數器

程式計數器是一個記錄著當前執行緒所執行的位元組碼的行號指示器,JVM的多執行緒是通過CPU時間片輪轉(即執行緒輪流切換并分配處理器執行時間)演算法來實作的,也就是說,某個執行緒在執行程序中可能會因為時間片耗盡而被掛起,而另一個執行緒獲取到時間片開始執行,

簡單的說程式計數器的主要功能就是記錄著當前執行緒所執行的位元組碼的行號指示器,

方法區(元資料區)

方法區存盤了類的元資料資訊、靜態變數、常量等資料,
在這里插入圖片描述

堆(heap)

平常大家使用new關鍵字創建的物件都會進入堆中,堆也是GC重點照顧的區域,堆會被劃分為:新生代、老年代,而新生代還會被進一步劃分為Eden區和Survivor區:
在這里插入圖片描述

新生代中的Eden區和Survivor區,是根據JVM回收演算法來的,只是現在大部分都是使用的分代回收演算法,所以在介紹堆的時候會直接將新生代歸納為Eden區和Survivor區,

小結

JVM記憶體模型小結:

JVM記憶體模型劃分為執行緒私有區域和共享區域虛擬機堆疊/本地方法堆疊負責存放執行緒執行方法堆疊幀程式計數器用于記錄執行緒執行指令的位置方法區(元資料區)存盤類的元資料資訊、靜態變數、常量等資料堆(heap)使用new關鍵字創建的物件都會進入堆中,堆被劃分為新生代和老年代

什么時候物件可以被識訓?

JVM判斷物件回收有兩種方式:參考記數、GC Roots,參考記數比較簡單,JVM為每個物件維護一個參考計數,假設A物件參考計數為零說明沒有任務物件參考A物件,那A物件就可以被回收了,但是參考計數有個缺點就是無法解決回圈參考的問題,

GC Roots通過一系列的名為GC Roots的物件作為起始點,從這些節點開始向下搜索,搜索過的路徑稱為參考鏈,當一個物件到GC Roots沒有任何參考鏈相連時,則證明物件是不可用的,

在Java中,可以作為GC Roots的物件包括下面幾種:

虛擬機堆疊中參考的物件;方法區中類靜態屬性參考的物件;方法區中的常量參考的物件;本地方法堆疊中JNI(即一般說的Native方法)的參考的物件;

小結

總的來說就是當一個物件通過GC Roots搜索不到時,說明物件可以被回收了,但什么時候回識訓要看GC的心情!

常見的垃圾回收器演算法有哪些,各有什么優劣?

標記清除

這種演算法分兩分:標記、清除兩個階段,
標記階段是從根集合(GC Root)開始掃描,每到達一個物件就會標記該物件為存活狀態,清除階段在掃描完成之后將沒有標記的物件給清除掉,

用一張圖說明:
在這里插入圖片描述
這個演算法有個缺陷就是會產生記憶體碎片,如上圖B被清除掉后會留下一塊記憶體區域,如果后面需要分配大的物件就會導致沒有連續的記憶體可供使用,

標記整理

標記整理就沒有記憶體碎片的問題了,也是從根集合(GC Root)開始掃描進行標記然后清除無用的物件,清除完成后它會整理記憶體,
在這里插入圖片描述
這樣記憶體就是連續的了,但是產生的另外一個問題是:每次都得移動物件,因此成本很高,

復制演算法

復制演算法會將JVM推分成二等分,如果堆設定的是1g,那使用復制演算法的時候堆就會有被劃分為兩塊區域各512m,給物件分配記憶體的時候總是使用其中的一塊來分配,分配滿了以后,GC就會進行標記,然后將存活的物件移動到另外一塊空白的區域,然后清除掉所有沒有存活的物件,這樣重復的處理,始終就會有一塊空白的區域沒有被合理的利用到,
在這里插入圖片描述
兩塊區域交替使用,最大問題就是會導致空間的浪費,現在堆記憶體的使用率只有50%,

小結

JVM回收演算法小結:

標記清除速度快,但是會產生記憶體碎片;標記整理解決了標記清除記憶體碎片的問題,但是每次都得移動物件,因此成本很高;復制演算法沒有記憶體碎片也不需要移動物件,但是導致空間的浪費;

什么時候物件會進入老年代?

新創建出來的物件一開始都會停留在新生代中,但隨著JVM的運行,有些存活的長的物件會慢慢的移動到老年代中,

根據物件年齡

JVM會給物件增加一個年齡(age)的計數器,物件每“熬過”一次GC,年齡就要+1,待物件到達設定的閾值(默認為15歲)就會被移移動到老年代,可通過-XX:MaxTenuringThreshold調整這個閾值,
在這里插入圖片描述
一次Minor GC后,物件年齡就會+1,達到閾值的物件就移動到老年代,其他存活下來的物件會繼續保留在新生代中,

動態年齡判斷

根據物件年齡有另外一個策略也會讓物件進入老年代,不用等待15次GC之后進入老年代,他的大致規則就是,假如當前放物件的Survivor,一批物件的總大小大于這塊Survivor記憶體的50%,那么大于這批物件年齡的物件,就可以直接進入老年代了,

在這里插入圖片描述
如圖上的A、B、D、E這四個物件,假如Survivor 2是100m,如果A + B + D的記憶體大小超過50m,現在D的年齡是10,那E都會被移動到老年代,實際上這個計算邏輯是這樣的:年齡1 + 年齡2 + 年齡n的多個物件總和超過Survivor區的50%,那就會把年齡n以上的物件都放入老年代,

大物件直接進入老年代

如果設定了-XX:PretenureSizeThreshold這個引數,那么如果你要創建的物件大于這個引數的值,比如分配一個超大的位元組陣列,此時就直接把這個大物件放入到老年代,不會經過新生代,

這么做就可以避免大物件在新生代,屢次躲過GC,還得把他們來復制來復制去的,最后才進入老年代,這么大的物件來回復制,是很耗費時間的,

什么是空間分配擔保策略?

JVM在發生Minor GC之前,虛擬機會檢查老年代最大可用的連續空間是否大于新生代所有物件的總空間,如果大于,則此次Minor GC是安全的如果小于,則虛擬機會查看HandlePromotionFailure設定項的值是否允許擔保失敗,如果HandlePromotionFailure=true,那么會繼續檢查老年代最大可用連續空間是否大于歷次晉升到老年代的物件的平均大小,如果大于則嘗試進行一次Minor GC,但這次Minor GC依然是有風險的;如果小于或者HandlePromotionFailure=false,則改為進行一次Full GC,

在這里插入圖片描述

如何優化減少Full GC?

將前面的一些問題總結下來,然后應用到線上,那JVM應該如何優化減少Full GC呢?以標準的4核8G機器為例說明,首先系統預留4G,其他4G按如下規則分配 :
?堆記憶體:3g新生代:1.5g
?新生代Eden區:1228m
?新生代Survivor區:153m
?方法區:256m
?虛擬機堆疊:1m/thread

設定引數如下:

 
-Xms3072m
-Xmx3072m
-Xmn1536m
-Xss=1m
-XX:PermSize=256m
-XX:MaxPermSize=256m
-XX:HandlePromotionFailure
-XX:SurvivorRatio=8
 

在這里插入圖片描述
估算系統每秒占用記憶體數量

在優化JVM之前,要先估算要系統每秒占用的記憶體數量,如有個榷訓百萬的商場系統,每日下單量在20w左右,按照一天8個小時算,那訂單服務的每秒大概會有500個請求,然后粗略的估算下每個請求占用多少記憶體,計算出每秒要花費多少記憶體,

假設是每秒500個請求,每個請求需要分配100k的空間,那1秒需要分配大約50m的記憶體,

計算下多長時間觸發一次Minor GC

按照之前的估算1秒需要分配大約50m的記憶體的話,Eden區的空間是1228m那平均每25秒就要執行一次Minor GC,

檢查下Survivor區是否足夠

按照上面的模型,每25秒就要執行一次Minor GC,GC執行期間并不能回收掉所有的新生代中的物件,那每秒50m那每次GC執行期間還會剩下大約100m無法回收的物件會進入Survivor區,但是別忘記JVM有動態年齡判斷機制,這樣設定下來Survivor的空間明顯小了一點,所以將新生代設定2048m,才能避免觸發動態年齡判斷:

-Xms3072m
-Xmx3072m
-Xmn2048m
...

大物件直接進入老年代

大物件一般是長期存活和使用的物件,一般來說設定1M的物件直接進入老年代,這樣避免大物件一直處于新生代中來回復制,所以加上PretenureSizeThreshold=1m引數,

 
...
-XX:PretenureSizeThreshold=1m
...

合理設定物件年齡閾值

Minor GC后默認躲過15次垃圾回收后自動升入老年代,按照我們的評估25秒觸發一次Minor GC,如果按照MaxTenuringThreshold引數的默認值,躲過15次GC后,應該是6分鐘之后的事了,結合當前業務場景這里可以降低一點,讓那些本應該進入老年代的物件,盡快的進入老年代,避免復制成本和浪費新生代空間,從而導致新生代Survivor空間不足,引發Full GC,

...
-XX:MaxTenuringThreshold=6
...
 

總結

以上所述是給大家介紹的大廠面試經:說一下你們線上JVM是如何優化的,希望對大家有所幫助

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/113473.html

標籤:其他

上一篇:Oracle 資料排名問題

下一篇:花了14天做了一張spring腦圖,所有spring知識點都匯總了!2020最新Spring全家桶高頻面試題

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more