八股戰神-JVM知識速查

1.JVM組成

JVM由那些部分組成,運行流程是什么?

JVM是Java程序的運行環境

組成部分:

類加載器:加載字節碼文件到內存

運行時數據區:包括方法區,堆,棧,程序計數器,本地方法棧

執行引擎:執行字節碼,優化代碼

垃圾回收器:管理堆內存

運行流程:

加載字節碼,準備運行環境,執行字節碼,垃圾回收,程序結束

什么是程序計數器

用于記錄每個線程正在執行的字節碼指令的地址,用于保存字節碼行號。當一個線程執行一段字節碼到某個位置時,CUP使用權被另一個線程奪走,當前執行的地址會記錄下來,當執行權回到當前線程時,會接著上次記錄的位置繼續執行

介紹Java堆

堆是一個線程共享的區域,主要用于保存對象實例,數組等,堆中內存不夠會拋出OOM異常

堆區分為年輕代和老年代,年輕代被化為三部分,一個Eden區和兩個S區,一個對象創建后會先到Eden區,如果對象被垃圾回收后還能存活就移動到S0或S1,再經過幾次垃圾回收后還能存活則移動到老年代區中,老年代中存的是生命周期比較長的對象,

JDK1.7和1.8堆的區別

1.7中有一個永久代,存類信息,靜態變量,常量,編譯后代碼,1.8移除了永久代,將數據存到本地內存中的元空間區,防止內存溢出

什么是虛擬機棧

每個線程運行時所需要的內存稱為虛擬機棧,是一個先進后出結構,每個棧由多個棧幀組成,每個對應著每次方法調用時所占用的內存和數據,每個線程只能有一個活動棧幀,對應了當前正在執行的方法

垃圾回收是否設計棧內存

垃圾回收主要指堆內存,當棧幀彈棧以后,內存就會釋放

棧內存分配越大越好嗎

未必,默認的棧內存通常為1024k,棧幀過大會導致線程數減少

方法內的局部變量是否線程安全

如果方法內局部變量沒有逃離方法的作用范圍,那就是線程安全的,變量的創建和銷毀都是在當前線程的虛擬機棧中完成的

如果局部變量引用了其他對象并逃離的方法的作用范圍,那就要考慮線程安全

棧內存溢出情況

棧幀過多導致內存溢出,如遞歸調用

棧幀過大導致內存溢出

堆和棧的區別

棧內存一般用來存儲局部變量和方法調用,堆用來存儲Java對象和數組,堆會用垃圾回收,棧不會

棧內存時線程私有的,堆內存是線程共享的

異常錯誤不同,內存不足時,棧報StackOverFlow,堆報OutOfMemory

解釋方法區

方法區主要存類的信息,運行時常量池,是各個線程共享的內存區域,在虛擬機啟動時創建,虛擬機關閉時銷毀

方法區在JDK 1.7時在堆區的永久代中,JDK1.8后取消了永久代,單獨存在元空間中,避免了在堆區的OOM

解釋一下運行時常量池

常量池可以看作一張表,虛擬機指令可以根據這張表找到要執行的類名,方法名,參數類型等信息

當類被加載時,常量池的信息就會放入運行時常量池,并把符號地址轉為真實地址

直接內存

不屬于JVM的內存結構,是虛擬機的系統內存,常見于NIO操作,用于數據緩沖區,直接內存相當于一塊操作系統和Java代碼都可以訪問到的共享區域,比如我們在文件IO操作中,使用傳統的BIO,需要調用操作系統的文件API,涉及到CPU用戶態和內核態的切換,資源開銷很大,引入直接內存之后,可以通過直接內存建立起系統內存和Java內存的交互傳輸

?

2.類加載器

什么是類加載器

類加載器的作用是將字節碼文件加載到JVM中,從而使Java程序能夠運行起來

類加載器有哪些:

啟動類加載器,擴展類加載器,應用類加載器(用戶自己編寫的Java類),自定義類加載器

