日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

jvm垃圾回收策略之标记清除

發布時間:2023/12/20 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 jvm垃圾回收策略之标记清除 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

垃圾回收指的是對 jvm堆內存的回收。

一. java虛擬機棧

二、本地方法棧(Native Method Stack)

  本地方法棧的功能和特點類似于虛擬機棧,均具有線程隔離的特點以及都能拋出StackOverflowError和OutOfMemoryError異常。

  不同的是,本地方法棧服務的對象是JVM執行的native方法,而虛擬機棧服務的是JVM執行的java方法。如何去服務native方法?native方法使用什么語言實現?怎么組織像棧幀這種為了服務方法的數據結構?虛擬機規范并未給出強制規定,因此不同的虛擬機實可以進行自由實現,我們常用的HotSpot虛擬機選擇合并了虛擬機棧和本地方法棧。

局部變量表 (是一組變量值存儲空間,用于存放方法參數方法內定義的局部變量。)

操作數棧(其實就是個臨時數據存儲區域,通過入棧出棧 來進行計算的) 工作原理圖

堆內存模型圖如下: 包括 年輕代、 老年代(年輕代又分為 伊甸區 , 存活區0? 存活區1)? ?可以看出 如果堆內存總共是3GB, 新生代 : 老年代內存默認占比為 1GB:2GB, 而伊甸區 和 2個存活區的默認占比是8 :1 :1

講一件jvm的垃圾回收策略, 標記清除。

新生代, 垃圾回收,? 是monitor gc, 簡稱小gc,什么時候觸發monitor-gc呢?

? ?一般創建的對象都會存入 年輕代 , 有的會存入老年代(后面會講)

? ?jvm有mark算法,知道那些是標記存貨對象, 這些存活對象不會被清理,伊甸區90%都是垃圾,清理伊甸區之前會將伊甸區的存活對象復制到存活區s0,然后sweep掃掉伊甸區的所有對象(所以比較快。一掃而盡)。

當伊甸區滿了以后,就開始重復上面的動作, 回收年輕代的垃圾。

? 什么時候觸發full-gc?

jvm垃圾回收策略之標記清除圖解:
? ? ??

