自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

一篇聊聊JVM優(yōu)化:堆

開發(fā) 前端
對于Java應(yīng)用程序來說, Java堆(Java Heap) 是虛擬機(jī)所管理的內(nèi)存中最大的一塊。 Java堆是被所 有線程共享 的一塊內(nèi)存區(qū)域, 在虛擬機(jī)啟動時創(chuàng)建。

一、Java 堆概念

1、簡介

對于Java應(yīng)用程序來說, Java堆(Java Heap) 是虛擬機(jī)所管理的內(nèi)存中最大的一塊。 Java堆是被所 有線程共享 的一塊內(nèi)存區(qū)域, 在虛擬機(jī)啟動時創(chuàng)建。 此內(nèi)存區(qū)域的唯一目的就是存放對象實(shí)例, Java 世界里“幾乎”所有的對象實(shí)例都在這里分配內(nèi)存?!皫缀酢笔侵笍膶?shí)現(xiàn)角度來看, 隨著Java語 言的發(fā)展, 現(xiàn)在已經(jīng)能看到些許跡象表明日 后可能出現(xiàn)值類型的支持, 即使只考慮現(xiàn)在, 由于即時編譯技術(shù)的進(jìn)步, 尤其是逃逸分析技術(shù)的日漸強(qiáng)大, 棧上 分配、 標(biāo)量替換優(yōu)化手段已經(jīng)導(dǎo)致一些微妙的變化悄然發(fā)生, 所以說Java對象實(shí)例都分配在堆上也漸漸變得不是 那么絕對了。

2、堆的特點(diǎn)

(1)是Java虛擬機(jī)所管理的內(nèi)存中最大的一塊。

(2)堆是jvm所有線程共享的。 堆中也包含私有的線程緩沖區(qū) Thread Local Allocation Buffer (TLAB)

(3)在虛擬機(jī)啟動的時候創(chuàng)建。

(4)唯一目的就是存放對象實(shí)例,幾乎所有的對象實(shí)例以及數(shù)組都要在這里分配內(nèi)存。 (5)Java堆是垃圾收集器管理的主要區(qū)域。

(6)因此很多時候java堆也被稱為“GC堆”(Garbage Collected Heap)。從內(nèi)存回收的角度來看,由于現(xiàn)在收集器 基本都采用分代收集算法,所以Java堆還可以細(xì)分為:新生代和老年代;新生代又可以分為:Eden 空間、From Survivor空間、To Survivor空間。

(7)java堆是計(jì)算機(jī)物理存儲上不連續(xù)的、邏輯上是連續(xù)的,也是大小可調(diào)節(jié)的(通過-Xms和-Xmx控制)。

(8)方法結(jié)束后,堆中對象不會馬上移出僅僅在垃圾回收的時候時候才移除。

(9)如果在堆中沒有內(nèi)存完成實(shí)例的分配,并且堆也無法再擴(kuò)展時,將會拋出OutOfMemoryError異常

3、設(shè)置堆空間大小

1. 內(nèi)存大小-Xmx/-Xms

使用示例: -Xmx20m -Xms5m

說明: 當(dāng)下Java應(yīng)用最大可用內(nèi)存為20M, 最小內(nèi)存為5M

total Memory和最大的內(nèi)存之間還是存在一定 差異的,就是說JVM一般會盡量保持內(nèi)存在一個盡可能低的層面,而非貪婪做法按照最大的內(nèi)存來進(jìn)行分配。

其實(shí)JVM在分配內(nèi)存過 程中是動態(tài)的, 按需來分配的。

4、堆的分類

現(xiàn)在垃圾回收器都使用分代理論,堆空間也分類如下:

在Java7 Hotspot虛擬機(jī)中將Java堆內(nèi)存分為3個部分:

  • 青年代Young Generation
  • 老年代Old Generation
  • 永久代Permanent Generation

在Java8以后,由于方法區(qū)的內(nèi)存不再分配在Java堆上,而是存儲于本地內(nèi)存元空間Metaspace中,所以永久代就不 存在了,在幾天前(2018年9約25日)Java11正式發(fā)布以后,我從官網(wǎng)上找到了關(guān)于Java11中垃圾收集器的官方文檔, 文檔中沒有提到“永久代”,而只有青年代和老年代。

二、年輕代和老年代

1.JVM中存儲java對象可以被分為兩類:

1)年輕代(Young Gen):年輕代主要存放新創(chuàng)建的對象,內(nèi)存大小相對會比較小,垃圾回收會比較頻繁。年輕代分 成1個Eden Space和2個Suvivor Space(from 和to)。

2)年老代(Tenured Gen):年老代主要存放JVM認(rèn)為生命周期比較長的對象(經(jīng)過幾次的Young Gen的垃圾回收后仍 然存在),內(nèi)存大小相對會比較大,垃圾回收也相對沒有那么頻繁。

2.配置新生代和老年代堆結(jié)構(gòu)占比

