㈠ K8s 存儲資源回收策略
原文地址: https://alphahinex.github.io/2021/05/02/reclaim-policy/
description: "數據不丟失,了解一下?"
date: 2021.05.02 10:34
categories:
- Cloud Native
tags: [K8s]
keywords: PersistentVolume, PersistentVolumeClaim, StorageClass, pv, pvc, sc, K8s, Cloud Native
在 Volume、PersistentVolume、PersistentVolumeClaim 和 StorageClass 中,我們介紹了 K8s 存儲資源的相關概念。持久卷(PersistentVolume)通過卷插件對位於外部基礎設施中的存儲資產進行操作,並可通過 回收策略 ,控制持久卷回收時會對外部存儲數據產生的影響。
目前支持的回收策略有三種:
所以對於重要的數據,一定要使用 Retain 的回收策略,以免部署或 PVC 刪除的時候,因 Delete 回收策略而使重要數據丟失。
在使用 Retain 策略時,可以通過下面的步驟來手動回收該卷:
對 PV 可使用 persistentVolumeReclaimPolicy 設置回收策略:
對 SC 可使用 reclaimPolicy 進行設置:
StorageClass 一旦創建了就不能再更新,如果需要修改已有的默認存儲類,可參照 改變默認 StorageClass 中步驟執行。
PV 的 persistentVolumeReclaimPolicy 屬性可以通過下面方式進行更改:
PVC 與 PV 之間會建立綁定關系,這種綁定是一種一對一的映射,一旦綁定關系建立,則 PersistentVolumeClaim 綁定就是排他性的,無論該 PVC 申領是如何與 PV 卷建立的綁定關系。實現上使用 .spec.claimRef 來表示 PV 卷 與 PVC 申領間的雙向綁定關系。
使用 Retain 策略的 PV 在 PVC 被刪除之後,會處於 Released 的狀態。此時無法使用新的 PVC 與此 PV 進行綁定。需先將該 PV 與之前 PVC 的綁定關系解除,才能重新進行綁定。
解除綁定時,可以編輯 PV 的信息,刪除 .spec.claimRef 這段內容。刪除之後,PV 的狀態會變更為 Available 狀態,此時即可使用與之前相同存儲需求的 PVC 或者通過 selector 選擇此 PV 進行重新綁定。
㈡ JVM垃圾收集機制
JVM垃圾回收機制是java程序員必須要了解的知識,對於程序調優具有很大的幫助(同時也是大廠面試必問題)。
要了解垃圾回收機制,主要從三個方面:
(1)垃圾回收面向的對象是誰?
(2)垃圾回收演算法有哪些?
(3)垃圾收集器有哪些?每個收集器有什麼特點。
接下來一一講解清楚:
一、垃圾回收面向的對象
也就是字面意思, 垃圾 回收嘛,重要的是垃圾,那什麼對象是垃圾呢,簡單來說就是無用的或已死的對象。這樣又引申出來什麼對象是已死的,怎麼判斷對象是否已死?
判斷對象是否已死有兩種演算法和對象引用分類:
(1)引用計數演算法:
也是字面意思,通過給對象添加引用計數器,添加引用+1,反之-1。當引用為0的時候,此時對象就可判斷為無用的。
優點:實現簡單,效率高。
缺點:無法解決循環引用(就是A引用B,B也引用A的情況)的問題。
(2)根搜索演算法(也就是GC Roots):
通過一系列稱為GC Roots的對象,向下搜索,路徑為引用鏈,當某個對象無法向上搜索到GC Roots,也就是成為GC Roots不可達,則為無用對象。
如果一個對象是GC Roots不可達,則需要經過兩次標記才會進行回收,第一次標記的時候,會判斷是否需要執行finalize方法(沒必要執行的情況:沒實現finalize方法或者已經執行過)。如果需要執行finalize方法,則會放入一個回收隊列中,對於回收隊列中的對象,如果執行finalize方法之後,沒法將對象重新跟GC Roots進行關聯,則會進行回收。
很抽象,對吧,來一個明了的解釋?
比如手機壞了(不可達對象),有錢不在乎就直接拿去回收(這就是沒實現finalize方法),如果已經修過但是修不好了(已經執行過finalize方法),就直接拿去回收站回收掉。如果沒修過,就會拿去維修店(回收隊列)進行維修,實在維修不好了(執行了finalize方法,但是無法連上GC Roots),就會拿去回收站回收掉了。
那什麼對象可以成為GC Roots呢?
1>虛擬機棧中的引用對象
2>本地方法棧中Native方法引用的對象
2>方法區靜態屬性引用對象
3>方法區常量引用對象
(3)對象引用分類
1>強引用:例如實例一個對象,就是即使內存不夠用了,打死都不回收的那種。
2>軟引用:有用非必須對象,內存夠,則不進行回收,內存不夠,則回收。例如A借錢給B,當A還有錢的時候,B可以先不還,A沒錢了,B就必須還了。
3>弱引用:非必須對象,只能存活到下一次垃圾回收前。
4>虛引用:幽靈引用,必須跟引用隊列配合使用,目的是回收前收到系統通知。
下面是java的引用類型結構圖:
(1)軟引用示例
內存夠用的情況:
運行結果:
內存不夠用的情況:
運行結果:
(2)弱引用示例結果:
無論如何都會被回收
(3)虛引用示例:
運行結果:
解釋:為什麼2和5的輸出為null呢,如下
3為null是因為還沒有進行gc,所以對象還沒加入到引用隊列中,在gc後就加入到了引用隊列中,所以6有值。
這個虛引用在GC後會將對象放到引用隊列中,所以可以在對象回收後做相應的操作,判斷對象是否在引用隊列中,可以進行後置通知,類似spring aop的後置通知。
二、垃圾回收發生的區域
垃圾回收主要發生在堆內存裡面,而堆內存又細分為 年輕代 和 老年代 ,默認情況下年輕代和老年代比例為1:2,比如整個堆內存大小為3G,年輕代和老年代分別就是1G和2G,想要更改這個比例需要修改JVM參數-XX:NewRatio,
比如-XX:NewRatio=4,那老年代:年輕代=4:1。而年輕代又分為Eden區,S0(Survivor From)和S1(Survivor To)區,一般Eden:S0:S1=8:1:1,如果想要更改此比例,則修改JVM參數-XX:SurvivorRatio=4,此時就是Eden:S0:S1=4:1:1。
在年輕代發生GC稱為Young GC,老年代發生GC成為Full GC,Young GC比Full GC頻繁。
解析Young GC:
JVM啟動後,第一次GC,就會把Eden區存活的對象移入S0區;第二次GC就是Eden區和S0一起GC,此時會把存活的對象移入S1區,S0清空;第三次GC就是Eden區和S1區進行GC,會把存活的對象移入S0區,如此往復循環15次(默認),就會把存活的對象存入老年區。
類似與如果有三個桶,編號分別為1(1號桶內的沙子是源源不斷的,就像工地上。你們沒去工地搬過磚可能不知道,但是我真的去工地上搬過啊),2,3。1裡面裝有沙子,需要將沙子篩為細沙。首先將桶1內的沙子篩選一遍過後的放置於桶2,第二次篩選就會將桶1和桶2裡面的沙子一起篩,篩完之後放到桶3內,桶2清空。第三次篩選就會將桶1和桶3的沙子一起篩選,曬完放到桶2內,桶3清空。如此往復循環15次,桶2或桶3裡面的沙子就是合格的沙子,就需要放到備用桶內以待使用。
上述中桶1就是Eden區,桶2就是S0區,桶3就是S1區。
三、垃圾回收演算法
三種,分別是復制演算法,標記-清除演算法,標記-整理演算法。
(1)復制演算法。
其會將內存區域分成同樣大小的兩塊,一塊用來使用,另外一塊在GC的時候存放存活的對象,然後將使用的一塊清除。如此循環往復。
適用於新生代。
優點:沒有內存碎片,缺點:只能使用一般的內存。
(2)標記-清除演算法。
使用所有內存區域,在GC的時候會將需要回收的內存區域先進行標記,然後同意回收。
適用於老年代。
缺點:產生大量內存碎片,會直接導致大對象無法分配內存。
(3)標記-整理演算法。
使用所有內存區域,在GC的時候會先將需要回收的內存區域進行標記,然後將存活對象忘一邊移動,最後將清理掉邊界以外的所有內存。
適用於老年代。
四、GC日誌查看
利用JVM參數-XX:+PrintGCDetails就可以在GC的時候列印出GC日誌。
年輕代GC日誌:
老年代GC日誌:
五、垃圾收集器
主要有四類收集器以及七大收集器
四類:
(1)Serial:單線程收集器,阻塞工作線程,它一工作,全部都得停下。
(2)Paralle:Serial的多線程版本,也是阻塞工作線程
(3)CMS(ConcMarkSweep):並行垃圾收集器,可以和工作線程一起工作。
(4)G1:將堆分成大小一致的區域,然後並發的對其進行垃圾回收。
怎麼查看默認的收集器呢?
用JVM參數-XX:+PrintCommandLineFlags,運行之後會輸出如下參數。可以看到,jdk1.8默認是Parallel收集器。
七大收集器:
(1)Serial:串列垃圾收集器,單線程收集器。用於新生代。用JVM參數-XX:+UseSerialGC開啟,開啟後Young區用Serial(底層復制演算法),Old區用Serial Old(Serial的老年代版本,底層是標記整理演算法)。
(2)ParNew:用於新生代,並行收集器。就是Serial的多線程版本。用JVM參數-XX:+UseParNewGC,young:parnew,復制演算法。Old:serialOld,標記整理演算法。-XX:ParallecGCThreads限制線程回收數量,默認跟cpu數目一樣。只是新生代用並行,老年代用串列。
(3)Parallel Scavenge:並行回收收集器。用JVM參數-XX:+UseParallelGC開啟,young:parallel scavenge(底層是復制演算法),old:parallel old(parallel的老年代版本,底層是標記整理),新生代老年代都用並行回收器。
這個收集器有兩個優點:
可控的吞吐量 :就是工作線程工作90%的時間,回收線程工作10%的時間,即是說有90%的吞吐量。
自適應調節策略 :會動態調節參數以獲取最短的停頓時間。
(4)Parallel Old:Parallel Scavenge的老年代版本,用的是標記整理演算法。用JVM參數-XX:+UseParallelOldGC開啟,新生代用Parallel Scavenge,老年代用Parallel Old
(5)CMS(ConcMarkSweep):並發標記清除。 底層是標記清除演算法,所以會產生內存碎片,同時也會耗cpu。 以獲取最短回收停頓時間為目標。-XX:+UseConcMarkSweep,新生代用ParNew,老年代用CMS。CMS必須在堆內存用完之前進行清除,否則會失敗,這時會調用SerialOld後備收集器。
初始標記和重新標記都會停止工作線程,並發標記和並發清除會跟工作線程一起工作。
(6)SerialOld:老年代串列收集器(以後Hotspot虛擬機會直接移除掉)。
(7)G1:G1垃圾收集器,演算法是標記整理,不會產生內存碎片。橫跨新生代老年代。實現盡量高吞吐量,滿足回收停頓時間更短。
G1可以精確控制垃圾收集的停頓時間,用JVM參數-XX:MaxGCPauseMillis=n,n為停頓時間,單位為毫秒。
區域化內存劃片Region,會把整個堆劃分成同樣大小的區域塊(1MB~32MB),最多2048個內存區域塊,所以能支持的最大內存為32*2048=65535MB,約為64G。
上圖是收集前和收集後的對比,有些對象很大,分割之後就是連續的區域,也即是上圖的Humongous。
上述理論可能有點乏味,下圖很清晰明了(某度找的)。
下面來一張整個垃圾回收機制的思維導圖(太大,分成兩部分)。
=======================================================
我是Liusy,一個喜歡健身的程序猿。
歡迎關注【Liusy01】,一起交流Java技術及健身,獲取更多干貨。
㈢ mybatis的緩存有幾種
1、一級緩存
MyBatis默認開啟了一級緩存,一級緩存是在sqlSession 層面進行緩存的。即,同一個SqlSession ,多次調用同一個Mapper和同一個方法的同一個參數,只會進行一次資料庫查詢,然後把數據緩存到緩沖中,以後直接先從緩存中取出數據,不會直接去查資料庫。
但是不同的SqlSession對象,因為不用的SqlSession都是相互隔離的,所以相同的Mapper、參數和方法,他還是會再次發送到SQL到資料庫去執行,返回結果。
2、二級緩存
為了克服這個問題,需要開啟二級緩存,是的緩存zaiSqlSessionFactory層面給各個SqlSession 對象共享。默認二級緩存是不開啟的,需要手動進行配置。
<cache/>
如果這樣配置的話,很多其他的配置就會被默認進行,如:
映射文件所有的select 語句會被緩存
映射文件的所有的insert、update和delete語句會刷新緩存
緩存會使用默認的Least Recently Used(LRU,最近最少使用原則)的演算法來回收緩存空間
根據時間表,比如No Flush Interval,(CNFI,沒有刷新間隔),緩存不會以任何時間順序來刷新
緩存會存儲列表集合或對象(無論查詢方法返回什麼)的1024個引用
緩存會被視為是read/write(可讀/可寫)的緩存,意味著對象檢索不是共享的,而且可以很安全的被調用者修改,不幹擾其他調用者或縣城所作的潛在修改
- <cache eviction="LRU" flushInterval="100000" size="1024" readOnly="true"/>
eviction:緩存回收策略
- LRU:最少使用原則,移除最長時間不使用的對象
- FIFO:先進先出原則,按照對象進入緩存順序進行回收
- SOFT:軟引用,移除基於垃圾回收器狀態和軟引用規則的對象
- WEAK:弱引用,更積極的移除移除基於垃圾回收器狀態和弱引用規則的對象flushInterval:刷新時間間隔,單位為毫秒,這里配置的100毫秒。如果不配置,那麼只有在進行資料庫修改操作才會被動刷新緩存區
size:引用額數目,代表緩存最多可以存儲的對象個數
readOnly:是否只讀,如果為true,則所有相同的sql語句返回的是同一個對象(有助於提高性能,但並發操作同一條數據時,可能不安全),如果設置為false,則相同的sql,後面訪問的是cache的clone副本。
useCache配置
如果一條語句每次都需要最新的數據,就意味著每次都需要從資料庫中查詢數據,可以把這個屬性設置為false,如:
- <select id="selectAll" resultMap="BaseResultMap" useCache="false">
刷新緩存(就是清空緩存)
二級緩存默認會在insert、update、delete操作後刷新緩存,可以手動配置不更新緩存,如下:
- <update id="updateById" parameterType="User" flushCache="false" />
可以在開啟二級緩存時候,手動配置一些屬性
各個屬性意義如下:
可以在Mapper的具體方法下設置對二級緩存的訪問意願:
3、自定義緩存
自定義緩存對象,該對象必須實現 org.apache.ibatis.cache.Cache 介面
每次查詢資料庫前,MyBatis都會先在緩存中查找是否有該緩存對象。只有當調用了commit() 方法,MyBatis才會往緩存中寫入數據,數據記錄的鍵為數字編號+Mapper名+方法名+SQL語句+參數格式,值為返回的對象值。
㈣ Redis 過期策略 和 回收策略
惰性策略就是在客戶端訪問這個 key 的時候,redis 對 key 的過期時間進行檢查,如果過期了就立即刪除。
Redis 默認會每秒進行十次過期掃描,過期掃描不會遍歷過期字典中所有的 key,而是採用了一種簡單的貪心策略。
1.從過期字典中隨機 20 個 key;
2.刪除這 20 個 key 中已經過期的 key;
3.如果過期的 key 比率超過 1/4,那就重復步驟 1;
同時,為了保證過期掃描不會出現循環過度,導致線程卡死現象,演算法還增加了掃描時間的上限,默認不會超過 25ms。
從庫不會進行過期掃描,從庫對過期的處理是被動的。主庫在 key 到期時,會在 AOF 文件里增加一條 del 指令,同步到所有的從庫,從庫通過執行這條 del 指令來刪除過期的 key。
因為指令同步是非同步進行的,所以主庫過期的 key 的 del 指令沒有及時同步到從庫的話,會出現主從數據的不一致
這是由 redis 的過期策略來決定。
redis 過期策略是: 定期刪除+惰性刪除 。
所謂定期刪除,指的是 redis 默認是每隔 100ms 就隨機抽取一些設置了過期時間的 key,檢查其是否過期,如果過期就刪除。
假設 redis 里放了 10w 個 key,都設置了過期時間,你每隔幾百毫秒,就檢查 10w 個 key,那 redis 基本上就死了,cpu 負載會很高的,消耗在你的檢查過期 key 上了。注意,這里可不是每隔 100ms 就遍歷所有的設置過期時間的 key,那樣就是一場性能上的災難。實際上 redis 是每隔 100ms 隨機抽取一些 key 來檢查和刪除的。
但是問題是,定期刪除可能會導致很多過期 key 到了時間並沒有被刪除掉,那咋整呢?所以就是惰性刪除了。這就是說,在你獲取某個 key 的時候,redis 會檢查一下 ,這個 key 如果設置了過期時間那麼是否過期了?如果過期了此時就會刪除,不會給你返回任何東西。
但是實際上這還是有問題的,如果定期刪除漏掉了很多過期 key,然後你也沒及時去查,也就沒走惰性刪除,此時會怎麼樣?如果大量過期 key 堆積在內存里,導致 redis 內存塊耗盡了,咋整?
答案是:走內存淘汰機制。
㈤ 軟引用的回收策略
Java中有四種引用類型,強,軟,弱,虛.本文主要講解軟引用的回收機制.需要讀者對軟引用有基本了解.
問題1容易理解,在保證系統能夠正常運行的前提下,沒必要全都回收. 舉個例子, 堆內存100MB,軟引用佔了80MB,只剩20MB可用內存,觸發了垃圾回收, 那麼回收時沒必要把80MB軟引用都回收了,回收一部分,比如20MB,系統就有40MB可用內存,足以正常運行.
下面來詳述問題2提到的軟引用的回收策略
有兩個關鍵屬性
從這兩個屬性可得從上次gc起某個軟引用未被訪問的時間 idletime (可能為負值)
同時我們有軟引用空閑保留時間(全局) idlelivetime
每MB空閑內存保留時間對應JVM參數 -XX:SoftRefLRUPolicyMSPerMB
當需要對軟引用進行回收時,idletime大於 idlelivetime的軟引用會被回收.
以上是軟引用回收策略的大致描述,JVM還會有更精細的控制和優化,所以很難根據上面的公式進行精準演示,下面就以一種簡化的方式演示軟引用回收的LRU.
https://www.jianshu.com/p/f0da6c1af815
㈥ Mybatis的緩存講解
前段時間阿粉的一個朋友和阿粉吃飯,在吃飯的時候和阿粉瘋狂的吐槽面試官,說面試官問的問題都是些什麼問題呀,我一個幹了三四年的開發,也不說問點靠譜的,阿粉很好奇,問題問完基礎的,一般不都是根據你自己的簡歷進行提問么?而接下來他說的出來的問題,阿粉表示,阿粉需要繼續學習了。
說到這個,讀者大人們肯定心想,阿粉是在開玩笑么?你一個 Java 程序員,你不知道Mybatis是啥么?不就是個持久層的框架么,這東西有啥好說的呢?但是阿粉還是要給大家說。
為什麼說 Mybatis 是一個半自動 ORM 的框架呢?
ORM,是Object和Relation之間的映射,而Mybatis 在查詢關聯對象或關聯集合對象時,需要手動編寫 sql 來完成,所以,稱之為半自動 ORM 框架,而Hibernate 屬於全自動 ORM 映射工具,使用 Hibernate 查詢關聯對象或者關聯集合對象時,可以根據對象關系模型直接獲取,所以它是全自動的。
這也是為什麼有些面試官在面試初級程序員的時候,很喜歡說,你覺得 Mybatis , 和 Hibernate 都有什麼優缺點,為啥你們選擇使用的 Mybatis 而不選擇使用 Hibernate 呢?
我們都說了 Mybatis是什麼了,接下來肯定需要說說面試官都問了什麼問題,能讓阿粉的朋友變得非常猶豫。
當我們面試的時候,說完這個,一般情況下,面試官一定會追問下去,畢竟技術就是要問到你的知識盲區才會停止。
那我們就來畫個圖表示一下一級緩存
那面試官肯定會說,直接從資料庫查不就行了,為啥要一級緩存呢?
當我們使用MyBatis開啟一次和資料庫的會話時, MyBatis 會創建出一個 SqlSession 對象表示一次與資料庫之間的信息傳遞,在我們執行 SQL 語句的過程中,們可能會反復執行完全相同的查詢語句,如果不採取一些措施,我們每一次查詢都會查詢一次資料庫,而如果在極短的時間內做了很多次相同的查詢操作,那麼這些查詢返回的結果很可能相同。
也就是說,如果我們在短時間內,頻繁的去執行一條 SQL ,查詢返回的結果本來應該是改變了,但是我們查詢出來的時候,會出現結果一致的情況,正是為了解決這種問題,也為了減輕資料庫的開銷,所以 Mybatis 默認開啟了一級緩存。
Mybatis 的二級緩存一般如果你不對他進行設置,他是不會開啟的,而二級緩存是什麼呢?Mybatis 中的二級緩存實際上就是 mapper 級別的緩存,而這時候肯定會有人說,那麼不同之間的 Mapper 是同一個緩存么?
答案是否定的,他不是一個,Mapper 級別的緩存實際上就是相同的 Mapper 使用的是一個二級緩存,但是在二級緩存中,又有多個不同的 SqlSession ,而不同的 Mapper 之間的二級緩存也就是互相不會影響的。
就類似下面的圖
這二級緩存是不是就看起來有點意思了?
那怎麼能夠開啟二級緩存呢?
1.MyBatis 配置文件
2.MyBatis 要求返回的 POJO 必須是可序列化的
3.Mapper 的 xml 配置文件中加入 標簽
既然我們想要了解這個二級緩存,那麼必然,我們還得知道它裡面的配置都有哪些含義。
我們先從標簽看起,然後從源碼裡面看都有哪些配置信息提供給我們使用:
blocking : 直譯就是調度,而在 Mybatis 中,如果緩存中找不到對應的 key ,是否會一直 blocking ,直到有對應的數據進入緩存。
eviction : 緩存回收策略
而緩存回收策略,在源碼中是有直接體現的,那麼他們分別都對應了什麼形式呢?
大家雖然看著 PERPETUAL 排在了第一位,但是它可不是默認的,在 Mybatis 的緩存策略裡面,默認的是 LRU 。
PERPETUAL :
源代碼如下:
恩?看著是不是有點眼熟,它怎麼就只是包裝了 HashMap ? 你還別奇怪,他還真的就是使用的 HashMap ,不得不說,雖然人家是使用的 HashMap ,但是那可是比咱們寫的高端多了。
既然使用 HashMap ,那麼必然就會有Key,那麼他們的Key是怎麼設計的?
CacheKey:
確實牛逼,至於內部如何初始化,如何進行操作,大家有興趣的可以去閱讀一下源碼,導入個源碼包,打開自己看一下。
FIFO : 先進先出緩沖淘汰策略
在 FIFO 淘汰策略中使用了 Java 中的 Deque,而 Deque 一種常用的數據結構,可以將隊列看做是一種特殊的線性表,該結構遵循的先進先出原則。Java中,LinkedList實現了Queue介面,因為LinkedList進行插入、刪除操作效率較高。
當你看完這個源碼的時候,是不是就感覺源碼其實也沒有那麼難看懂,裡面都是我們已經掌握好的知識,只不過中間做了一些操作,進行了一些封裝。
LRU : 最近最少使用的緩存策略
而 LUR 演算法,阿粉之前都說過,如果對這個演算法感興趣的話,文章地址給大家送上,經典的 LRU 演算法,你真的了解嗎?
而我們需要看的源碼則是在 Mybatis 中的源碼,
SOFT : 基於垃圾回收器狀態和軟引用規則的對象
在看到基於垃圾回收器的時候,阿粉就已經開始興奮了,竟然有GC的事情,那還不趕緊看看,這如此高大上(裝杯)的事情,來瞅瞅吧!
WEAK : 基於垃圾收集器狀態和弱引用規則的對象
WeakCache在實現上與SoftCache幾乎相同,只是把引用對象由SoftReference軟引用換成了WeakReference弱引用。
在這里阿粉也就不再多說了,關於 Mybatis 的二級緩存,你了解了么?下次遇到面試官問這個的時候,你應該知道怎麼成功(裝杯)不被打了吧。
㈦ mybatis緩存機制中,默認的回收策略是哪個
Mybatis緩存處理機制 MyBatis緩存介紹 正如大多數持久層框架一樣,MyBatis 同樣提供了一級緩存和二級緩存的支持 一級緩存: 基於PerpetualCache 的 HashMap本地緩存,其存儲作用域為 Session,當 Session flush 或 close 之後
㈧ 簡述java內存分配與回收策率有什麼用
引言:大多數情況下,對象在新生代Eden區中分配。當Eden區沒有足夠空間進行分配時,虛擬機將發起一次Minor GC。新生代GC(Minor GC):指發生在新生代的垃圾收集動作,因為Java對象大多都具備朝生夕滅的特性,所以Minor GC非常頻繁,一般回收速度也比較快。老年代GC(Major GC / Full GC):指發生在老年代的GC,出現了Major GC,經常會伴有至少一次的Minor GC(但非絕對的,在Parallel Scavenge收集器的收集策略里就有直接進行Major GC的策略選擇過程)。Major GC的速度一般會比Minor GC慢10倍以上。
三、總結
可達性分析:以名為“GC根”的對象為起點,從這些節點向下搜索。當一個對象不能連接到“垃圾回收根”時,意味著它是可回收的。
㈨ JVM有哪些垃圾回收演算法
標記-清除,標記-復制,標記-整理
㈩ 新能源汽車再生制動控制策略有哪些
一、最佳制動能量回收控制策略
制動能量回收控制的工作原理是在制動力矩足夠的基礎上最大限度地回收能量,以滿足新能源汽車的制動安全距離和制動性能。當制動需求較小時,再生制動系統完成制動,保證制動的安全性和穩定性。當提出更大的制動需求,即地面附著力增加時,電機再生制動力不足,最大制動力只能滿足部分制動需求,其他制動力由液壓制動提供。再生制動和液壓制動的結合使得制動力的分配更加復雜,必須在保證運行安全的基礎上進行分配,會影響控制效果,容易出現制動控制不穩定和不可控的問題,效果已經達到理論水平,不能完全實現能量回收最大化,制動時可能存在安全隱患。