?

什么是雙親委派機制

加載一個類,先委托上一級的加載器進行加載,如果上級加載器也有上級,則繼續向上委托,如果委托上級都沒有加載,則子加載器嘗試加載該類

JVM為什么采用雙親委派機制

可以避免一個類被重復加載,當父類加載后則無需重復加載,保證唯一性

為了安全,保證類庫API不會被修改

類裝載的執行過程

加載:根據類的全名獲取類的字節碼文件,將其轉換為方法區內的運行時數據結構

驗證:對字節碼進行校驗,確保符合JVM規范

準備:為類的靜態變量分配內存,設置默認初始值

靜態變量是final修飾的基本類型或字符串常量,賦值在準備階段完成

靜態變量是final修飾的引用類型,復制也初始化階段完成

解析:將符號引用轉為直接引用,即將類,方法,字段等解析為內存地址

初始化:執行類的初始化代碼,包括靜態變量賦值和靜態代碼塊的執行

使用:JVM開始從入口方法執行用戶的程序代碼,如調用靜態類的成員信息,使用new關鍵字創建對象實例

卸載:當用戶程序代碼執行完畢后,JVM開始銷毀創建的Class對象

3.垃圾回收

簡述垃圾回收機制

在Java語言中,有自動的垃圾回收機制,開發者只需要關注內存的申請,內存的釋放由系統自動識別完成,不同的對象引用會有不同的回收機制

?

對象什么時候可以被垃圾回收器回收

如果一個對象或多個對象沒有任何引用指向它了,那么這個對象現在就是垃圾,就有可能被GC回收

垃圾定位方法

引用計數法:一個對象被引用一次,則在當前對象頭上遞增一次引用次數,如果引用次數為0,則代表該對象可回收,如果出現循環引用的畫計數法就會失效

可達性分析算法:會存在一個根節點,其引用指向下一個節點,依次向下類推,直到所有節點遍歷完畢

判斷如果某對象和根對象無直接或間接引用則可以被垃圾回收

?

JVM垃圾回收算法

標記清除算法:分標記和清除兩個階段,根據可達性算法通過GCRoot得出垃圾并進行標記,對這些標記為可回收的內容進行垃圾回收,效率高,有磁盤碎片,內存不連續

標記整理算法:標記清除的過程一樣,但是會將清理后存活的對象都向內存的一端移動,然后清理邊界之外的垃圾,無內存碎片,對象需要移動,效率低

復制算法:將原有的空間一分為二,每次只用其中一塊,垃圾回收時,將正在使用的對象復制到另一塊內存空間中,然后將當前空間清空,交換兩塊內存的角色,完成垃圾回收,無碎片,內存使用率低

?

JVM的分代回收

堆被分成兩份,新生代和老年代(比例為1:2),對于新生代內部又分Eden區,兩個幸存區:From,to

新創建的對象首先被分到Eden區,當Eden區內存不足時,標記Eden區和From區的存活對象并將其復制到to區中,復制完成后,Eden和from中的內存被釋放,經過一段時間Eden區內存又不足,標記Eden和to區存活的對象,將存活的對象復制到from區,當幸存區對象熬過幾次回收就會晉升到老年代

MinorGC、 Mixed GC 、 FullGC的區別是什么

MinorGC發生在新生代的垃圾回收,暫停時間短

MixedGC發生在新生代和部分老年代區域的垃圾回收。G1收集器持有

FullGC發生在新生代和老年代的完整垃圾回收,暫停時間長,應盡量避免

?

JVM有哪些垃圾回收器

串行垃圾回收器:垃圾回收時,只有一個線程在工作,其他線程都要阻塞等待垃圾回收完成。Serial作用于新生代,采用復制算法,Serial作用于老年代,采用標記整理算法

并行垃圾回收器:多個線程完成垃圾回收工作,其他線程同樣阻塞,Parallel New用于新生代,采用復制算法,Parallel Old作用老年代,采用標記整理算法

