持續總結中!2024年面試必問 100 道 Java基礎面試題(四十一)

上一篇地址:持續總結中!2024年面試必問 100 道 Java基礎面試題(四十)-CSDN博客

八十一、Java內存模型是什么?

Java內存模型(Java Memory Model, JMM)是Java虛擬機(JVM)的一個核心概念,它定義了Java程序中各種變量(線程共享變量)的訪問規則,以及在并發環境下,如何保證這些變量的內存一致性。JMM是Java并發編程的基礎,它解決了多線程環境下的內存一致性問題。

Java內存模型的主要目標

  1. 定義主內存與工作內存:JMM定義了主內存(Main Memory)和工作內存(Working Memory)。主內存是所有線程共享的內存區域,用于存儲共享變量。工作內存是每個線程獨立的內存區域,線程對共享變量的操作首先在工作內存中進行,然后再與主內存同步。

  2. 保證內存一致性:在并發編程中,JMM確保在不同的線程間,對共享變量的讀寫操作能夠按照預期的順序執行,從而保證多線程環境下的內存一致性。

  3. 定義原子性、可見性和有序性:JMM規定了哪些操作是原子操作,以及線程如何感知其他線程中共享變量的更改(可見性),以及線程如何保證操作的有序性。

原子性、可見性和有序性

  1. 原子性:原子性是指一個操作或者一系列操作在執行過程中不會被其他線程中斷。

  2. 可見性:可見性是指當一個線程修改了共享變量的值,其他線程能夠立即看到這個修改。

  3. 有序性:有序性是指在程序中,按照代碼的先后順序執行操作。

同步塊和鎖

  1. 同步塊:Java中的synchronized關鍵字可以用來創建同步塊,確保同一時刻只有一個線程可以執行該代碼塊。

  2. :在JMM中,鎖提供了一種機制,確保原子性、可見性和有序性。當線程持有鎖時,其他線程必須等待直到鎖被釋放。

內存屏障

  1. 內存屏障:JMM通過內存屏障(Memory Barrier)來禁止特定類型的編譯器和處理器重排序,確保指令的執行順序。

與硬件的交互

  1. 控制硬件行為:JMM還定義了JVM應該如何與底層硬件交互,以確保即使在不同的硬件和操作系統上,Java程序的內存一致性行為也是相同的。

示例代碼

public class Counter {private int count = 0;public synchronized void increment() {count++;}public int getCount() {return count;}
}

在這個示例中,Counter類的increment方法是同步的,這意味著在同一時間只能有一個線程進入這個方法。這保證了count變量的原子性、可見性和有序性。

注意事項

  • 并發編程的復雜性:JMM的引入增加了并發編程的復雜性,但同時也提供了強大的控制手段。
  • 理解JMM:深入理解JMM對于編寫正確的并發程序至關重要。
  • 使用并發庫:Java提供了一些并發庫(如java.util.concurrent包),它們基于JMM構建,可以簡化并發編程。

總結來說,Java內存模型是Java并發編程的核心,它定義了多線程環境下的內存一致性規則,幫助開發者理解并控制線程之間的內存交互。

八十二、Java中的垃圾回收機制是如何工作的?

Java中的垃圾回收(Garbage Collection, GC)機制是一種自動內存管理功能,它負責監控程序使用內存的情況,自動回收不再使用的對象,從而防止內存泄漏和節省內存資源。以下是Java垃圾回收機制的詳細解釋:

對象創建和內存分配

  1. 當Java程序創建對象時,它們被分配到堆內存中。堆內存被分為不同的區域,如新生代(Young Generation)、老年代(Old Generation)和永久代(Permanent Generation,Java 8之后被元空間取代)。

  2. 新生代是新對象的初始分配區域,它進一步分為Eden區、兩個Survivor區(S0和S1)。

對象的生命周期

  1. 新生代:新對象首先在Eden區分配。當Eden區滿時,觸發一次Minor GC,將存活的對象復制到一個Survivor區。

  2. Survivor區:在Eden區發生GC后,存活的對象被移動到Survivor區。如果對象在Survivor區再次經過GC仍然存活,它們將被提升到老年代。

  3. 老年代:老年代用于存放長壽命的對象,當老年代空間不足時,會觸發Full GC(或Major GC),對整個堆內存進行垃圾回收。

垃圾回收算法

  1. 標記-清除:這是最基本的GC算法,它首先標記所有需要回收的對象,然后清除這些被標記的對象。

  2. 復制算法:在新生代中使用,它將內存分為兩個區域,每次只使用一個區域。垃圾回收時,將存活的對象復制到另一個區域,并清空當前區域。

  3. 標記-整理:在老年代中使用,它結合了標記-清除算法,同時移動存活對象,以減少內存碎片。

  4. 分代收集:基于對象的生命周期,將對象分配到不同的代中,新生代和老年代使用不同的垃圾回收策略。

