1. 程式人生 > >深入JVM 原理(七)老年代、永久代和元空間

深入JVM 原理(七)老年代、永久代和元空間

目錄

老年代

老年代主要接收由年輕代傳送過來的物件,一般情況下,經過了數次Minor GC 之後還會儲存下來的物件才會進入到老年代。如果要儲存的物件超過了伊甸園區的大小,此物件也將直接儲存在老年代之中,當老年代記憶體不足時,將引發 “major GC”,即,“Full GC”。

在老年代裡面會採用兩種演算法結合的模式實現GC的處理:整理-壓縮。

這裡寫圖片描述

在回收清除的過程之中,發現所有在老年代中被回收的物件並沒有進行空間的整理,所以老年代最頭疼的就是碎片化問題。

這裡寫圖片描述

以後再進行老年代儲存的時候儘可能儲存長期會被使用的物件,並且不會被輕易回收的大物件。

這裡寫圖片描述

範例:設定老年代引數(java -Xms2G -Xmx2G -XX:+PrintGCDetails -XX:PretenureSizeThreshold=512k -XX:NewRatio=2 TestDemo)
此時,如果超過512k的物件將直接被儲存在老年代之中,也就是說。這個物件不會觸發 Minor GC。(因為不在年輕代進行儲存)

永久代(JDK 1.8 後消失)

雖然JAVA 的版本是 JDK 1.8 ,但是 JavaEE的版本還是JDK1.7,也就是說,在JavaEE裡面必須對永久代進行設定。永久代也是在堆記憶體中儲存的,但是永久代不會被回收,例如:intern()方法產生的物件不會被回收。如果操作不當,導致永久代中的資料量過大,那麼這個時候程式會報出 OOM 問題。
一般情況下不會出現這種問題;
這裡寫圖片描述

-XX:MaxPermSize: 設定永久代的最大值
-XX:PremSize:設定永久代的初始大小

範例:設定永久代引數(java -XX:MaxPermSize10M TestDemo)
在JDK 1.8之中設定永久代會報出錯誤

Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize10M; support was removed in 8.0

元空間

元空間是JDK 1.8 之後才有的,功能和永久代類似。唯一到的區別是,永久代使用的是JVM的堆記憶體空間,而元空間使用的是實體記憶體,直接受到本機的實體記憶體限制。
這裡寫圖片描述

範例“設定一些引數,讓元空間出錯(java -XX:MaxMetaspaceSize=1m XX:MetaspaceSize=1m TestDemo)
此時會報出“OutOfMemoryError:Metaspace”,元空間記憶體不足。

相關推薦

深入JVM 原理年代永久空間

目錄 老年代 老年代主要接收由年輕代傳送過來的物件,一般情況下,經過了數次Minor GC 之後還會儲存下來的物件才會進入到老年代。如果要儲存的物件超過了伊甸園區的大小,此物件也將直接儲存在老年代之中,當老年代記憶體不足時,將引發 “major GC”,

jvm裡面年輕年代永久空間

1.年輕代 年輕代主要有三個區域組成,一個是Eden區域,另一個是存活區1和存活區2。Eden主要負責物件的建立,存活區1和存活2主要負責向老年代普及物件,存活區1和存活區2這兩個區域裡面總存在一個是空的,為什麼這兩個區域裡面有一個空的呢?因為這兩個區域需要負責回收年輕代活躍物件,需要把這些年輕

JVM內存:年輕年代永久推薦 轉

回收 以及 平靜的 保持 size 個人 對象更新 you 應用 參考文章: 1.Java 新生代、老年代、持久代、元空間 2.Java內存與垃圾回收調優 3.方法區的Class信息,又稱為永久代,是否屬於Java堆? Java 中的堆是 JVM 所管理的最大的一塊內存空

深入JVM 原理Java堆記憶體調整引數調優關鍵

目錄 堆記憶體的引數調整 通過之前的分析可以發現,實際上每一塊子記憶體區中都會存在有一部分的可變伸縮區,其基本流程: 如果空間不足,在可變的範圍之內擴大記憶體空間,當一段時間之後發現記憶體空間沒有這麼緊張的時候,再將可變空間進行釋放。所以在整個調整

深入JVM 原理JVM垃圾回收流程

目錄 我們所有的資料都會儲存在JVM的堆記憶體之中,但是實際的開發中會經常建立很多臨時物件和常駐物件。所以,為了保證GC的效能問題,對於GC的處理流程如下圖所示: 對於整個GC流程裡,最需要處理的就是年輕代和老年代的記憶體清理操作,而元空間(永久代)都不在GC範圍

深入JVM系列之類載入類載入器雙親委派機制與常見問題

一.概述 定義:虛擬機器把描述類的資料從Class檔案載入到記憶體,並對資料進行校驗、轉換解析和初始化,最終形成可以被虛擬機器直接使用的java型別。類載入和連線的過程都是在執行期間完成的。 二.