CMS(并發)垃圾回收器:針對老年代進行垃圾回收,不會造成線程阻塞,會追蹤標記整個GCRoot,將其直接關聯和間接關聯的對象

G1垃圾回收器,作用于新生代和老年代

?

詳細聊一下G1垃圾回收器

用于新生代和老年代的垃圾回收,在JDK9后JVM默認用的G1垃圾回收,采用的回收算法是復制算法,分為三個階段

首先G1將內存劃分為多個區域,每個區域都可以充當Elen區,幸存者區。jumongous等

新生代回收:

初始時,所有區域處于空閑狀態,創建了一些對象,挑出一部分空閑區左Eden區存儲這些對象,當Eden區需要垃圾回收時,挑一個空閑區域做幸存區,用復制算法復制存活對象,需要暫停用戶線程,再往后,Eden區內存又不足了,將Eden區以及幸存區的存活對象復制到新的幸存區,將較老的對象晉升至老年代

并發標記:

當老年代占用內存超過閾值(默認45%)后,觸發并發標記,無需暫停用戶線程,并發標記后會沖標解決漏標問題(此時需要暫停線程),這些都完成后就知道了老年代有哪些存活對象,之后進入混合手機階段,此時不會堆老年代區域進行回收,而是根據暫停時間目標優先回收價值高的區域

混合收集:

復制完成,內存釋放,進入下一輪垃圾回收,如果對象非常大,會開出Jupmgous區存儲巨型對象

?

強引用,弱引用,軟引用,虛引用

強引用:只要所有的GCRoots能找到,就不會被回收

軟引用:需要配合SoftReference使用,當垃圾多次回收,內存依然不夠用時會回收軟引用對象

弱引用:需要配合WeakReference使用,只要進行垃圾回收,就會把弱引用回收

虛引用:必須配合引用隊列使用,被引用對象回收時,會將虛引用入隊,由Reference Handler線程調用虛引用相關方法釋放內存

?

4.JVM實踐

JVM調優參數設置

war包部署在tomcat中設置

jar包部署在啟動參數中設置

設置堆空間:-XMS(初始) -XMX(最大)

最大大小為默認物理內存的四分之一,初始大小時物理內存的六十四分之一

堆太小,會導致頻繁的年輕代和老年代和垃圾回收,產生stw,用戶線程阻塞,太大,可能會導致FullGC,會掃描整個堆空間,暫停用戶線程的時間長

虛擬機棧設置:-XSS 每個線程默認1M

新生代中Eden區和兩個幸存區的大小比例:默認8:1:1 -XXSus**=9 設置比例

年輕代晉升老年代的閾值: 默認為15,范圍0-15

設置垃圾回收期

?

JVM調優工具

命令:

jps:查看進程狀態信息

jstack:查看進程內線程堆棧信息

jmap:查詢堆棧信息

jhatL堆轉存快照工具

jstat:JVM統計監測工具

可視化工具:jconsole:JVM內存,線程,類監控 VisualVM:監控線程,內存情況

?

Java內存泄漏排查思路

使用jmap查詢堆棧信息,生成dump文件

通過VisualVM,加載dump文件分析堆棧信息定位到代碼排查

?

CPU跑到百分之百,解決思路是啥

通過top命令,定位到占用CPU高的線程

ps -T -p 進程ID找到進程中占比較高的線程

通過jstask查詢線程的堆棧信息去定位代碼

?

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

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

相關文章

Maven:在原了解基礎上對pom.xml文件進行詳細解讀

一、pom.xml文件 就像項目管理軟件 Make 的 MakeFile、Ant 的 build.xml 一樣,Maven 項目的核心是 pom.xml。POM( Project Object Model,項目對象模型 ) 定義了項目的基本信息,用于描述項目如何構建,聲明項目依賴,等等…

Spring Cloud項目登錄認證從JWT切換到Redis + UUID Token方案

