1. 程式人生 > >記憶體分配和GC觸發

記憶體分配和GC觸發

物件分配

  1. 優先在Eden區分配。當Eden區沒有足夠空間分配時, VM發起一次Minor GC, 將 Eden區和其中一塊Survivor區內尚存活的物件放入另一塊Survivor區域。如Minor GC時survivor空間不夠,物件提前進入老年代,老年代空間不夠時進行Full GC;
  2. 大物件直接進入老年代,避免在Eden區和Survivor區之間產生大量的記憶體複製, 此 外大物件容易導致還有不少空閒記憶體就提前觸發GC以獲取足夠的連續空間.

物件晉級

  1. 年齡閾值:VM為每個物件定義了一個物件年齡(Age)計數器, 經第一次Minor GC後 仍然存活, 被移動到Survivor空間中, 並將年齡設為1. 以後物件在Survivor區中每熬 過一次Minor GC年齡就+1. 當增加到一定程度(-XX:MaxTenuringThreshold, 預設 15), 將會晉升到老年代.
  2. 提前晉升: 動態年齡判定;如果在Survivor空間中相同年齡所有物件大小的總和大 於Survivor空間的一半, 年齡大於或等於該年齡的物件就可以直接進入老年代, 而無 須等到晉升年齡.

從年輕代空間(包括 Eden 和 Survivor 區域)回收記憶體被稱為 Minor GC, 對老年代GC稱為Major GC,而Full GC是對整個堆來說;

Minor GC觸發條件:當Eden區滿時,觸發Minor GC。

Full GC觸發條件:

  1. System.gc()
  2. 老年代空間不足
  3. 永生區空間不足
  4. 統計得到的MinorGC晉升到舊生代的平均大小大於老年代 的剩餘空間
  5. 堆中分配很大的物件

相關推薦

記憶體分配GC觸發

物件分配優先在Eden區分配。當Eden區沒有足夠空間分配時, VM發起一次Minor GC, 將 Eden區和其中一塊Survivor區內尚存活的物件放入另一塊Survivor區域。如Minor GC時survivor空間不夠,物件提前進入老年代,老年代空間不夠時進行Ful

