<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    JVM垃圾回收器、內存分配與回收策略

    VSole2022-07-31 09:57:47

    新生代垃圾收集器

    1. Serial收集器

    serial收集器即串行收集器,是一個單線程收集器。

    串行收集器在進行垃圾回收時只使用一個CPU或一條收集線程去完成垃圾回收工作,并且會暫停其他的工作線程(stop the world),直至回收完成。適用于運行在client模式下的JVM。

    在單CPU年代,串行收集器是默認的垃圾回收器,minor GC和major GC的過程都是用一個線程去處理的。

    啟用方式:-XX: +UseSerialGC

    2. ParNew收集器

    parNew收集器即并行收集器,采用的是多線程方式進行垃圾回收,可以理解為Serial收集器的多線程版本,吞吐量要比串行高很多,是服務器級別的虛擬機默認使用的,用來處理新生代的垃圾回收器。

    因為采用的是并行多線程方式,建議在多CPU環境下使用,否則和Serial沒有區別。

    啟用方式:-XX: +UseParNewGC

    3. Parallel Scavenge收集器

    并行的多線程垃圾收集器,采用復制算法進行垃圾回收,非常適合服務器做計算任務時使用。

    一般的垃圾回收器是在盡量短的時間內進行垃圾回收,這樣程序與用戶交互的時間間隔比較小,不會出現長時間的卡頓現象。但是Parallel Scavenge更側重于系統的吞吐量,高效的利用CPU,優先處理計算任務,適合交互少、運算多的場景。

    通過參數-XX: MaxGcPauseMills設置GC最大停頓時間,通過參數-XX: GCTimeRatio設置吞吐量大小。

    啟用方式:-XX: +UseParallelGC

    老年代垃圾收集器

    1. Serial Old收集器

    serial收集器的老年代版本,同樣是單線程收集器、stop the world,使用標記整理算法。

    一般啟用方式:

    UseSerialGC是Serial + Serial Old

    UseParNewGC是ParNew + Serial Old

    UseParallelGC是Parallel Scavenge + Serial Old

    2. Parallel Old收集器

    老年代版本的Parallel Scavenge,使用多線程 + 標記整理算法。

    啟用方式:-XX: +UseParallelOldGC

    3. CMS垃圾收集器

    CMS收集器的主要目的是使垃圾回收造成的停頓時間最短,提高服務響應速度,使用標記清除算法,具有并發收集(用戶線程與垃圾收集并發執行)、低停頓的特點。運行過程分為以下四個步驟:

    1.初始標記:stop the world,只是標記一下GC Roots能直接關聯到的對象,速度快

    2.并發標記:進行GC RootsTracing過程

    3.重新標記:stop the world,修正并發標記期間因用戶程序繼續運行而導致的標記產生變動的那部分對象的標記記錄。這個階段停頓時間相對初始標記時間長,比并發標記時間短

    4.并發清除

    注意:

    1. CMS收集器對CPU資源敏感,這是面向并發程序設計的共性
    2. 無法處理浮動垃圾(CMS垃圾收集階段,用戶線程仍在運行,因此會有新的垃圾生成,這部分垃圾只能在下一次GC時再清理,即浮動垃圾),可能出現"Concurrent Mode Failure"失敗導致另一次full GC

    啟用方式:-XX:+UseConcMarkSweepGC

    G1收集器

    G1收集器是基于標記整理算法實現的收集器,所以它不會產生內存空間碎片,并且可以精確的控制停頓時間。能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒。

    G1的設計原則就是簡單可行的性能調優,只需聲明以下參數即可:

    -XX:+UseG1GC -Xmx16g -XX:MaxGCPauseMills=300

    其中,-XX:+UseG1GC表明開啟G1收集器,-Xmx16g設置堆內存為16g,-XX:MaxGCPauseMills=300設置GC停頓最大時間為300ms。如果我們需要調優,在內存一定的情況下,可以考慮修改該參數,當然還要根據實際業務場景來處理。

    G1取消了堆內結構的新生代、老年代的物理空間劃分,將整個Java堆劃分為大小固定的獨立區域,后臺維護一個優先列表來跟蹤這些區域的垃圾堆積程度,每次根據允許收集的時間,優先回收垃圾最多的區域。

    G1中的Humongous區域用于存儲生命周期較短的巨型對象(一個對象所占空間超過了分區容量的50%),如果一個Humongous區無法裝下一個巨型對象,G1會尋找連續的H分區來存儲,如果沒有連續的H區滿足這種情況,有時候會觸發full GC。

    G1收集器的運作主要劃分為以下四個步驟:

    1. 初始標記:標記GC Roots能直接關聯到的對象,需要停頓線程,但耗時很短
    2. 并發標記:從GC Roots開始對堆中對象進行可達性分析,找出存活的對象,這階段耗時較長,但可與用戶程序并發執行
    3. 最終標記:修正在并發標記期間因用戶程序繼續運作而導致標記產生變動的那一部分標記記錄
    4. 篩選回收:對各個Region的回收價值和成本進行排序,根據用戶所期望的GC停頓時間來制定回收計劃

    內存分配與回收策略

    對象的內存分配主要是指在Java堆上的分配,通常會優先分配在新生代,然后經歷一系列GC后仍然存活的對象會進入到老年代。少數情況下,一些對象也會直接進入到老年代。

    -Xms:設置初始化堆內存,-Xmx設置最大堆內存,設置為相等可防止內存抖動(剩余內存大于70%、小于40%時,自動觸發內存擴大或縮小)

    1. 對象會優先分配在新生代

    新生代劃分為一個eden區和兩個survivor區(from survivor、to survivor)。初始階段,新創建的對象會分配給eden區。

    新生代發生的GC成為minor GC即Young GC,主要分為以下幾個過程:

    1. 隨著eden區存儲的對象不斷增多,當eden區剩余空間無法存儲新生成的對象時會觸發GC
    2. 經過minor GC后仍然存活的對象會進入from survivor區
    3. 當再次觸發GC時,會掃描eden區和from survivor區,對這兩個區域進行垃圾回收,仍然存活的對象會被復制到to survivor區,同時這些存活的對象年齡加1
    4. 清空eden、from survivor區中的對象,并將from survivor和to survivor區互換
    5. 頻繁執行上述過程,當剩余存活對象年齡達到15(默認)時,這些對象會進入老年代,通過參數-XX:MaxTenuringThreshold控制

    -Xmn用來設置新生代大小,一般設置為整個堆內存的3/1或者1/4

    -XX:NewRatio設置新生代與老年代的堆內存比例

    -XX:SurvivorRatio設置eden區和survivor區之間的比例

    2. 老年代存儲的對象

    發生在老年代的GC是major GC,回收速度會比minor GC慢。

    上文已經說明了對象進入老年代的一種情況即長期存活的對象會進入老年代,這里再來看看其他情況:

    1.大對象直接進入老年代

    大對象需要的連續存儲空間(如數組)大于新生代剩余空間時,會直接進入老年代。

    通過參數-XX:PretenureSizeThreshold設置,大于該參數值的對象會直接進入老年代(避免新生代中大量對象的拷貝,效率低)

    注意:PretenureSizeThreshold參數只對部分垃圾回收器有效,比如Serial和ParNew

    2.如果survivor區相同年齡所有對象大小的總和大于survivor空間的一半,年齡大于或等于該年齡的對象可以直接進入老年代,無需等到MaxTenuringThreshold設置的年齡

    注意:永久代不屬于堆空間,通過參數-XX:PermSize,-XX:MaxPermSize控制大小

    3. Full GC

    full GC是針對整個Java堆空間進行垃圾回收,包括新生代和老年代,會造成stop world。要盡量避免full GC,它會影響程序的穩定性。

    導致Full GC的幾點原因:

    1. 老年代空間不足

    從年輕代進入老年代的對象所占空間大于老年代剩余空間大小。

    eden區調大一些,盡量讓對象在新生代minor GC回收,而不是集中在老年代進行major GC,盡量不要創建特別大的對象

    2. 垃圾回收算法用的不對

    比如在老年代使用復制收集算法

    3. 永久代空間不足

    4.被HandlePromotionFailure參數強制Full GC

    在發生minor GC時,虛擬機會檢測之前每次晉升到老年代的平均大小是否大于老年代的剩余空間大小,如果大于,則改為進行full GC。如果小于,則根據HandlePromotionFailure的設置是否允許擔保分配內存失敗:如果允許失敗,則只進行minor GC;反之,則進行full GC。

    但是如果發生HandlePromotionFailure失敗,則會進行full GC。

    內存碎片jvm調優
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    無論對于Java程序員還是大數據研發人員,JVM是必須掌握的技能之一。Java提供的GC功能可以自動監測對象是否超過作用域等從而達到自動回收內存的目的,可以有效防止內存泄露,有效的使用可用內存。
    新生代垃圾收集器1. Serial收集器serial收集器即串行收集器,是一個單線程收集器。能讓使用者明確指定在一個長度為M毫秒的時間片段內,消耗在垃圾收集上的時間不得超過N毫秒。G1取消了堆內結構的新生代、老年代的物理空間劃分,將整個Java堆劃分為大小固定的獨立區域,后臺維護一個先列表來跟蹤這些區域的垃圾堆積程度,每次根據允許收集的時間,先回收垃圾最多的區域。
    Android逆向:基礎入門
    2022-06-03 05:29:40
    前言 隨著app的廣泛應用,使用過程中,難免會遇到些很不友好的功能,比如:游戲充值、間斷性彈窗廣告、續費解鎖下一回等等。
    同時例如 jstack、jmap 等工具也是不囿于一個方面的問題的,基本上出問題就是df、free、top 三連,然后依次jstack、jmap伺候,具體問題具體分析即可。CPU 異常往往還是比較好定位的。
    Filebeat監視您指定的日志文件或位置,收集日志事件,并將它們轉發Elasticsearch或 Logstash進行索引。使用Kibana,可以通過各種圖表進行高級數據分析及展示。
    隨著企業越發重視和加強應用程序,以及開發人員采用新的技術/流程來構建應用程序,以提高上線速度和豐富客戶體驗,廣大企業對應用的防護需求日益增加,應用安全將成為最重要的安全陣地之一。據Forrester預測,至2025年全球應用安全市場將達到129億美元規模。市場的擴大和攻擊手段的多樣化給傳統應用安全防護手段提出了新的挑戰,也激發了諸如RASP等新興應用防護技術的產生以及邊界無限等安全新銳的崛起。邊界
    文章末尾會附上文章的所有代碼、腳本和測試用例。本文環境: SpringBoot 2.5.7 + MySQL 8.0 X + MybatisPlus + Swagger2.9.2模擬工具: Jmeter模擬場景: 減庫存->創建訂單->模擬支付2.商品秒殺-超賣在開發中,對于下面的代碼,可能很熟悉:在Service里面加上@Transactional事務注解和Lock鎖控制層:Controller@ApiOperation. "哎喂,人也太多了,請稍后!
    立即隔離被入侵的主機,以控制事態、避免影響擴大,隨后溯源。Webshell文件本身極難檢出,防守隊員很清楚,當發現主機上有Webshell文件時,往往意味著這臺主機即將失陷,十分危險。但是Webshell文件已經被刪除,攻擊者仍能做出攻擊行為,說明主機上還存在另一條控制通道。
    如果你不是 Java8 的釘子戶,你應該早就發現了:String 類的源碼已經由 char[] 化為了 byte[] 來存儲字符串內容,為什么要這樣做呢? 開門見山地說,從 char[] byte[],最主要的目的是為了節省字符串占用的內存內存占用減少帶來的另外一個好處,就是 GC 次數也會減少。
    批處理用于每天為企業處理數十億的交易。Spring Batch是一個輕量級,全面的批處理框架,旨在開發對企業系統日常運營至關重要的強大批處理應用程序。大批量批處理作業可以高度可擴展的方式利用該框架來處理大量信息。以某種方式處理數據。什么是JobJob和Step是spring batch執行批處理任務最為核心的兩個概念。其中Job是一個封裝整個批處理過程的一個概念。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类