JavaEE初階復習(JVM篇)

JVM?

Java虛擬機

jdk java開發工具包

jre java運行時環境

jvm java虛擬機(解釋執行 java 字節碼)

java作為一個半解釋,半編譯的語言,可以做到跨平臺. java 通過javac把.java文件=>.class文件(字節碼文件)

字節碼文件, 包含的就是java字節碼, jvm把字節碼進行翻譯轉化為不同系統上可以識別的cpu指令.

JVM的內存劃分(面試題)

JVM本質上是一個進程

進程運行中, 要從操作系統這里申請一些資源(內存就是核心的資源)

JVM作為一個進程, 從系統中申請了一大塊內存, 這一大塊內存給java程序使用的時候, 又會根據實際的使用用途來劃分出不同的空間(比如java定義變量的時候,就是使用JVM從系統這邊申請到的內存)

JVM劃分各區域的解釋

1> 堆 代碼中new出來的對象就都是在堆里面. 對象中持有的非靜態成員變量, 也就是在堆里面(后面GC主要就是回收這里的引用)

2> 棧?

本地方法棧: jvm內部, 通過c++代碼的調用關系和局部變量

虛擬機棧: 記錄了java代碼的調用關系和java里面的局部變量

此處的堆和棧和數據結構里面的不一樣

3> 程序計數器: 主要存儲下一條要執行的 java 指令的地址(每個線程都有自己的程序計數器和棧)