垃圾回收器

  1. Serial GC:單線程的垃圾回收器,適用于小型應用。

  2. Parallel GC:使用多個線程進行垃圾回收,適用于多核處理器。

  3. Concurrent Mark Sweep (CMS):并發標記清除垃圾回收器,旨在減少GC暫停時間。

  4. G1 (Garbage-First):一種服務器端的垃圾回收器,旨在替代CMS,它將堆分割成多個小塊,可以更靈活地進行垃圾回收。

如何觸發垃圾回收

  1. 顯式觸發:通過調用System.gc()可以建議JVM進行垃圾回收,但JVM可以選擇忽略這個建議。

  2. 隱式觸發:當堆內存不足時,JVM會自動觸發垃圾回收。

注意事項

  • 性能影響:雖然垃圾回收可以自動管理內存,但頻繁的GC會降低程序性能。

  • 對象引用:對象的生命周期不僅取決于是否被引用,還取決于引用的強度(如強引用、軟引用、弱引用)。

  • 內存泄漏:未能正確釋放不再使用的對象引用會導致內存泄漏。

  • 監控和調優:可以通過JVM監控工具來觀察GC行為,并根據需要調整垃圾回收策略。

總結來說,Java的垃圾回收機制通過自動監測內存使用情況并回收不再使用的對象來管理工作內存。了解垃圾回收的工作原理和垃圾回收器的行為對于編寫高效的Java程序和進行性能調優非常重要。

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

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

相關文章

海豚知道知識付費平臺,大V都在用,新手也能做,網絡營銷是什么?如何向銷售轉化?

我國的市場營銷已經全面步入互聯網時代,教育行業也逐漸網絡化,通過互聯網發家壯大的機構比比皆是,然而仍舊有很多中小型教育培訓機構,沒有從事網絡營銷推廣,或者從事了效果非常不理想。網絡營銷是什么,如何…

流暢的python-學習筆記_對象引用、可變性、垃圾回收

變量不是盒子 即變量是引用,而不是實際內存,多個標識賦值相同變量時,多余標識是引用 標識、相等性、別名 比較對象的值,is比較對象的id。實際調用對象的__eq__方法。is速度比快,因為is不能重載,省去了尋…

UNIT6,NFS網絡文件系統的應用

實驗要求: 1.配置2臺服務器要求如下: a)服務器1: 主機名:user-server.timinglee.org ip地址: 172.25.254.100 配置好軟件倉庫 b)服務器2: 主機名:storage-server.timing…

力扣 300. 最長遞增子序列 python AC

動態規劃 dp[i]表示到當前位置為止最多個數的遞增子序列 簡單的對每個位置從頭遍歷 class Solution:def lengthOfLIS(self, nums):size len(nums)dp [1] * sizefor i in range(1, size):for j in range(i):if nums[i] > nums[j]:dp[i] max(dp[i], dp[j] 1)return max…

數據結構與算法學習筆記之線性表二---順序表的靜態存儲表示和實現(C++)

目錄 前言 1.什么是順序表 2.順序表的靜態存儲表示 1.初始化 2.長度 3.數據元素 4.長度 5.獲取元素下標 6.前驅節點 7.后繼節點 8.插入 9.刪除 10.遍歷 11.測試代碼 前言 這篇文章講的是順序表的兩種實現方式。 1.什么是順序表 線性表的順序表示指的是用一組地址…

Double 4 VR情景智能互動教學系統在商務旅行課堂中的應用

一、提高學生的學習興趣 傳統的商務旅行課堂教學方式往往是教師講授理論知識,學生被動接受。這種方式很難激發學生的學習興趣,而Double 4 VR情景智能互動教學系統則可以通過虛擬現實技術,將商務旅行的場景生動地展示給學生,讓學生…

醫院如何做好漏費管理?什么是控費系統?控費系統現在成熟嗎?

在中國深厚的人情土壤之中,某些醫院里的醫技科室,宛如隱秘的灰色地帶,悄然滋生著利用職務之便謀取私利的暗流。這些科室的醫務人員,以低于醫院明文規定的收費標準,私下里為熟識的患者提供檢查服務,仿佛形成…

【碎碎念4】向上社交

好久沒寫碎碎念系列了,最近關注到身邊一些社交關系,想要和大家聊聊向上社交這件事情。首先小田認為向上社交或者僅僅是社交本身是無論什么年紀都需要關注的,因為處理好關系不僅僅會幫助我們把握好機會,同時也能讓我們更好的建立自…

