JVM組成面試題及原理

Java Virtual Machine(JVM)是Java程序的運行環境(java二進制字節碼的運行環境)
好處:

  • 一次編寫,到處運行
  • 自動內存管理,垃圾回收機制
    JVM由哪些部分組成,運行流程是什么?
    在這里插入圖片描述

1. 程序計數器

程序計數器:線程私有(不存在線程安全),

  1. 原理:內部記錄正在執行的字節碼指令的地址(行號)。
  2. 功能:保存當前線程的行號,如果時間片被搶占,再次執行會從記錄的行號繼續執行,不會從頭執行
    在這里插入圖片描述

2. Java堆

2.1 結構

線程共享的區域(存在線程安全)
主要用來保存對象實例,數組等,當堆中沒有內存空間可分配給實例,也無法再擴展時,則拋出OutOfMemoryError異常。
在這里插入圖片描述

年輕代被劃分為三部分,Eden區和兩個大小嚴格相同的Survivor區,
根據JVM的策略,在經過幾次垃圾收集后,任然存活于Survivor的對象將被移動到老年代區間。老年代主要保存生命周期長的對象,一般是一些老的對象

2.2 Java 1.7與1.8堆的區別

  • 1.7中有有一個永久代,存儲的是類信息、靜態變量、常量、編譯后的代碼
  • 1.8移除了永久代,把數據存儲到了本地內存的元空間中,防止內存溢出
    優化點:1.7堆的永久代在1.8更新成了本地內存中的元空間,解決永久代多容易OOM,少了會浪費內存的問題

3. 虛擬機棧