jvm學習筆記(3)——java物件的記憶體分配物件的回收(GC

引言:         之前的文章已經提過,java物件例項是存放在堆上的,至於是在伊甸區、存活區還是老年區,這些都是從物件回收(GC)角度來進行的邏輯劃分。所以我們先說物件的回收(GC),然後再依據GC的策略來說明新的物件具體在哪個區生成。 GC(Garbage C

GC發生時記憶體分配回收策略

在《深入理解java虛擬機器》一書中讀到3.6章節,記憶體分配和回收策略: 預備知識 java堆=年輕代(Eden+Survivor+Survivor)+老年代 Eden:Survivor:Survivor預設比例8:1:1,每次年輕代使用率90%(Ede

JVM(一)——GC記憶體分配垃圾回收

心得:Java中垃圾回收和記憶體可以實現高度的自動化,棧幀可以由JVM自動分配和回收,區域性變量表和運算元棧也可以在編譯時就確定好,堆中的記憶體分配和回收才是JVM關注的重點,JVM實現大多采用可達性分析來標記存活物件,什麼時候標記?讓使用者執行緒主動跑到那些安

簡述Java記憶體分配回收策略以及Minor GC Major GC(Full GC)

記憶體分配: 1. 棧區:棧可分為Java虛擬機器和本地方法棧 2. 堆區:堆被所有執行緒共享,在虛擬機器啟動時建立,是唯一的

Java記憶體分配管理

Java記憶體分配與管理是Java的核心技術之一,之前我們曾介紹過Java的記憶體管理與記憶體洩露以及Java垃圾回收方面的知識,今天我們再次深入Java核心,詳細介紹一下Java在記憶體分配方面的知識。一般Java在記憶體分配時會涉及到以下區域:   ◆暫存器:我們在程式中無法控制   ◆

Linux夥伴系統原理-記憶體分配釋放

主要分析Linux夥伴系統演算法,記憶體的分配和釋放 1.夥伴系統簡介      Linux核心記憶體管理的一項重要工作就是如何在頻繁申請釋放記憶體的情況下,避免碎片的產生, Linux採用夥伴系統解決外部碎片的問題,採用slab解決內 部碎片的問

自動記憶體管理機制(4)- 記憶體分配回收策略

自動記憶體管理機制(4)- 記憶體分配和回收策略 Java所承諾的自動記憶體管理主要是針對物件記憶體的回收和物件記憶體的分配。 在Java虛擬機器的五塊記憶體空間中,程式計數器、Java虛擬機器棧、本地方法棧記憶體的分配和回收都具有確定性,一般在編譯階段就能確定需要分配的記憶體大小,

oracle 記憶體分配調優 總結

一直都想總結一下oracle記憶體調整方面的知識,最近正好優化一個數據庫記憶體引數,查詢一些資料並且google很多下。現在記錄下來,做下備份。                 &

C語言 記憶體分配static關鍵字

C語言記憶體分配機制 (1)程式碼區(text segment)。.text程式碼區指令根據程式設計流程依次執行,對於順序指令,則只會執行一次(每個程序),如果反覆,則需要使用跳轉指令,如果進行遞迴,則需要藉助棧來實現。程式碼區的指令中包括操作碼和要操作的物件(

Java 記憶體區域GC機制

目錄 Java垃圾回收概況   Java GC(Garbage Collection,垃圾收集,垃圾回收)機制,是Java與C++/C的主要區別之一,作為Java開發者,一般不需要專門編寫記憶體回收和垃圾清理程式碼,對記憶體洩露和溢位的問題,也不需要像C程式設計師那樣戰戰

jvm記憶體分配垃圾回收機制

問題: 1、垃圾回收目標物件? 2、什麼時間進行垃圾回收?(面試最常見的問題之一) 3、jvm怎樣進行垃圾回收? jvm記憶體分配 執行緒共享區域 1、 堆 2、方法區 執行緒私有區域 1、jvm棧 2、本地方法棧 3、程式計數器 由於虛擬機器棧,

JVM初探- 記憶體分配GC原理與垃圾收集器

    JVM記憶體的分配與回收大致可分為如下4個步驟: 何時分配 -> 怎樣分配 -> 何時回收 -> 怎樣回收.     除了在概念上可簡單認為new時分配外, 我們著重介紹後面的3個步驟: I. 怎樣分配- JVM記憶體分配策略 物件記憶體主要分配

最簡單例子圖解JVM記憶體分配回收

一、簡介 JVM採用分代垃圾回收。在JVM的記憶體空間中把堆空間分為年老代和年輕代。將大量(據說是90%以上)建立了沒多久就會消亡的物件儲存在年輕代,而年老代中存放生命週期長久的例項物件。年輕代中又被分為Eden區(聖經中的伊甸園)、和兩個Survivor區。新的物件分配是首先放在Eden區

JVM物件分配GC分佈【JVM】

最近在學習java基礎結構,剛好學到了jvm,總結了以下並可以結合思維導圖認識以下Jvm的物件: 棧:什麼是棧? 先說一下棧的資料結構吧,棧它是一種先進後出的資料結構(FILO),跟佇列剛好相反(先進先出FIFO),生活中有哪些例子, 舉個例子 給子彈上膛,上彈的操作就類似於棧的資料結構,先壓入的子彈

Java 記憶體分配回收機制

Java的GC機制是自動進行的,和c語言有些區別需要程式設計師自己保證記憶體的使用和回收。 Java的記憶體分配和回收也主要在Java的堆上進行的,Java的堆中儲存了大量的物件例項,所以Java的堆也叫GC堆。 Java在垃圾收集的過程中,主要用到了分代收集演算法,

記憶體管理GC演算法以及回收策略

記憶體管理和垃圾回收 JVM記憶體組成結構 JVM棧由堆、棧、本地方法棧、方法區等部分組成,結構圖如下所示:   JVM記憶體回收 Sun的JVMGenerationalCollecting(垃圾回收)原理是這樣的:把物件分為年青代(Young)、年老代(

cuda二維陣列記憶體分配資料拷貝

因為cuda具有高效利用GPU進行科學計算的優勢,而人工智慧的重點之一就是複雜的計算任務,因此學好GPU計算是學習AI的重點任務。這裡,我們即將進行利用共享記憶體的矩陣運算。 我們看一個例子,如何對矩陣進行分配顯示卡記憶體以及元素賦值操作。通常來講,在GPU中分配記憶體使用的是cudaMalloc函式,

Java直接記憶體分配釋放方式

一. 正常分配,回收由GC負責 新增jvm啟動引數:-verbose:gc -XX:+PrintGCDetails -XX:MaxDirectMemorySize=40M 迴圈執行以下程式碼,可以看到頻繁fullGC. ByteBuffer buffer =

Linux中的記憶體分配釋放之slab分配器分析(完)

        我們在上篇文章分析cache_grow()函式的時候涉及兩個函式,我們沒有細說。一個就是kmem_getpages()和kmem_freepages()函式,這兩個函式有3個引數。kmem_cahce_t:主要是把申請到的物件加到這個快取記憶體內   flag