默認(rèn) -XX:NewRatio=2 , 標(biāo)識新生代占1 , 老年代占2 ,新生代占整個堆的1/3

修改占比 -XX:NewPatio=4 , 標(biāo)識新生代占1 , 老年代占4 , 新生代占整個堆的1/5

Eden空間和另外兩個Survivor空間占比分別為8:1:1

可以通過操作選項(xiàng) -XX:SurvivorRatio 調(diào)整這個空間比例。 比如 -XX:SurvivorRatio=8 幾乎所有的java對象都在Eden區(qū)創(chuàng)建, 但80%的對象生命周期都很短,創(chuàng)建出來就會被銷毀

從圖中可以看出: 堆大小 = 新生代 + 老年代。其中,堆的大小可以通過參數(shù) –Xms、-Xmx 來指定。

默認(rèn)的,新生代 ( Young ) 與老年代 ( Old ) 的比例的值為 1:2 ( 該值可以通過參數(shù) –XX:NewRatio 來指定 ),即:新生 代 ( Young ) = 1/3 的堆空間大小。老年代 ( Old ) = 2/3 的堆空間大小。其中,新生代 ( Young ) 被細(xì)分為 Eden 和 兩個 Survivor 區(qū)域,這兩個 Survivor 區(qū)域分別被命名為 from 和 to,以示區(qū)分。 默認(rèn)的,Edem : from : to = 8 : 1 : 1 ( 可以 通過參數(shù) –XX:SurvivorRatio 來設(shè)定 ),即: Eden = 8/10 的新生代空間大小,from = to = 1/10 的新生代空間大小。 JVM 每次只會使用 Eden 和其中的一塊 Survivor 區(qū)域來為對象服務(wù),所以無論什么時候,總是有一塊 Survivor 區(qū)域 是空閑著的。因此,新生代實(shí)際可用的內(nèi)存空間為 9/10 ( 即90% )的新生代空間。

三、對象分配過程

JVM設(shè)計(jì)者不僅需要考慮到內(nèi)存如何分配,在哪里分配等問題,并且由于內(nèi)存分配算法與內(nèi)存回收算法密切相關(guān), 因此還需要考慮GC執(zhí)行完內(nèi)存回收后是否存在空間中間產(chǎn)生內(nèi)存碎片。

分配過程

1.new的對象先放在伊甸園區(qū)。該區(qū)域有大小限制

2.當(dāng)伊甸園區(qū)域填滿時,程序又需要創(chuàng)建對象,JVM的垃圾回收器將對伊甸園預(yù)期進(jìn)行垃圾回收(Minor GC),將伊 甸園區(qū)域中不再被其他對象引用的額對象進(jìn)行銷毀,再加載新的對象放到伊甸園區(qū)

3.然后將伊甸園區(qū)中的剩余對象移動到幸存者0區(qū)

4.如果再次觸發(fā)垃圾回收,此時上次幸存下來的放在幸存者0區(qū)的,如果沒有回收,就會放到幸存者1區(qū)

5.如果再次經(jīng)歷垃圾回收,此時會重新返回幸存者0區(qū),接著再去幸存者1區(qū)。

6.如果累計(jì)次數(shù)到達(dá)默認(rèn)的15次,這會進(jìn)入養(yǎng)老區(qū)。 可以通過設(shè)置參數(shù),調(diào)整閾值 -XX:MaxTenuringThreshold=N

7.養(yǎng)老區(qū)內(nèi)存不足是,會再次出發(fā)GC:Major GC 進(jìn)行養(yǎng)老區(qū)的內(nèi)存清理

8.如果養(yǎng)老區(qū)執(zhí)行了Major GC后仍然沒有辦法進(jìn)行對象的保存,就會報OOM異常

分配對象流程分配對象流程


責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2022-06-04 07:46:41

HeapJVM

2022-06-02 07:11:13

JVMJava

2023-09-21 08:05:49

Mybatis插件開發(fā)

2023-07-14 12:28:07

JVM優(yōu)化操作

2023-08-03 07:34:34

格式化字符串參數(shù)

2023-09-01 08:59:57

2022-01-14 11:45:40

JVM 虛擬機(jī)Java

2022-01-17 11:28:55

JVM 虛擬機(jī)Java

2019-12-30 11:25:06

Jvm運(yùn)行java

2023-11-06 07:21:13

內(nèi)存結(jié)構(gòu)Jvm

2023-12-08 08:26:05

數(shù)據(jù)存儲持久性

2021-11-15 07:47:40

字符串位置存儲

2021-06-02 08:25:44

性能優(yōu)化Repository

2022-08-28 19:15:56

RabbitMQ性能優(yōu)化

2019-09-03 09:41:48

運(yùn)維架構(gòu)技術(shù)

2024-05-11 07:56:07

編程語言Java字節(jié)碼

2019-09-24 10:02:57

Jvm內(nèi)部緩存

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2020-07-09 08:42:23

jvm內(nèi)部緩存

2021-10-27 09:38:40

JVM 虛擬機(jī)Java
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號