重學計算機組成原理- 程式無法同時在LinuxWindows下執行?

既然程式最終都被變成了一條條機器碼去執行,那為什麼同一個程式,在同一臺計算機上,在Linux下可以執行,而在Windows下卻不行呢? 反過來,Windows上的程式在Linux上也是一樣不能執行的 可是我們的CPU並沒有換掉,它應該可以識別同樣的指令呀!!! 如果你和我有同樣的疑問,那這一節,我們就一起

Java基礎集合框架

資料多了用物件存,物件多了用集合存。集合就是儲存物件最常用的一種方式。 集合長度可變,陣列長度不可變,陣列只能存同一種物件。 集合框架頂層就是Collection(介面)。 每一個容器對資料的儲存方式都有不同。 資料在記憶體中的構成情況(儲存方式)成為資料結構。 s

jvm的新生代年代永久關係

原文地址:https://blog.csdn.net/iechenyb/article/details/79424974新生代分為三個區域,一個Eden區和兩個Survivor區,它們之間的比例為(8:1:1),這個比例也是可以修改的。通常情況下,物件主要分配在新生代的Ede

JVM垃圾收集器 —— 年代垃圾收集器

上一篇文章講了新生代的垃圾收集器,這篇文章我們來講講老年代的垃圾收集器 Serial Old收集器 1、說明:一個單執行緒收集器,使用“標記-整理”演算法。其實就是Serial收集器老年代的版本 2、優缺點 和 執行圖 和Serial收集器一樣,所以這裡就不多贅

根據應用程式設定JVM引數-設定堆新生代年代持久大小

一、根據程式的執行狀況檢視其活躍的資料量 ①、活躍的資料: 1.應用程式運行於穩定狀態時,老年代佔用的java堆大小 2.應用程式運行於穩定狀態時,永久代佔用的java堆大小 其實就是FullGc後這2個數據的大小 ②、動手測試:1.測試程式碼: public cl

編碼原理 --回顧

byte col size roc 進制 圖片 com 占用 像素 上一篇我們講解了熵編碼的另一種方式CABAC,熵編碼結束之後,那麽整個編碼過程的核心過程也就結束了,後續的工作就是為了適配網絡發送等做一些封裝的工作。本篇對整體的編碼過程作一個簡單的回顧,整體上感知一下一

JVM原理類載入機制與GC演算法

一. 類的載入機制 過程 將.class的二進位制資料讀入記憶體,放入方法區中 在堆中建立一個java.lang.Class物件,封裝類在方法區中的資料結構,並提供訪問方法區資料結構的介面 類的生命週期 類的載入過程

jvm原理34虛方法表與動態分派機制詳解

編寫程式碼: public class MyTest7 { public static void main(String[] args) { Animal animal = new Animal(); Animal

執行緒池原理:執行緒池的使用

這篇文章通過介紹執行緒池的常見用法,總結前面學習到的內容。 主要包括 ThreadPoolExecutor的使用 ScheduledThreadPoolExecutor的使用 ExecutorCompletionService的使用 1. 統計某個區間

深入JVM系列之GC機制收集器與GC調優

一、回顧JVM記憶體分配 1.1、記憶體分配: 1、物件優先在EDEN分配 2、大物件直接進入老年代  3、長期存活的物件將進入老年代  4、適齡物件也可能進入老年代:動態物件年齡判斷 動態物件年齡判斷: 虛擬機器並不總是要求物件的年齡必須達到MaxTenuring

jvm原理26位元組碼訪問標誌與欄位表詳解

先看一下java位元組碼的結構: 圖1: 圖2: 圖3: Class位元組碼中有2中資料結構 位元組資料直接量:這是基本的資料型別。共細分為u1、u2、u4、u8四種,分別代表連續的1個位元組 、2個位元組、四個位元組、8個位元組組成的

jvm原理27Java位元組碼方法表與屬性表深度剖析

上一節說到成員變數,這一節說一下方法表 圖一: 圖二: 圖三: 行號00000120 開始就是方法表的開始,剛開始2個位元組是方法的數量:00 03 是三個方法(無參構造器、變數a的get和set方法) 方法表: 型別 名稱

漫談計算機組成原理I/O系統

本文講什麼? 這個系列的文章其實可以分成兩個部分,計算機系統的其他硬體結構和CPU。 而我們今天要講述的內容,就是其他硬體結構中的最後一個部分——I/O(輸入輸出)系統。 這篇文章主要講述的就是I/O系統的組成以及I/O系統的工作原理,下面就正式開始I/O

深入JVM系列之記憶體模型與記憶體分配

Java 方法棧也是執行緒私有的,每個 Java 方法棧都是由一個個棧幀組成的,每個棧幀是一個方法執行期的基礎資料結構,它儲存著區域性變量表、運算元棧、動態連結、方法出口等資訊。當執行緒呼叫呼叫了一個 Java 方法時,一個棧幀就被壓入(push)到相應的 Java 方法棧。當執行緒從一個 Java 方法