undolog

undolog回滾段 undolog執行的時間:在執行器操作bufferpool之前。 undolog頁

我覺得這個域名證書監控平臺又吊打Uptimekuma了

前面我們講過uptimekuma 如何監控域名證書,很多人都喜歡 uptimekuma 那高端暗黑的色系上,然而最實用就是它的域名證書監控和歷史可用性圖表的展示上了,如下如: 但是這個東西吧,好看嗎?好看,有用…

llama3 發布!大語言模型新選擇 | 開源日報 No.251

meta-llama/llama Stars: 53.0k License: NOASSERTION llama 是用于 Llama 模型推理的代碼。 提供了預訓練和微調的 Llama 語言模型,參數范圍從 7B 到 70B。可以通過下載腳本獲取模型權重和 tokenizer。支持在本地快速運行推理,并提供不同規格的模型并…

機器學習作業4——樸素貝葉斯分類器

目錄 一、理論 一個例子: 二、代碼 對于代碼的解釋: 1.fit函數: 2.predict函數: 三、實驗結果 原因分析: 一、理論 樸素貝葉斯分類器基于貝葉斯定理進行分類,通過后驗概率來判斷將新數據歸為哪一類。通過利用貝…

MFC的CPen與CBush畫圖對象使用步驟

在MFC中,CPen和CBrush是兩個常用的繪圖對象,分別用于定義畫筆和畫刷,可以用于繪制圖形、填充區域等。下面我會詳細介紹如何在MFC中使用CPen和CBrush來繪制和填充圖形。 使用 CPen 繪制圖形: 創建 CPen 對象: 首先&am…

橋梁監控可視化大屏:現代橋梁管理的必備呀。

橋梁監控上可視化有幾個重要的原因: 01.實時監控: 可視化的監控系統可以實時顯示橋梁的各項監測數據,包括結構變形、振動、溫度等,使監控人員能夠實時了解橋梁的狀態,及時發現異常情況并采取相應的措施。 02.數據分析…

MySQL前綴索引、臟頁和干凈頁、COUNT(*)討論、表刪除內存問題

文章目錄 如何加索引如何給身份證號添加索引 SQL語句變慢臟頁 (Dirty Pages)干凈頁 (Clean Pages)為何區分臟頁和干凈頁處理臟頁管理策略 flush如何控制 為什么刪除表數據后表文件大小不變問題背景核心原因數據存儲方式參數影響 解決方案1. 調整innodb_file_per_table設置2. 使…

C#之三目運算、三元運算

三目運算也叫三元運算是一種簡單的條件語句,也稱為條件運算符。它可以根據一個表達式的結果確定另一個表達式的值。三目運算符使用“?”和“:”來表示。 注意使用bool值進行運算 三目運算符: 套路 三個空位 兩個符號 固定寫法 : 空位1 ? 空位2 : 空位3; 關鍵…

2024.5.8 —— LeetCode 高頻題復盤

目錄 檢測循環依賴7. 整數反轉LCR 170. 交易逆序對的總數55. 跳躍游戲45. 二叉樹的后序遍歷50. Pow(x, n)40. 組合總和 II74. 搜索二維矩陣26. 刪除有序數組中的重復項61. 旋轉鏈表 檢測循環依賴 題目鏈接 def haveCircularDependency(self, n: int, prerequisites):g [[]for…

MATLAB實現遺傳算法優化選址-路徑LRP問題(Location-Routing Problem)

MATLAB實現遺傳算法優化選址-路徑LRP問題(Location-Routing Problem) 一、模型 選址車輛路徑問題(Location-Routing Problem, LRP)是一個組合優化問題,旨在同時優化設施位置的選擇和車輛的配送路徑。在這個問題中,我們考慮一個由…

機器學習 - 決策樹

1. 決策樹基礎 定義與概念 決策樹是一種監督學習算法,主要用于分類和回歸任務。它通過學習從數據特征到輸出標簽的映射規則,構建一個樹形結構。在分類問題中,決策樹的每個葉節點代表一個類別。 案例分析 假設我們有一個關于天氣和是否進行…

linux防火墻的操作

linux防火墻的操作 前言1查看防火墻狀態2暫時關閉防火墻3永久關閉防火墻4開啟防火墻5開啟指定端口6關閉指定端口7立即生效8查看開放的端口前言 systemctl是管理linux中服務的命令,可以對服務進行啟動、停止、重啟、查看狀態等操作 firewall-cmd是linux中專門用于控制防火墻的…