背景介紹 在傳統的Spring Boot項目中,用戶登錄認證常見的方案是使用JWT(JSON Web Token)來實現無狀態的身份驗證。JWT憑借自包含用戶信息、方便前后端分離、性能較好等優勢被廣泛采用。 然而,在實際項目中,JWT也有一…

MongoDB 快速整合 SpringBoot 示例

1.添加依賴<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spr…

Flyweight(享元)設計模式 軟考 享元 和 代理屬于結構型設計模式

1.目的&#xff1a;運用共享技術有效地支持大量細粒度的對象 Flyweight&#xff08;享元&#xff09;設計模式 是一種結構型設計模式&#xff0c;它的核心目的是通過共享對象來減少內存消耗&#xff0c;特別是在需要大量相似對象的場景中。Flyweight 模式通過將對象的共享細節與…

002大模型-提示詞工程,少樣本提示,角色扮演,思維鏈

一、提示詞工程 二、少樣本提示 三、角色扮演 四、思維鏈

華為OD機試真題——傳遞悄悄話(二叉樹最長路徑問題)(2025A卷:200分)Java/python/JavaScript/C/C++/GO最佳實現

2025 A卷 200分 題型 本專欄內全部題目均提供Java、python、JavaScript、C、C++、GO六種語言的最佳實現方式; 并且每種語言均涵蓋詳細的問題分析、解題思路、代碼實現、代碼詳解、3個測試用例以及綜合分析; 本文收錄于專欄:《2025華為OD真題目錄+全流程解析+備考攻略+經驗分…

「讀書報告」Spark實時大數據分析

這本書是清華大學出版社2018年出版的&#xff0c;我是2020年讀的&#xff0c;說真的的&#xff0c;不怎么喜歡這本書&#xff0c;所以作者我都不想提。有的人可能會奇怪&#xff0c;ailx10&#xff0c;你一個搞網絡安全的&#xff0c;怎么會去讀大數據相關的書&#xff0c;哎&a…

2025 河北ICPC( D. 金泰園(二分)-- C.年少的誓約(公式轉化))

文章目錄 2025 河北ICPCD. 金泰園&#xff08;二分&#xff09;C.年少的誓約(公式轉化)總結 2025 河北ICPC 題目鏈接&#xff1a; Attachments - The 9th Hebei Collegiate Programming Contest - Codeforces sdccpc20250522 - Virtual Judge 賽時&#xff1a;5道 D. 金泰…

QT學習一

對于選擇qmake還是cmake&#xff0c;現在寫的暫時先用qmake 1.命名規范和快捷鍵 2.按鈕控件常用API //創建第一個按鈕QPushButton * btn new QPushButton;//讓btn對象 依賴在mywidget窗口中btn->setParent(this);//顯示文本btn->setText("第一個按鈕");//創建…

【Elasticsearch】給所索引創建多個別名

Elasticsearch 是可以給索引創建多個別名的。 為什么可以創建多個別名 1. 靈活性 - 別名可以為索引提供一個更易于理解的名稱&#xff0c;方便用戶根據不同的業務場景或用途來引用同一個索引。例如&#xff0c;一個索引可能同時服務于多個不同的應用程序或服務&#xff0c;通…

使用 OpenCV 實現哈哈鏡效果

在計算機視覺和圖像處理領域&#xff0c;OpenCV 提供了非常強大的圖像幾何變換能力&#xff0c;不僅可以用于糾正圖像&#xff0c;還能制造各種“有趣”的視覺效果。今天&#xff0c;我們就來實現一個經典的“哈哈鏡”效果&#xff0c;讓圖像像在游樂園里一樣被拉伸、壓縮、扭曲…

AI|Java開發 IntelliJ IDEA中接入本地部署的deepseek方法

目錄 連接本地部署的deepseek&#xff1a; IntelliJ IDEA中使用deepseek等AI&#xff1a; 用法一&#xff1a;讓AI寫代碼 用法二&#xff1a;選中這段代碼&#xff0c;右鍵&#xff0c;可以讓其解釋這段代碼的含義。這時顯示的解釋是英文的。 連接本地部署的deepseek&#…

