1. 程式人生 > >「每日五分鐘,玩轉 JVM」:GC 概覽

「每日五分鐘,玩轉 JVM」:GC 概覽

前言

GC(Garbage Collection)是我們在學習 JVM 的過程中不可避免的一道坎,接下來,我們就來系統的學習一下 GC。

做一件事情之前,我們一定要去知道我們為什麼要去做,這裡不僅僅指 GC,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。

下面我們先去了解為什麼要有 GC,以及 GC 在 JVM 中扮演了一個什麼樣的角色,起到了什麼的作用?

為什麼要有 GC

用過 C++ 的同學可能知道,物件所佔的記憶體在程式結束執行之前一直被佔用,在明確釋放之前不能分配給其它物件。如果我們不去手動的清除這些無用的物件,記憶體很快就被佔滿,而在 JVM 中,GC 所起到的作用就是一個清道夫,它可以幫助我們去判定哪些物件是無用物件,怎麼進行垃圾收集,以及決定記憶體分代和記憶體分配的策略**。

可能有同學會問了,既然我們的 JVM 會給我們做 GC 的工作,我們為什麼還要去學習 GC 呢,一切交給 JVM 不好嗎?當然,在我們的日常情況下,我們一般不會去關心 GC 的一些細節,但是當我們遇到記憶體洩露,記憶體溢位,高併發瓶頸的時候,我們就需要去對 GC 開刀,進行更為細緻的監控和調節。

記憶體洩露:指程式中己動態分配的堆記憶體由於某種原因程式未釋放或無法釋放,造成系統記憶體的浪費,導致程式執行速度減慢甚至系統崩潰等嚴重後果。

記憶體溢位:應用系統中存在無法回收的記憶體或使用的記憶體過多,最終使得程式執行要用到的記憶體大於能提供的最大記憶體。

那麼現在問題來了,我們要進行垃圾回收,首先我們需要知道垃圾在哪

垃圾在哪

前面我們講了JVM 的執行時記憶體區域,知道執行緒可以分為執行緒獨佔區和執行緒共享區,其中執行緒獨佔區(程式計數器,虛擬機器棧,本地方法棧)的記憶體生命週期是和執行緒保持一致,且這幾個區域分配的記憶體大小跟類的大小有關,也就是說,當我們的類結構固定之後,這部分的記憶體就不會再發生更改,且當方法或執行緒結束的時候,記憶體自然就跟隨著回收了.

而執行緒共享區的堆記憶體和方法區則不一樣,堆記憶體和方法區所用的記憶體是在編譯期間無法確定的,因為一個介面的不同實現,一個方法的不同控制條件分支所執行的程式碼可能完全相反,我們只有在執行時才知道會建立哪些物件,這部分的記憶體的分配和回收是動態的,而我們的 GC 關注的就是該部分的記憶體。

打個比方來說:JVM 如果是一輛車,執行緒獨佔區的就像是零件,在出廠時這些零件的壽命基本上都是已知的,執行緒共享區就像是汽油,汽油的消耗跟我們所採用的路線有關,所以我們關注的部分就是這部分會動態變化的,比如如何開車才能更省油~

知道了垃圾在什麼位置會出現,我們下一步就需要去判定在這些區域的有哪些是垃圾~

下節預告

本節內容到這裡先告一段落,下一節我們來學習,怎麼去判定是否為垃圾~

公眾號

相關推薦

每日分鐘 JVMGC 概覽

前言 GC(Garbage Collection)是我們在學習 JVM 的過程中不可避免的一道坎,接下來,我們就來系統的學習一下 GC。 做一件事情之前,我們一定要去知道我們為什麼要去做,這裡不僅僅指 GC,更適用我們日常的學習和生活,知其然,知其所以然,方能百戰不殆。 下面我們先去了解為什麼要有 GC,

每日分鐘JVM執行緒獨佔區

