JVM組成及運行流程 - 面試筆記

JVM整體架構

JVM(Java Virtual Machine)是Java程序運行的核心環境,主要由以下幾個部分組成:
JVM組成、運行流程

1. 程序計數器(Program Counter)

  • 特點:線程私有,每個線程都有獨立的程序計數器
  • 作用:記錄當前線程正在執行的字節碼指令地址(行號)
  • 重要性:支持線程切換和恢復,確保程序能夠正確執行

2. 虛擬機棧(JVM Stack)

  • 特點:線程私有,采用先進后出(LIFO)的數據結構
  • 組成:由多個棧幀組成,每個方法調用創建一個棧幀
  • 棧幀內容:局部變量表、操作數棧、動態鏈接、方法返回地址
虛擬機棧常見問題

垃圾回收是否涉及棧內存?
不涉及。垃圾回收主要針對堆內存,棧幀在方法執行完畢后自動彈出釋放內存。

棧內存分配越大越好嗎?
不是。默認棧內存通常為1024KB,過大會導致可創建的線程數減少。例如:512MB總內存,1024KB棧大小可創建512個線程,改為2048KB則只能創建256個線程。

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

  • 如果局部變量沒有逃離方法作用范圍,則線程安全
  • 如果局部變量引用了對象并逃離方法作用范圍,需要考慮線程安全問題
棧內存溢出情況
  • 棧幀過多導致溢出(典型:無限遞歸調用)
  • 單個棧幀過大導致溢出

3. 堆內存(Heap)

  • 特點:線程共享區域,JVM中最大的內存區域
  • 作用:存儲對象實例和數組
  • 異常:當堆內存不足時拋出OutOfMemoryError異常
  • 分代結構:通常分為年輕代(Eden、Survivor)和老年代

4. 方法區(Method Area)

  • 特點:線程共享的內存區域
  • 存儲內容:類信息、運行時常量池、靜態變量、編譯后的代碼
  • 生命周期:虛擬機啟動時創建,關閉時釋放
  • 異常:內存不足時拋出OutOfMemoryError: Metaspace
JDK版本差異

JDK 1.7 vs 1.8的重要變化:

  • JDK 1.7:存在永久代(PermGen),存儲類信息、靜態變量、常量等
  • JDK 1.8:移除永久代,改為元空間(Metaspace),使用本地內存,有效防止內存溢出
    JDK版本區別

5. 直接內存(Direct Memory)

  • 特點:不屬于JVM內存結構,不由JVM管理
  • 本質:使用系統內存,常見于NIO操作
  • 特性:分配回收成本較高,但讀寫性能優秀
  • 用途:主要用作數據緩沖區
    直接內存

內存管理要點

垃圾回收機制

  • 主要針對堆內存進行回收
  • 棧內存隨方法調用結束自動釋放
  • 方法區在JDK 1.8后使用元空間,減少OOM風險

線程安全考慮

  • 程序計數器、虛擬機棧:線程私有,天然線程安全
  • 堆內存、方法區:線程共享,需要考慮并發訪問問題
  • 直接內存:需要程序員手動管理,注意內存泄漏

面試重點

  1. 內存區域劃分:能清楚說明各個內存區域的作用和特點
  2. 線程安全性:理解哪些區域是線程私有的,哪些是共享的
  3. 內存溢出:了解各種OutOfMemoryError的產生原因和解決方案
  4. JDK版本差異:特別是永久代到元空間的變化
  5. 性能調優:理解不同內存區域對性能的影響

補充知識點

常見JVM參數

  • -Xms:初始堆大小
  • -Xmx:最大堆大小
  • -Xss:棧大小
  • -XX:MetaspaceSize:元空間初始大小
  • -XX:MaxMetaspaceSize:元空間最大大小

內存泄漏常見場景

  • 長生命周期對象持有短生命周期對象的引用
  • 靜態集合類引用大量對象
  • 監聽器和回調函數未正確移除
  • 線程池中的線程未正確關閉

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

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

相關文章

JavaEE——線程池

目錄前言1. 概念2. 線程池相關參數3. Executors的使用總結前言 線程是為了解決進程太重的問題,操作系統中進程的創建和銷毀需要較多的系統資源,用了輕量級的線程來代替部分線程,但是如果線程創建和銷毀的頻率也開始提升到了一定程度&#xf…

3 c++提高——STL常用容器(一)

目錄 1 string容器 1.1 string基本概念 1.2 string構造函數 1.3 string賦值操作 1.4 string字符串拼接 1.5 string查找和替換 1.6 string字符串比較 1.7 string字符存取 1.8 string插入和刪除 1.9 string子串 2 vector容器 2.1 vector基本概念 2.2 vector構造函數…

手把手教你用【Go】語言調用DeepSeek大模型

