垃圾回收是JAVA中的一個大知識點,也是一個著名知識點,畢竟JAVA號稱自己先進性的時候總是會帶上垃圾回收。於是,它也成了面試中的常客,面試官動不動的就要你解釋下什麼是垃圾回收,以及它的原理是什麼。當然,雖然,以及肯定,那個問你垃圾回收的面試官他99%也只是略知皮毛而已。當面試官問你什麼是垃圾回收機制的時候,你應該這樣一本正經的反問:請問您問的哪個VM中的垃圾回收機制?
由於垃圾回收涉及的概念複雜,演算法複雜,你若想弄清楚其中的全部細節,必定得不償失。但是,如果我們掌握了以下的垃圾回收機制的概要,相信在絕大部分的面試中你不會失分。
一:什麼是垃圾?
舉例來說,一個物件你不用了,它就是垃圾,例如:
public void test01(){
User user = new User();
//...
}
test01方法執行完畢,user物件沒有任何用處了,那它就是垃圾了。
二:為什麼要進行垃圾回收?
我們知道,物件是存放在堆上的,那麼堆有多大?雖然可以透過指令參數進行調整,但是通常情況下,32位元系統下,Java堆大小設定在2 GB其中,500 MB 分配給新生代(YoungGen)1.5 GB的分配給老年代(OldGen)空間。即便64位,想想我們PC的硬體記憶體能有多大。
所以,沒用的垃圾,統統回收,讓出記憶體空間,給其它物件用。
三:JDK預設的HotSpot VM垃圾回收的機制
1:堆記憶體的分類
#要理解這個機制,首先得明白堆的分類。是的,我們光知道物件存在於堆上,但不知道堆內部也分成幾個空間,如下圖:
Young/New Generation 新生代
其內部又分為Eden 與兩個Survivor Space 組成。新建的物件都將分配到新生代中,
Old/Tenured Generation 老年代
舊年代用於存放程序中經過幾次垃圾回收後存活的物件
(PS:Permanent Generation 非堆疊內存,用於存放靜態文件,如Java類別、方法等。持久代對垃圾回收沒有顯著影響。)
2:回收順序
每個空間的執行順序如下:
- ##絕大多數剛剛被創造的物件會存放在伊甸園空間。
- 在伊甸園空間執行了第一次GC之後,存活的物件被移動到其中一個倖存者空間。
- 此後,在伊甸園空間執行GC之後,存活的對象會被堆積在同一個倖存者空間中。
- 當一個倖存者空間飽和,還在存活的物件會被移到另一個倖存者空間。之後會清空已經飽和的那個倖存者空間。
- 在以上的步驟中重複幾次依然存活的對象,就會被移到老年代。
四:垃圾收集器與回收演算法
兩種類型的代都有自己的收集器,每種收集器採用不同的演算法。請記住,對於初級選手,我們並不需要掌握每個演算法原理。 新生代收集器使用的收集器:Serial、PraNew、Parallel Scavenge老年代收集器使用的收集器:Serial Old、Parallel Old、CMS#其對應的演算法如下,Serial收集器(複製演算法)
#新生代單執行緒收集器,標記和清理都是單線程,優點是簡單且有效率。Serial Old收集器(標記-整理演算法)
老年代單執行緒收集器,Serial收集器的老年代版本。ParNew收集器(停止-複製演算法)
新生代收集器,可以認為是Serial收集器的多執行緒版本,在多核心CPU環境下有著比Serial更好的表現。Parallel Scavenge收集器(停止-複製演算法)
#並行收集器,追求高吞吐量,高效利用CPU。吞吐量一般為99%,吞吐量= 使用者執行緒時間/(使用者執行緒時間+GC執行緒時間)。適合後台應用程式等對互動相應要求不高的場景。Parallel Old收集器(停止-複製演算法)
Parallel Scavenge收集器的老年代版本,並行收集器,吞吐量優先#CMS(Concurrent Mark Sweep)收集器(標記-清理演算法)
高併發、低停頓,追求最短GC回收停頓時間,cpu佔用比較高,反應時間快,停頓時間短,多核心cpu 追求高反應時間的選擇
#五:什麼時候會運行垃圾回收?
垃圾回收有兩種類型,Scavenge GC和Full GC。
當新物件生成,並且在Eden申請空間失敗時,就會觸發Scavenge GC。此時會對新生代進行垃圾回收。
當,年老代(Tenured)被寫滿、持久代(Perm)被寫滿、System.gc()被顯示調用、上一次GC之後Heap的各域分配策略動態變化,執行Full GC。
注意,無論是那種回收,並不意味著會把全部的垃圾回收掉,而是根據演算法自己的判斷,在一段時間內除掉一定數量的垃圾,這個時間和數量我們不可知。
以上,就是你必須知道的垃圾回收機制。
以上是JAVA垃圾回收機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!

ByteCodeachievesPlatFormIndenceByByByByByByExecutedBoviratualMachine(VM),允許CodetorunonanyplatformwithTheApprepreprepvm.Forexample,Javabytecodecodecodecodecanrunonanydevicewithajvm

Java不能做到100%的平台獨立性,但其平台獨立性通過JVM和字節碼實現,確保代碼在不同平台上運行。具體實現包括:1.編譯成字節碼;2.JVM的解釋執行;3.標準庫的一致性。然而,JVM實現差異、操作系統和硬件差異以及第三方庫的兼容性可能影響其平台獨立性。

Java通過“一次編寫,到處運行”實現平台獨立性,提升代碼可維護性:1.代碼重用性高,減少重複開發;2.維護成本低,只需一處修改;3.團隊協作效率高,方便知識共享。

在新平台上創建JVM面臨的主要挑戰包括硬件兼容性、操作系統兼容性和性能優化。 1.硬件兼容性:需要確保JVM能正確使用新平台的處理器指令集,如RISC-V。 2.操作系統兼容性:JVM需正確調用新平台的系統API,如Linux。 3.性能優化:需進行性能測試和調優,調整垃圾回收策略以適應新平台的內存特性。

javafxeffectife addressemanddressEndressencissencies uningusement insuplatform-agnosticsCenegraphandCsSsStyling.1)itabstractsplactsplatsplatsplatsplatsplatformsthroughascenegraph,確保consistentertrenderingrenderingrenderingacrosswindows,macoswindwind,Macos,MacOs.2)

JVM的工作原理是將Java代碼轉換為機器碼並管理資源。 1)類加載:加載.class文件到內存。 2)運行時數據區:管理內存區域。 3)執行引擎:解釋或編譯執行字節碼。 4)本地方法接口:通過JNI與操作系統交互。

JVM使Java實現跨平台運行。 1)JVM加載、驗證和執行字節碼。 2)JVM的工作包括類加載、字節碼驗證、解釋執行和內存管理。 3)JVM支持高級功能如動態類加載和反射。

Java應用可通過以下步驟在不同操作系統上運行:1)使用File或Paths類處理文件路徑;2)通過System.getenv()設置和獲取環境變量;3)利用Maven或Gradle管理依賴並測試。 Java的跨平台能力依賴於JVM的抽象層,但仍需手動處理某些操作系統特定的功能。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SublimeText3 英文版
推薦:為Win版本,支援程式碼提示!

SublimeText3 Linux新版
SublimeText3 Linux最新版

記事本++7.3.1
好用且免費的程式碼編輯器