Java Virtual machine Stacks(java 虛擬機棧)

  • 每個線程運行時所需要的內存,稱為虛擬機棧,先進后出(多個線程運行就會創建多個虛擬機棧——線程安全
  • 每個棧由多個棧幀(frame)組成,對應著每次方法調用時所占用的內存
  • 每個線程只能有一個活動棧幀,對應著當前正在執行的那個方法

3.1 垃圾回收是否涉及棧內存

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

3.2 棧內存分配越大越好嗎

視情況分析,默認的棧內存通常為1024k
棧幀過大會導致線程數變少,例如,機器總內存為512m,目前能活動的線程數則為512個,如果把棧內存改力2048k,那么能活動的棧幀就會減半

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

  • 如果方法內局部變量沒有逃離方法的作用范圍,它是線程安全的
  • 如果是局部變量引用了對象,并逃離方法的作用范圍,需要考慮線程安全
    在這里插入圖片描述

3.4 棧內存溢出情況

  • 棧幀過多導致棧內存溢出,典型問題:遞歸調用
  • 棧幀過大導致棧內存溢出
public static void m4(){m4(); //java.lang.StackOverflowError
}

3.5 堆棧的區別是什么

  • 棧內存一般會用來存儲局部變量和方法調用,但堆內存是用來存儲Java對象和數組的的。堆會GC垃圾回收,而棧不會。
  • 棧內存是線程私有的,而堆內存是線程共有的。
  • 兩者異常錯誤不同,但如果棧內存或者堆內存不足都會拋出異常。
    棧空間不足:java.lang.StackOverFlowError。
    堆空間不足:javalang.OutOfMemoryError。

4. 方法區

  • 方法區(Method Area)是各個線程共享的內存區域
  • 主要存儲類的信息、運行時常量池
  • 虛擬機啟動的時候創建,關閉虛擬機時釋放
  • 如果方法區域中的內存無法滿足分配請求,則會拋出OutOfMemoryError: Metaspace
    在這里插入圖片描述

jdk1.7到1.8把這個區從堆移到元空間(本地空間)

4.1 常量池

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

javap -v Application.class

查看字節碼結構(類的基本信息、常量池、方法定義)
在這里插入圖片描述

運行時常量池
常量池是*.class文件中的,當該類被加載,它的常量池信息就會放入運行時常量池,并把里面的符號地址變為真實地址

5. 直接內存

  • 直接內存并不屬于JVM中的內存結構,不由JVM進行管理。是虛擬機的系統內存
  • 常見于NIO操作時,用于數據緩沖區,它分配回收成本較高,但讀寫性能高

5.1 IO數據拷貝流程(常規)

操作磁盤文件中需要存入兩次到緩存區(系統緩存區、java緩存區)
因為java代碼無法直接操作系統造成了java緩存區,這樣導致了一次不必要的復制,導致效率低
在這里插入圖片描述

5.2 NIO數據拷貝流程

直接內存(共享的內存區域)讓系統和java代碼都可以直接訪問。
相較IO少了一次數據復制,效率成倍的提升。所以NIO適合文件操作
在這里插入圖片描述

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

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

相關文章

江科大51單片機筆記【11】AT24C02數據存儲秒表

一、數據存儲 先把需要的模塊導入做個測試 //main.c#include <REGX52.H> #include " LCD1602.h" #include " Key.h"void main() {LCD_Init();LCD_ShowString(1,1,"Hello");while(1){}} 代碼思路 分成兩塊寫&#xff0c;一塊寫I2C.c&am…

Hadoop的運行模式

Hadoop的運行模式 1、本地運行模式2、偽分布式運行模式3、完全分布式運行模式4、區別與總結 Hadoop有三種可以運行的模式&#xff1a;本地運行模式、偽分布式運行模式和完全分布式運行模式 1、本地運行模式 本地運行模式無需任何守護進程&#xff0c;單機運行&#xff0c;所有…

2.裝飾器模式

概述 裝飾器模式&#xff1a;在原有結構&#xff0c;動態地為對象添加職責&#xff0c;它是一種靈活的擴展功能方式。 業務場景&#xff1a;創建訂單 假設你正在開發一個電商系統&#xff0c;用戶在創建訂單時可以選擇不同的服務&#xff08;如折扣、配送、禮品包裝等&#…

C++11新特性 10.初始化列表、initializer_list

目錄 一.初始化列表 使用示例 二.initializer_list 1.基本概念 2.使用示例 一.初始化列表 C11提供的統一初始化方式&#xff0c;實現直接對數據初始化 使用示例 /* 初始化列表 */ #include <iostream> using namespace std; class Person { public:Person(string…

Vue 的 render 函數如何與 JSX 結合使用

在 Vue.js 中&#xff0c;render 函數提供了一種更底層的方式來創建虛擬 DOM 節點&#xff0c;而 JSX 則是一種 JavaScript 的語法擴展&#xff0c;允許開發者在 JavaScript 代碼中直接編寫類似 HTML 的結構。結合使用 render 函數和 JSX 可以帶來更高的靈活性和編程能力&#…

基于DeepSeek的智慧醫藥系統(源碼+部署教程)

運行環境 智慧醫藥系統運行環境如下&#xff1a; 前端&#xff1a; HTMLCSS后端&#xff1a;Java AIGCDeepseekIDE工具&#xff1a;IDEA技術棧&#xff1a;Springboot HTMLCSS MySQL 主要角色 智慧醫藥系統主要分為兩個角色。 游客 尚未進行注冊和登錄。具備登錄注冊、…

南開提出1Prompt1Story,無需訓練,可通過單個連接提示實現一致的文本到圖像生成。

&#xff08;1Prompt1Story&#xff09;是一種無訓練的文本到圖像生成方法&#xff0c;通過整合多個提示為一個長句子&#xff0c;并結合奇異值重加權&#xff08;SVR&#xff09;和身份保持交叉注意力&#xff08;IPCA&#xff09;技術&#xff0c;解決了生成圖像中身份不一致…

BLUEM2引擎源碼2025最新版

BLUE 引擎解析&#xff1a;傳奇私服圈中的熱門引擎 一、BLUE 引擎簡介 BLUE 引擎是傳奇私服圈子中較為知名的一款游戲引擎&#xff0c;它在傳統的傳奇引擎基礎上進行了優化和擴展&#xff0c;使得私服開發者可以更加方便地搭建和管理服務器。相比于早期的 GEE、LEG、Hero 等引…

第53天:Web攻防-SQL注入數據庫類型用戶權限架構分層符號干擾利用過程發現思路

#知識點&#xff1a;(本節課了解即可&#xff09; 1、Web攻防-SQL注入-產生原理&應用因素 2、Web攻防-SQL注入-各類數據庫類型利用 一、數據庫知識&#xff1a; 1、數據庫名&#xff0c;表名&#xff0c;列名&#xff0c;數據 2、自帶數據庫&#xff0c;數據庫用戶及權限 3…

【玩轉MySQL數據字典】MySQL數據字典與常用操作指令

MySQL數據字典簡介與常用操作指令 一、數據字典簡介 數據字典是MySQL 5.7中用于存儲數據庫對象元數據的系統表。在MySQL的早期版本中&#xff0c;元數據存儲在.frm文件及其他文件里。這種存儲方式存在諸多弊端&#xff0c;例如元數據不一致問題&#xff0c;不同文件間元數據的…

如何有效判斷與排查Java GC問題

目錄 一、GC的重要性與對性能的影響 &#xff08;一&#xff09;GC對性能的影響簡要分析 1.GC暫停與應用停頓 2.GC吞吐量與資源利用率 3.GC對內存管理的作用&#xff1a;資源回收 4.GC策略與優化的選擇 &#xff08;二&#xff09;GC的雙刃劍 二、GC性能評價標準 &…

el-table(elementui)表格合計行使用以及滾動條默認樣式修改

一、el-table新增合計行以及el-table展示數據出現的問題 1. 使用合計行 el-table的屬性show-summary設為true&#xff0c;即可在表格尾部展示合計行。默認情況下&#xff0c;第一列不展示數據&#xff0c;而顯示合計二字&#xff0c;可以通過sum-text自己配置&#xff0c;其余…

olmOCR:高效精準的 PDF 文本提取工具

在日常的工作和學習中&#xff0c;是否經常被 PDF 文本提取問題困擾&#xff1f;例如&#xff1a; 想從學術論文 PDF 中提取關鍵信息&#xff0c;卻發現傳統 OCR 工具識別不準確或文本格式混亂&#xff1f;需要快速提取商務合同 PDF 中的條款內容&#xff0c;卻因工具不給力而…

云計算:虛擬化、容器化與云存儲技術詳解

在上一篇中,我們深入探討了網絡安全的核心技術,包括加密、認證和防火墻,并通過實際案例和細節幫助讀者全面理解這些技術的應用和重要性。今天,我們將轉向一個近年來迅速發展的領域——云計算。云計算通過提供按需訪問的計算資源,徹底改變了IT基礎設施的構建和管理方式。本…

免費開源抓包工具Wireshark介紹

一、Wireshark 安裝詳解 Wireshark 是一款跨平臺的網絡協議分析器&#xff0c;支持 Windows、macOS 和 Linux 等操作系統。以下分別介紹在不同操作系統上的安裝步驟&#xff0c;并詳細解釋安裝過程中的選項。 1、Windows 平臺安裝 1.下載 Wireshark 安裝包: 訪問 Wireshark…

藍橋杯備賽:炮彈

題目解析 這道題目是一道模擬加調和級數&#xff0c;難的就是調和級數&#xff0c;模擬過程比較簡單。 做法 這道題目的難點在于我們在玩這個跳的過程&#xff0c;可能出現來回跳的情況&#xff0c;那么為了解決這種情況&#xff0c;我們采取的方法是設定其的上限步數。那么…

2025年滲透測試面試題總結-奇安信安全工程師(題目+回答)

網絡安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 奇安信安全工程師 1. MVC框架詳細說明 2. SQL注入詳細介紹 3. XSS和CSRF的區別 4. XXE漏洞原理 5. …

【阿里云】控制臺使用指南:從創建ECS到系統診斷測評

前言 隨著云計算技術的快速發展&#xff0c;越來越多的企業和開發者開始使用云服務來部署和管理應用程序。在眾多云服務提供商中&#xff0c;阿里云&#xff08;Alibaba Cloud&#xff09;憑借其強大的基礎設施和豐富的服務&#xff0c;成為了眾多用戶的首選。本文旨在介紹如何…

關于OceanBase與CDH適配的經驗分享

CDH是Cloudera早期推出的一個開源平臺版本&#xff0c;它實質上成為了Apache Hadoop生態系統內公認的安裝與管理平臺&#xff0c;專為企業級需求量身打造。CDH為用戶提供了即裝即用的企業級解決方案。通過整合Hadoop與另外十多項關鍵開源項目&#xff0c;Cloudera構建了一個功能…

電機驅動電路:單橋(H橋)與雙橋(雙H橋)詳解

一、電機驅動電路的作用 電機驅動電路通過控制電流方向和大小,實現電機的正反轉、調速及制動。常見的結構包括單橋(H橋)和雙橋(雙H橋),分別適用于不同場景。 二、單橋(H橋)驅動電路 1. 結構示意圖(文字描述) 開關元件:4個功率開關(如MOSFET或IGBT)組成橋臂,分…