前言 如果我們對計算機組成有所瞭解,那麼我們一定會知道在計算機中有一塊兒特殊的區域,稱之為暫存器,暫存器包括了指令暫存器和程式計數器,這兩樣位於CPU中,作為程式執行的大腦來控制程式的執行和流轉。 而在JVM中,作為一種虛擬機器,JVM沒有指令暫存器,它是基於棧 + 程式計數器的體系結構來完成方法的執行,之所

每日分鐘JVM執行緒共享區

前言 上一篇中,我們瞭解了JVM中的執行緒獨佔區,這節課我們就來了解一下JVM中的執行緒共享區,JVM中的執行緒共享區是跟隨JVM啟動時一起建立的,包括堆(Heap)和方法區()兩部分,而執行緒獨佔區的程式計數器,虛擬機器棧,本地方法棧的生命週期都是跟隨執行緒的,隨執行緒的建立而誕生,隨執行緒的銷燬而銷燬。

每日分鐘JVM物件從哪來

面向物件 眾所周知,Java是一門面向物件的高階程式語言,那麼現在問題來了,物件從哪來呢?有些人會說通過new關鍵字來建立一個物件,說的很好,本篇我們就來解密在new一個物件的過程中,JVM都給我們做了什麼工作。 走哪來,到哪去 一個物件的誕生必定有一個類,通常我們都是通過new關鍵字例項化一個類來獲取該類的

每日分鐘JVM物件記憶體佈局

概覽 一個物件根據不同情況可以被劃分成兩種情況,當物件是一個非陣列物件的時候,物件頭,例項資料,對齊填充在記憶體中三分天下,而陣列物件中在物件頭中多了一個用於描述陣列物件長度的部分 物件頭 物件頭分為兩部分,第一部分稱之為"Mark Word",第二部分是用於獲取該物件型別的型別指標,

每日分鐘JVM指標壓縮

64位JVM和32位JVM 最初的時候,JVM是32位的,但是隨著64位系統的興起,JVM也迎來了從32位到64位的轉換,32位的JVM對比64位的記憶體容量比較有限,但是我們使用64位虛擬機器的同時,也帶來了一個問題,64位下的JVM中的物件會比32位中的物件多佔用1.5倍的記憶體空間,這是我們不想看到的

每天分鐘 JVM物件訪問定位

### 前言 在「物件記憶體佈局」一節中,我們瞭解到物件頭中包含了一個叫做**型別指標**的東西,即物件指向它的類元資料的指標,虛擬機器通過這個指標來確定這個物件是哪個類的例項。但是,並不是所有的虛擬機器都是這麼去做的。不同的虛擬機器關於這點有不同的實現,目前主流的方式可以分為**控制代碼**和**直接指標

ThinkPHP分頁用異步來做分頁類!

sse replace xpage private 替換 string 設置 nbsp urlencode 具體為什麽用異步來做分頁我就不多說了! 用異步來做分頁,主要還是看分頁類怎麽玩! 方便管理,還是把Ajax分頁作為一個工具來使用: 同樣新建工具類: 多次嘗試,最終

忘記Ghost!利用Win10自帶功能系統備份&恢復 -- 關於恢復的深度思考