4> 元數據區(之前叫做方法區): 這里放一些輔助性,描述性質的屬性(比如在硬盤上保存數據的本體,還有一些輔助信息: 文件的大小, 文件的位置,文件的擁有者,文件的修改時間...).比如類的信息,方法的信息(一個程序有哪些類, 每個類里面又包含哪些方法, 每個方法里面包含哪些指令.

堆, 元數據區(整個進程有一份)?棧, 程序計數器(每個線程有一份)

常考的筆試題

JVM的類加載機制(面試題)

類加載: java進程運行的時候, 需要把.class文件從硬盤讀取到內存, 并進行一系列解析的校驗解析的過程.

類加載的過程:?

1> 加載 把硬盤上的 .class 文件找到, 打開文件, 讀取到文件的內容.(二進制的數據)

2> 驗證 確認當前讀到的文件內容是合法的 .class 文件(字節碼) 格式.(里面有jvm開發的版本信息, 高版本的可以運行低版本的 .class)(校驗.class 文件的格式是否符合 JVM 規范要求

3> 準備 給類對象, 申請內存空間(此時申請到的內存空間, 里面的默認值, 全都是0)

4> 解析 針對類中的字符串常量進行管理(java虛擬機將常量池里面的 符號引用 替換為 直接引用

的過程)?

class Test{ private String s = "hello"}? s里面包含的是"hello"的內存地址, 地址存的是內存的地址, 但是此時我們訪問的是.class文件, 文件里面不存在地址的概念,? 文件是放在硬盤上的, 因此我們.class文件里面的s存的是"hello"的相對偏移量,此時文件中填充的s的"hello"偏移量就是 符號引用 ,后續我們把.class放在內存里面,就會把"hello"加載到內存中, 此時"hello"就有地址了,此時內存中的s保存的是"hello"的內存地址, 此時就是 直接引用

5> 初始化: 針對類對象完成后續的初始化(執行靜態代碼的邏輯), 對對象的各個部分的屬性進行賦值填充

雙親委派模型(加載環節)

描述怎么查找 .class 文件的策略

JVM的幾個類加載器

BootstrapClassLoader: 負責查找標準庫的目錄

ExtensionClassLoader: 負責查找擴展庫的目錄( java 規范里面描述了標準庫中應該有哪些功能)

ApplicationClassLoader: 負責查找當前項目的代碼目錄, 以及第三方庫的目錄

從下面開始,逐層先把搜索任務交給上層,直到沒有上層為止, 然后從最上層開始進行搜索,如果找到了就進入打開文件, 讀文件的操作.如果沒有搜索到就去下層目錄開始找.以此往下到最后一層, 如果沒有找到就拋出 ClassNotFoundException 異常

JVM的垃圾回收算法(GC)面試題

我們主要GC的區域就是堆(new 對象的區域)

垃圾回收,主要回收的是對象, 每次垃圾回收的時候, 釋放若干個對象

?垃圾回收機制

1> 識別出垃圾: 哪些是垃圾, 哪些不是垃圾(對象沒有引用了,匿名對象除外)

判定整個對象后續是否需要繼續使用(看整個對象是否被引用),如果一個對象都沒有引用指向他, 就視為無法被代碼中使用, 就可以視作垃圾.

創建的對象是放在堆, 引用的關系存放在棧

多個對象引用

如何計算引用?

1. 引入計數器 給每個對象安排一個額外的空間, 空間里面要保存當前整個對象有幾個引用.

此時的垃圾回收機制,就是看整個引用計數是否為0,是0就可以釋放了

問題1: 消耗額外的內存空間, 我們需要給每個對象都安排一個計數器

問題2: 引用計數可能會產生" 循環引用的問題 " . 此時, 引用計數就無法正確工作了

2. 可達性分析(JVM用的是這個)

相比于消耗一個空間來計算引用數目, 我們用時間來換空間

在寫代碼的時候, 會寫很多的變量, 此時我們以這些對象變量為起點, 根據引用關系向下搜索,所有能夠被搜索到的對象就不是垃圾了,搜索一圈也沒有訪問到的對象,就是垃圾.

比如我有若干個結點, 通過引用關系來構成二叉樹, 我們從根結點開始遍歷, 遍歷它的左子樹, 遍歷完后遍歷右子樹, 直到葉子結點沒有子節點為止, 此時我們遍歷到的結點都不是垃圾 ,如果我們把某個結點的?left設置為null, left之前結點就遍歷不到了, 此時就是不可達, 就是垃圾

2> 把標記為垃圾的對象的內存空間進行釋放

釋放的方式

a> 標記-清除

把標記為垃圾的對象直接釋放掉(會產生內存碎片的問題: 產生很多小的 離散的 空閑內存空, 我們申請內存空間是申請的一塊連續的內存空間)

b> 復制算法

不直接釋放內存, 而是把不是垃圾的對象復制到內存的另一半里面, 然后釋放掉原先一半的內存空間(總的內存變少了, 每次復制的對象如果很多, 那么復制的開銷就會很大)

c> 標記 - 整理?

類似于 順序表 刪除中間元素(搬運)

分帶回收

引入概念, 對象的年齡

JVM 中有專門的線程負責周期性掃描/釋放

一個對象, 如果被線程掃描了一次, 就不是垃圾, 年齡+1(初始年齡是0)

JVM 中會根據對象年齡的差異, 把整個堆的內存分成倆大部分: 新生代(年齡小的對象) / 老年代(年齡大的對象)

新生代又分為伊甸區,生存區, 幸存區

1> 當new出一個新的對象, 就放在伊甸區.(伊甸區就會有, 很多的對象)

2>?第一輪GC: 之后大部分的對象都沒了, 還存在的對象會被使用復制算法拷貝放在生存區

后續的GC掃描線程伊甸區和生存去都會掃描, 然后進行垃圾清理, 在生存區存活下來的對象會使用復制算法放在幸存區里面,每一次GC的掃描,對象的年齡都會+1

3> 如果在生存區里面經歷若干輪GC, 還存在的對象, 就會被拷貝到老年區

4> 老年區掃描的頻次大大低于其他區域, 掃描線程主要掃描的還是新手區

5> 在老年區里面的對象沒有引用后, 就會被JVM按照標記整理的方式進行搬運處理掉.

垃圾收集器

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

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

相關文章

2.pycharm保姆級安裝教程

一、pycharm安裝 1.官網上下載好好軟,雙擊打開 2.下一步 3.修改路徑地址 (默認也可以) 4.打勾 5.安裝 不用重啟電腦 二、添加解釋器 1.雙擊軟件,打開 2.projects – new project 3.指定項目名字,項目保存地址,解釋器 4.右擊 – …

zk基礎—4.zk實現分布式功能二

大綱 1.zk實現數據發布訂閱 2.zk實現負載均衡 3.zk實現分布式命名服務 4.zk實現分布式協調(Master-Worker協同) 5.zk實現分布式通信 6.zk實現Master選舉 7.zk實現分布式鎖 8.zk實現分布式隊列和分布式屏障 4.zk實現分布式協調(Master-Worker協同) (1)Master-Worker架構…

Java 實現 字母異位詞分組

在這篇博客中,我們將詳細解析如何使用 Java 代碼來解決 字母異位詞分組這個經典的算法問題。我們會逐步分析代碼邏輯,并探討其時間復雜度及優化思路。 題目描述 給定一個字符串數組 strs,請將字母異位詞組合在一起。字母異位詞是指由相同字…

【Ragflow】10. 助理配置參數詳細解析/模型響應加速方法

概述 Ragflow的助理配置中,有很多參數,盡管官方文檔給出了一定程度的解釋,但不夠詳細。 本文將對各項參數進行更詳細的解釋說明,并進一步挖掘某些參數中隱含的潛在陷阱。 助理設置 空回復 含義:輸入的問題若未能在…

Mac Apple silicon如何指定運行amd64架構的ubuntu Docker?

如何指定運行amd64架構的ubuntu Docker 下面這個docker命令如何指定運行amd64架構的ubuntu Docker? docker run -it -v $(pwd):/workspace ubuntu:20.04 bash這個命令已經非常接近正確運行一個基于 amd64 架構的 Ubuntu 容器了,但如果你想明確指定運行…

ColPali:基于視覺語言模型的高效文檔檢索

摘要 文檔是視覺豐富的結構,不僅通過文本傳遞信息,還包括圖表、頁面布局、表格,甚至字體。然而,由于現代檢索系統主要依賴從文檔頁面中提取的文本信息來索引文檔(通常是冗長且脆弱的流程),它們…

使用C++實現HTTP服務

天天開心!!! 閱讀本篇文章之前,請先閱讀HTTP基礎知識 傳送門----> HTTP基礎知識 文章目錄 一、CWeb服務器(核心代碼WebServer.cpp)二、靜態文件結構三、編譯和運行四、訪問測試 一、CWeb服務器&#xff…

Reactive編程入門:Project Reactor 深度指南

文章目錄 4.2.1 創建 Flux 和 MonoFlux 基礎創建方式高級創建模式Mono 創建方式 4.2.2 訂閱與數據處理基礎訂閱模式數據處理操作符 4.2.3 核心操作符深度解析flatMap 操作符zip 操作符buffer 操作符 高級組合模式復雜流處理示例背壓處理策略 測試響應式流性能優化技巧 React 編…

【萬字總結】前端全方位性能優化指南(完結篇)——自適應優化系統、遺傳算法調參、Service Worker智能降級方案

前言 自適應進化宣言 當監控網絡精準定位病灶,真正的挑戰浮出水面:系統能否像生物般自主進化? 五維感知——通過設備傳感器實時捕獲環境指紋(如地鐵隧道弱光環境自動切換省電渲染) 基因調參——150個性能參數在遺傳算…

PQ以及有關索引的筆記Faiss: The Missing Manual

參考Faiss 索引結構總結: 為了加深記憶,介紹一下Inverted File Index(IVF)的名字由來: IVF索引的名字源自“倒排文件”(Inverted File)的概念。在傳統的信息檢索中,倒排文件是一種索…

win10徹底讓圖標不顯示在工具欄

關閉需要不顯示的軟件 打開 例此時我關閉了IDEA的顯示 如果說只是隱藏,鼠標拖動一個道理 例QQ 如果說全部顯示不隱藏

關稅核爆72小時!跨境矩陣防御戰緊急打響

一、T86崩塌:全球貿易鏈的至暗時刻 (配圖:美國海關系統深夜彈出紅色警報) 5月2日凌晨2:17,杭州某光伏企業的供應鏈系統突然發出刺耳警報——其價值1800萬美元的逆變器模塊被劃入34%關稅清單。這場代號"黑天鵝突…

藍橋杯Java B組省賽真題題型近6年統計分類

困難題 題號題型分值代碼量難度通過率內容2024-F解答1581困難0.12最短路問題 Dijkstra 期望2024-G解答20116困難0.19模擬 暴力 搜索 DFS 剪紙 枚舉2023-H解答2070困難0動態規劃2022-H解答20109困難0.032022-J解答25141困難0搜索2021-H解答2041困難0.18二分 思維 規律2021-I解答…

【網絡流 圖論建模 最大權閉合子圖】 [六省聯考 2017] 壽司餐廳

題目描述: P3749 [六省聯考 2017] 壽司餐廳 題目描述 Kiana 最近喜歡到一家非常美味的壽司餐廳用餐。 每天晚上,這家餐廳都會按順序提供 n n n 種壽司,第 i i i 種壽司有一個代號 a i a_i ai? 和美味度 d i , i d_{i, i} di,i?&…

前端面試題(三):axios有哪些常用的方法

Axios 是一個基于 Promise 的 HTTP 客戶端,用于瀏覽器和 Node.js 中發送 HTTP 請求。它提供了一些常用的方法來處理不同類型的請求。以下是 Axios 中常用的一些方法: 1. axios.get() 用于發送 GET 請求,從服務器獲取數據。 axios.get(/api/d…

python match case語法

學習路線:B站 普通的if判斷 def if_traffic_light(color):if color red:return Stopelif color yellow:return Slow downelif color green:return Goelse:return Invalid colorprint(if_traffic_light(red)) # Output: Stop print(if_traffic_light(yellow)) …

LLaMA-Factory大模型微調全流程指南

該文檔為LLaMA-Factory大模型微調提供了完整的技術指導,涵蓋了從環境搭建到模型訓練、推理和合并模型的全流程,適用于需要進行大模型預訓練和微調的技術人員。 一、docker 容器服務 請參考如下資料制作 docker 容器服務,其中,掛…

【HCIA】靜態綜合實驗練習筆記

實驗拓撲圖如下: 實驗配置思路如下: 1、網段劃分、配置IP地址 2、配置DHCP,使客戶端獲得ip地址 3、配置靜態明細路由,內網全網通 4、配置空接口防環 5、配置優先級,實現選路最佳 6、配置缺省路由,實現公網通…

大數據(4.5)Hive聚合函數深度解析:從基礎統計到多維聚合的12個生產級技巧

目錄 背景一、Hive聚合函數分類與語法1. 基礎聚合函數2. 高級聚合函數 二、6大核心場景與案例場景1:基礎統計(SUM/COUNT)場景2:多維聚合(GROUPING SETS)場景3:層次化聚合(ROLLUP&…

RTOS基礎 -- NXP M4小核的RPMsg-lite與端點機制回顧

一、RPMsg-lite與端點機制回顧 在RPMsg協議框架中: Endpoint(端點) 是一個邏輯通信端口,由本地地址(local addr)、遠程地址(remote addr)和回調函數組成。每個消息都會發送到特定的…