《深入理解Java虛擬機》GC詳解及Minor GC和Full GC觸發條件總結 https://blog.csdn.net/wyl_1483061559/article/details/82726128JVM調優目標:使用較小的內存占用來獲得較高的吞吐量或者較低的延遲Java虛擬機--垃圾收集器--CMS收集器 CMS(Concurrent Mark Sweep)remark意思是標記的有意思, 收集器是一種以獲取最短回收停頓時間為目標的收集器。目前很大一部分的Java應用集中在互聯網網站或者基于瀏覽器的B/S系統的服務端上,這類應用通常都會較為關注服務的響應速度,希望系統停頓時間盡可能短,以給用戶帶來良好的交互體驗。CMS收集器就非常符合這類應用的需求。從名字(包含“Mark Sweep”)上就可以看出CMS收集器是基于標記-清除算法實現的java中堆和棧有什么區別? https://blog.csdn.net/weixin_38719347/article/details/80889505 java中堆和棧屬于不同的內存區域,使用目的也不同. java虛擬機棧(注意區別于本地方法棧 Native Method Stack)常用于存儲棧幀(棧幀包含:1.局部變量區 2.操作數棧 3.幀數據區 ), 而對象總是在堆上分配. 棧通常都比較小,也不會在多個線程之間共享,而堆被整個JVM的所有線程共享.JVM內存模型: 運行時數據區包含如下: 方法區(包含運行時常量池) 堆 所有線程共享的 虛擬機棧 本地方法棧 程序計數器(這個不會發生內存溢出,其它幾個都會) 線程不共享, 即都是是線程隔離的,即每個線程都有自己獨立的虛擬機棧。https://blog.csdn.net/mine_song/article/details/71517200每當線程調用一個Java方法時,JVM就會在該線程對應的棧中壓入一個幀, 這個幀自然就成了當前幀。當執行這個方法時,它使用這個幀來存儲參數、局部變量、中間運算結果等等。 Java棧的組成元素——棧幀, 棧幀由三部分組成:在Java虛擬機規范中,Java棧(Java Stack)也可以被稱之為Java虛擬機棧(Java Virtual Machine Stack), Java棧主要用于存儲棧幀(Stack Frame),也就是說棧幀是Java虛擬機棧的組成元素 而棧幀中則負責存儲局部變量表、操作數棧、動態鏈接和方法返回值等信息。1.局部變量區、 2.操作數棧(操作數棧其實就是個臨時數據存儲區域,它是通過入棧和出棧來進行操作的,如100+98 為100入棧 98入棧,計算出198出棧,賦值給局部變量區的第三個)、 3.動態鏈接和方法返回值等虛擬機棧 和 本地方法棧 的區別? https://blog.csdn.net/weixin_42414212/article/details/114072750 一、虛擬機棧(VM Stack) 1.1)什么是虛擬機棧虛擬機棧是用于描述java方法執行的內存模型。每個java方法在執行時,會創建一個“棧幀(stack frame)”,棧幀的結構分為“局部變量表、操作數棧、動態鏈接、方法出口”幾個部分(具體的作用會在字節碼執行引擎章節中講到,這里只需要了解棧幀是一個方法執行時所需要數據的結構)。我們常說的“堆內存、棧內存”中的“棧內存”指的便是虛擬機棧,確切地說,指的是虛擬機棧的棧幀中的局部變量表,因為這里存放了一個方法的所有局部變量。方法調用時,創建棧幀,并壓入虛擬機棧;方法執行完畢,棧幀出棧并被銷毀 二、本地方法棧 Native Method Stack 功能和特點類似于虛擬機棧,均具有線程隔離的特點以及都能拋出StackOverflowError和OutOfMemoryError異常本地方法棧服務的對象是JVM執行的native方法,而虛擬機棧服務的是JVM執行的java方法i=1在內存怎么分配,基本數據類型, 進入棧保存.jvm參數主要有哪幾種分類? 1.以- 開頭的是 標準參數 java -version; java -help; java -jar 2.以-X 開頭的是 非標準參數 在將來的jvm版本中可能會發生變化 如-Xms:初始堆大小 3.以-XX 開頭的是 不穩定參數 主要用于jvm調優和debug 如-XX:NewRatio:設置新生代和老年代的比 此類參數設置合理可以大大提高JVM的性能及穩定性young Generation tenured generation(老年代簡稱tenured gen) Full GC相對于Minor GC來說,停止用戶線程的STW(stop the world)時間過長,至少慢10倍以上,所以要盡量避免講一講對象的分配規則: 同時也就講了Monitor GC(Eden區分配不夠時進行一次Monitor GC) 和 Full GC的觸發條件(1.調用System.gc 2.老年代空間不足 ) 1.對象優先分配在Eden區,如果Eden區沒有足夠的空間,虛擬機進行一次Monitor GC 2.大對象直接進入老年代(大對象是指需要大量內存空間的對象).這樣做的目的是避免在Eden區和兩個Survivor區之間發生大量的內存copy(新生代通過復制算法收集內存) 3.長期存活的對象進入老年代(即從Eden區和Survivor區通過mark標記選中復制多次到Survivor區,年齡大的),虛擬機為每個對象定一個年齡計數器,如果對象經過了1次Monitor GC 那么對象會進入Survivor區,之后每經過一次Monitor GC那么對象的年年齡加1,直到達到閾值(默認是15),對象進入老年代 4.動態判斷對象的年齡.如果Survivor區中相同年齡的所有對象大小的總和大于Survivor空間的一半,年齡大于或等于該年齡的對象可以直接進入老年代.5.空間分配擔保 -XX:HandlePromotionFailure:true/false 是否設置空間分配擔保 JDK7及以后這個參數就失效了。只要老年代的連續空間大于新生代對象的總大小或者歷次晉升到老年代的對象的平均大小就進行MinorGC,否則FullGC。HotSpot中空間分配檢查的代碼片段 bool TenuredGeneration::promotion_attempt_is_safe(size_t max_promotion_in_bytes) const {// 老年代最大可用的連續空間size_t available = max_contiguous_available(); // 每次晉升到老年代的平均大小size_t av_promo = (size_t)gc_stats()->avg_promoted()->padded_average();// 老年代可用空間是否大于平均晉升大小,或者老年代可用空間是否大于當此GC時新生代所有對象容量bool res = (available >= av_promo) || (available >= max_promotion_in_bytes);return res; }不穩定參數分為3類: 1.性能參數:用于JVM的性能調優和內存分配控制,如內存大小的設置 2.行為參數:用于改變JVM的基礎行為,如GC的方式和算法的選擇 如-XX:+UseG1GC 3.調試參數: 用于監控.打印,輸出jvm的信息.https://www.cnblogs.com/leeego-123/p/11572786.htmljava -server -Xms4G -Xmx4G -Xmn2G -XX:NewRatio=2 -XX:SurvivorRatio=1 -XX:PretenureSizeThreshold=<字節大小> 默認值是0,意味著任何對象都會先在新生代分配內存,該參數可以設分配到新生代對象的大小限制 任何比這個大的對象都不會嘗試在新生代分配,將直接在老年代分配內存。典型的大對象就是很長的字符串或者數組,它們在被創建后會直接進入老年代,這樣做的目的是避免在Eden區和兩個Survivor區之間發生大量的內存復制(新生代采用復制算法) -XX:PermSize=20M 設置方法區的初始大小 -XX:MaxPermSize=30M 設置方法區的最大值 -XX:+UseConcMarkSweepGC 意思是使用CMS垃圾回收器 (Concurrent Mark Sweep)回收器是在最短回收停頓時間為前提的回收器,屬于多線程回收器,采用標記-清除算法。 -XX:MetaspaceSize=128M https://blog.csdn.net/u011069294/article/details/107393331JVM方法區(元空間)大小設置(-XX:MetaspaceSize和-XX:MaxMetaspaceSize)方法區跟Java堆一樣,也是線程共享的區域,它用于存儲虛擬機加載的類、常量、靜態變量、即時編譯器編譯后的代碼等數據,常量池即在方法區存在在JDK1.8開始有了元空間區(Matespace)來替換永久代(Permanent Generation),Metaspace使用的是本地內存,而不是堆內存,也就是說在默認情況下Metaspace的大小只與本地內存大小有關超過這個值就會引發Full GC,這個值不是固定的,是會隨著JVM的運行進行動態調整的,與此相關的參數還有多個,詳細情況請參考這篇文章jdk8 Metaspace 調優-XX:HandlePromotionFailure:true 是否設置空間分配擔保 JDK7及以后這個參數就失效了。只要老年代的連續空間大于新生代對象的總大小或者歷次晉升到老年代的對象的平均大小就進行MinorGC,否則FullGC。1.堆設置 -Xms4G 是指: JVM啟動時整個堆(包括年輕代,年老代)的初始化堆內存。 初始堆大小 默認為內存的(1/64) -Xmx4G 是指: JVM啟動時最大堆內存。 最大堆大小 默認為內存的(1/4) -Xmn2G 是指: 新生代的內存,剩下的是年老代的內存大小, 值等于-Xmx減去-Xmn -XX:NewRatio=2 年輕代/老年代 年輕的:老年代為 1:2 -XX:SurvivorRatio=1 是指:年輕代空間中2個Survivor空間與Eden空間的大小比例。此處為1:1:1,算法如下:比如整個年輕代空間為2G,如果比例為1,那么2/3,則S0/S1/Eden的空間大小是同樣的,為666M。該值不設置,則JDK默認為比例為8,那么是1:1:8,通過上面的算法可以得出S0/S1的大小。我們可以看到官方通過增大Eden區的大小,來減少YGC發生的次數,但有時我們發現,雖然次數減少了,但Eden區滿的時候,由于占用的空間較大,導致釋放緩慢,此時stop-the-world的時間較長,因此需要按照程序情況去調優。 -XX:MetaspaceSize=128M 2. 收集器設置 -XX:+UseConcMarkSweepGC 是指:使用CMS垃圾回收器。JDK1.7以后推薦使用G1垃圾收集器(Garbage First) -XX:+UseG1GC

總結

以上是生活随笔為你收集整理的jvm垃圾回收策略之标记清除的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。