如果 mage 不能啟動 技術 硬盤 blog 引導 系統版本 bsp 上一篇文章講了,系統可以正常啟動,如何從D盤恢復系統到C盤的情況。 如果系統不能啟動,要怎麽去恢復系統,恢復後會是什麽結果? 先說明系統結構: 系統版本:Windows 10 (1709) 硬盤1(

【程序員的吃雞大法】利用OCR文字識別+百度算法搜索沖頂大會、百萬英雄、芝士超人等答題贏獎金遊戲

amp lec ios 結果 round 去百度 方式 英雄 oid 【先上一張效果圖】: 一、原理: 其實原理很簡單: 1.手機投屏到電腦; 2.截取投屏畫面的題目部分,進行識別,得到題目和三個答案; 3.將答案按照一定的算法,進行搜索,得出推薦答案; 4.添加了一

zookeeper-1.操作與應用場景-《每日分鐘搞定大數據》

分享 似的 每日 文件 實現 多個 tasks 回復 task Zookeeper作為一個分布式協調系統提供了一項基本服務:分布式鎖服務,分布式鎖是分布式協調技術實現的核心內容。像配置管理、任務分發、組服務、分布式消息隊列、分布式通知/協調等,這些應用實際上都是基於這項

啟程 - 《每日分鐘搞定大數據》

alt 系列 梳理 分享 視頻 了解 href http 不定 ??想了很久,準備開始寫一系列的文章,記錄這些年來的所得所想,感覺內容比較多不知從哪裏開始,畫了個思維導圖確定了大的方向,內容會不斷添加。細節的東西我會邊寫邊定,大家也可以給我一些建議,我會根據寫的內容實時更

YARN-異常大全-《每日分鐘搞定大數據》

管理 cat love guarantee 解決 code 出現 shu sources #問題描述:NodeManager1 cpu負載飆高,進程還在但是不再向ResourceManager發送心跳,不斷重復下文2的動作。心跳停止一段時間後會重連上RM但是cpu仍然很高,

一篇文章搞懂DataSet、DataFrame、RDD-《每日分鐘搞定大數據》

implicit 操作數 frame 大數據 函數 for 臨時 變量 ade 1. 三者共性: 1、RDD、DataFrame、Dataset全都是spark平臺下的分布式彈性數據集,為處理超大型數據提供便利 2、三者都有惰性機制,執行trainform操作時不會立即執

你願意給我分鐘讓我帶你掌握正則表示式嗎?爬蟲必會知識點!

今天小編給大家分享的是Python正則表示式的簡單應用和示例演示,將前面學習的Python正則表示式做一個概括。       進群:548377875  即可獲取大量的零基礎學習資料以及從零基礎到專案實戰的PDF一套哦! &nb

zookeeper-操作與應用場景-《每日分鐘搞定大資料》

Zookeeper作為一個分散式協調系統提供了一項基本服務:分散式鎖服務,分散式鎖是分散式協調技術實現的核心內容。像配置管理、任務分發、組服務、分散式訊息佇列、分散式通知/協調等,這些應用實際上都是基於這項基礎服務由使用者自己摸索出來的。 1.Zookeeper在大資

Android圖片載入框架最全解析(四)Glide的回撥與監聽(筆記)

參考原文:Android圖片載入框架最全解析(四),玩轉Glide的回撥與監聽 回撥的原始碼實現 的Target物件傳入到GenericRequest當中,而Glide在圖片載入完成之後又會回撥GenericRequest的onResourceReady()方法,onReso

10個密信(MeSince)使用技巧郵件加密!

密信(MeSince)加密郵件客戶端不僅提供郵件收發及加解密等郵件核心功能,同時在多個方面提供創新功能、提升使用者體驗。以下10個密信(MeSince)使用技巧,帶您玩轉郵件加密!   下載安裝 密信(MeSince)加密郵件客戶端,支援iOS、安卓、Windows版

jvm系列 02】物件探祕

注意:本文描述的內容是基於HotSpot虛擬機器。 物件的建立 物件建立流程圖 物件建立流程 虛擬機器遇到一條new指令 檢查該指令引數在常量池中能否定位到對應類的符號引用 檢查該類是否被載入、解析和初始化,如果沒有必須先執行載入過程

jvm系列 01】Java虛擬機器的基本結構

Java虛擬機器架構圖 Java虛擬機器基本結構思維導圖 類載入子系統 類載入子系統負責從檔案系統或者網路中載入Class資訊,載入的類資訊存放於一塊稱為方法區的記憶體空間。 Java堆 Java堆是被所有執行緒共享的一塊記憶體區域,在虛擬機器啟動