1、首先呢,點擊 “DeepSeek”” 這個, 可以充1塊玩玩。 2、然后獲取api-key 3、替換apiKey const (apiURL "https://api.deepseek.com/v1/chat/completions"apiKey "your api key" // 替換為你的實際 API KeymodelName &…

自動化UI測試工具TestComplete的核心功能及應用

對桌面應用穩定性與用戶體驗的挑戰,手動測試效率低、覆蓋有限,而普通自動化工具常難以應對復雜控件識別、腳本靈活性和大規模并行測試的需求。 自動化UI測試工具TestComplete憑借卓越的對象識別能力、靈活的測試創建方式以及高效的跨平臺并行執行功能&a…

【C/C++】邁出編譯第一步——預處理

【C/C】邁出編譯第一步——預處理 在C/C編譯流程中,預處理(Preprocessing)是第一個也是至關重要的階段。它負責對源代碼進行初步的文本替換與組織,使得編譯器在后續階段能正確地處理規范化的代碼。預處理過程不僅影響編譯效率&…

快捷鍵——VsCode

一鍵折疊所有的代碼塊 先按 ctrl K,再ctrl 0 快速注釋一行 ctrl /

import 和require的區別

概念 import 是es6 規范,主要應用于瀏覽器和主流前端框架當中,export 導出, require 是 commonjs 規范,主要應用于nodejs環境中,module.exports 導出編譯規則 import 靜態導入是編譯時解析,動態導入是執…

8、鴻蒙Harmony Next開發:相對布局 (RelativeContainer)

目錄 概述 基本概念 設置依賴關系 設置參考邊界 設置錨點 設置相對于錨點的對齊位置 子組件位置偏移 多種組件的對齊布局 組件尺寸 多個組件形成鏈 概述 RelativeContainer是一種采用相對布局的容器,支持容器內部的子元素設置相對位置關系,適…

Linux命令的命令歷史

Linux下history命令可以對當前系統中執行過的所有shell命令進行顯示。重復執行命令歷史中的某個命令,使用:!命令編號;環境變量histsize的值保存歷史命令記錄的總行數;可用echo查看一下;需要大寫;環境變量hi…

【C++小白逆襲】內存管理從崩潰到精通的秘籍

目錄【C小白逆襲】內存管理從崩潰到精通的秘籍前言:為什么內存管理讓我掉了N根頭發?內存四區大揭秘:你的變量都住在哪里?🏠內存就像大學宿舍區 🏘?C語言的內存管理:手動搬磚時代 🧱…

【網絡安全】利用 Cookie Sandwich 竊取 HttpOnly Cookie

未經許可,不得轉載。 文章目錄 引言Cookie 三明治原理解析Apache Tomcat 行為Python 框架行為竊取 HttpOnly 的 PHPSESSID Cookie第一步:識別 XSS 漏洞第二步:發現反射型 Cookie 參數第三步:通過 Cookie 降級實現信息泄露第四步:整合攻擊流程修復建議引言 本文將介紹一種…

【工具】什么軟件識別重復數字?

網上的數字統計工具雖多,但處理重復數字時總有點不盡如人意。 要么只能按指定格式輸入,要么重時得手動一點點篩,遇上數據量多的情況,光是找出重復的數字就得另外花不少功夫。? 于是我做了個重復數字統計器,不管是零…

CSS分層渲染與微前端2.0:解鎖前端性能優化的新維度

CSS分層渲染與微前端2.0:解鎖前端性能優化的新維度 當你的頁面加載時間超過3秒,用戶的跳出率可能飆升40%以上。這并非危言聳聽,而是殘酷的現實。在當前前端應用日益復雜、功能日益臃腫的“新常態”下,性能優化早已不是錦上添花的“…

AI Agent開發學習系列 - langchain之Chains的使用(5):Transformation

Transformation(轉換鏈)是 LangChain 中用于“自定義數據處理”的鏈式工具,允許你在鏈路中插入任意 Python 代碼,對輸入或中間結果進行靈活處理。常用于: 對輸入/輸出做格式化、過濾、摘要、拆分等自定義操作作為 LLMC…

Druid 連接池使用詳解

Druid 連接池使用詳解 一、Druid 核心優勢與架構 1. Druid 核心特性 特性說明價值監控統計內置 SQL 監控/防火墻實時查看 SQL 執行情況防 SQL 注入WallFilter 防御機制提升系統安全性加密支持數據庫密碼加密存儲符合安全審計要求擴展性強Filter 鏈式架構自定義功能擴展高性能…

9.2 埃爾米特矩陣和酉矩陣

一、復向量的長度 本節的主要內容可概括為:當對一個復向量 z\pmb zz 或復矩陣 A\pmb AA 轉置后,還要取復共軛。 不能在 zTz^TzT 或 ATA^TAT 時就停下來,還要對所有的虛部取相反的符號。對于一個分量為 zjajibjz_ja_jib_jzj?aj?ibj? 的列向…

AI驅動的低代碼革命:解構與重塑開發范式

引言:低代碼平臺的范式轉移 當AI技術與低代碼平臺深度融合,軟件開發正經歷從"可視化編程"到"意圖驅動開發"的根本性轉變。這種變革不僅提升了開發效率,更重新定義了人與系統的交互方式。本文將從AI介入的解構層次、交互范…

zookeeper etcd區別

ZooKeeper與etcd的核心區別體現在設計理念、數據模型、一致性協議及適用場景等方面。?ZooKeeper基于ZAB協議實現分布式協調,采用樹形數據結構和臨時節點特性,適合傳統分布式系統;而etcd基于Raft協議,以高性能鍵值對存儲為核心&am…

模擬注意力:少量參數放大 Attention 表征能力

論文標題 SAS: Simulated Attention Score 論文地址 https://arxiv.org/pdf/2507.07694 代碼 見論文附錄 作者背景 摩根士丹利,斯坦福大學,微軟研究院,新加坡國立大學,得克薩斯大學奧斯汀分校,香港大學 動機 …

零基礎|寶塔面板|frp內網穿透|esp32cam遠程訪問|微信小程序

1.準備好阿里云服務器和寶塔面板2.安裝frp服務端3.測試(密碼賬號在詳情里面)4.配置客戶端#一、沒有域名情況下 [common] server_addr #公網ip地址,vps server_port 7000 服務的bind_port token 12121212 [httpname] type tcp # 沒有域名情況下使用 tcp local_i…