如何使用兩塊硬盤作為 Ubuntu24 的系統盤,實現壞掉一塊不影響系統運行。

最近我想使用Ubuntu組一個NAS系統&#xff0c;想實現系統盤冗余&#xff0c;各位大佬可以給點建議嗎。 Deep Seek 為了實現兩塊硬盤作為 Ubuntu 24 系統盤的冗余配置&#xff08;RAID 1&#xff09;&#xff0c;確保一塊硬盤損壞時系統仍可運行&#xff0c;以下是詳細步驟&am…

【2025最新】虛擬機安裝macos,VMware在Windows11上安裝macOS 15完整圖文教程 - 新手也能輕松上手

引言 想體驗蘋果系統但不想買Mac電腦&#xff1f;別擔心&#xff01;本教程將手把手教你如何在Windows11環境下&#xff0c;通過VMware虛擬機安裝macOS Sequoia15系統。即使你是零基礎小白&#xff0c;按照這個步驟操作&#xff0c;也能輕松搞定&#xff01; 準備工作 在開始…

論文閱讀筆記——Emerging Properties in Unified Multimodal Pretraining

BAGEL 論文 商業閉源系統與學術/開源模型的差距很大&#xff0c;BAGEL 旨在通過開源統一架構大規模交錯數據主要解決&#xff1a; 架構割裂&#xff1a;理解/生成分屬兩條網絡&#xff0c;信息被壓縮在少量條件 token 中&#xff0c;長上下文推理受限。數據貧乏&#xff1a;主…

Go 語言基礎1 Slice,map,string

更多個人筆記見&#xff1a; github個人筆記倉庫 gitee 個人筆記倉庫 個人學習&#xff0c;學習過程中還會不斷補充&#xff5e; &#xff08;后續會更新在github上&#xff09; 文章目錄 stirng 字符串區分 rune&#xff0c;byte&#xff0c;string字符串操作strings 庫相關 f…

C# AI(Trae工具+claude3.5-sonnet) 寫前后端

這是一個AI 寫的前后端分離項目,通過AI編程&#xff0c;開發電商管理系統&#xff08;登陸、注冊&#xff09; 使用的AI工具為 Trae工具(字節國際版)claude3.5-sonnet(目前代碼最強模型) 前端為 vue3Bootstrap 后端為 C# net5.0(因為我電腦里面已經安裝了這個新版更好) do…

10G/25G PCS only mode for CoaXPress Over Fiber

背景 在CoaXPress Over Fiber的需求中, 需要利用XGMII的PCS 實現25G 數據速率的穩定傳輸&#xff0c;也就是不需要其MAC層&#xff0c;只保留PMA PCS層&#xff0c;借用其物理端口 線纜&#xff0c;實現其它協議的數據傳輸。 25G PCS 25GMII 的 TX/RX 時鐘頻率在 DDR&#xff…

掌握聚合函數:COUNT,MAX,MIN,SUM,AVG,GROUP BY和HAVING子句的用法,Where和HAVING的區別

對于Java后端開發來說&#xff0c;必須要掌握常用的聚合函數&#xff1a;COUNT&#xff0c;MAX&#xff0c;MIN&#xff0c;SUM&#xff0c;AVG&#xff0c;掌握GROUP BY和HAVING子句的用法&#xff0c;掌握Where和HAVING的區別&#xff1a; ? 一、常用聚合函數&#xff08;聚…

無人機飛行間隔安全智能評估、安全風險評估

無人機空中安全飛行評估需結合改進碰撞模型、蒙特卡洛仿真、安全間隔反推及動態避障策略&#xff0c;通過多機型分類與實時數據融合&#xff0c;實現從理論建模到實際部署的全流程管控&#xff0c;為城市低空密集飛行提供安全保障。 需求 無人機飛行間隔安全智能評估 無人機…