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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

java内存优化详解_jvm堆内存优化详解

發布時間:2024/9/15 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java内存优化详解_jvm堆内存优化详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在日常的運維工作中用到tomcat,都需要對tomcat中的jvm虛擬機進行優化,只有知道需要優化參數的具體用處,才能深刻體會優化jvm的意義所在。

在平常的工作中我們談對jvm的優化,主要是針對java的堆內存的優化和垃圾回收機制的優化。

JVM堆內存示意圖:

JVM的堆內存的組成:

young generation:新生代

eden:伊甸園區

surived:存活區

其中存活區有2個,第1個為S0,第2個為S1

old generation:老年代

permanent generation:持久代

堆內存相關參數詳解:

-Xms:初始化堆內存大小,不包括持久代的內存,默認為物理內存的1/64,不會超過1G

-Xmx:最大堆內存大小,不包括持久代內存,默認為物理內存的1/4

-Xmn:新生代內存大小,默認值為Xmx的3/8,老年代內存則為5/8

-XX:NewRatio:指定新生代與老生代的內存的比值,默認值為2

-XX:SurvivorRatio:eden和2個存活區內存的比值,默認值為8

-XX:PermSize:初始化時持久代內存的大小

-XX:MaxPermSize:最大持久代內存的大小

建議:

1.一般建議Xms等于Xmx,好處是避免每次gc后,調整堆的大小,減少系統內存分配開銷

2.建議-XX:PermSize和-XX:MaxPermSize的值相同,因為永久代大小的調整也會導致堆內存需要觸發FGC; 一般設置為128M就足夠;

棧內存相關參數詳解:

-Xss:指定線程的最大棧空間,默認為1M

jvm垃圾收集算法:

1.引用計數算法

每個對象有一個引用計數屬性,新增一個引用計數加1,引用釋放時計數減1,計數為0可以回收。

此方法簡單,無法解決對象相互循環引用的問題。還有一個問題是如何解決精準計數。

2.根搜索算法(GC Roots)

從GC Roots開始向下搜索,搜索所走過的路徑稱為引用鏈,當一個對象到GC Roots沒有任何引用鏈時,則證明此對象是不可用的。

jvm垃圾回收算法:

1.復制算法(Copying)

2.標記清除算法(Mark-Sweep)

3.標記整理壓縮算法(Mark-Compac)

復制算法:

采用從根集合掃描,并將存活對象復制到一塊新的沒有使用過的空間中,成本是需要一塊內存交換空間

此算法用于新生代內存回收,從E區復制到S0或者S1

標記清除算法:

采用從根集合掃描,對存活的對象標記,標記完畢后再掃描整個空間中未被標記的對象,進行回收。

優點:在存活對象較多的情況下極為高效

缺點:標記清除算法直接回收不存活的對象,會造成內存碎片

標記整理壓縮算法:

采用與標記清除一樣的方式進行對象的標記,但在清除時不同,在回收不存活的對象后,會將所有存活

對象往左端空閑空間移動,并更新對應的指針。此算法在標記清除的基礎上,又進行了對象的移動。

優點:可以解決內存碎片問題

缺點:成本要比標記清除算法要高

垃圾回收名詞解釋:

1.串行回收(Serial)? --> gc單線程內存回收,會暫停所有用戶線程,獨占式回收

2.并行回收(Parallel)? --> 多個gc線程并行工作,會暫停所有用戶線程,獨占式回收

3.并發回收(CMS) --> gc線程和用戶線程同時執行,不需要停頓用戶線程(用戶線程還是需要停頓,只是很短)

GC串行回收器(Serial回收器):

1.是一個單線程的收集器,只能使用一個CPU或一條線程去完成垃圾收集;在進行垃圾收集時,必須

暫停所有其它工作線程。直到收集完成。

2.缺點:Stop-the-World

3.優勢:簡單,對于單CPU的情況,由于沒有多線程交互開銷,反而更高效。

開啟方法:

-XX:+UseSerialGC來開啟

使用此參數后:新生代和老年代都采用Serial回收器進行垃圾回收

新生代使用復制算法

老年代使用標記壓縮算法

GC并行回收器(ParNew回收器):

1. 并行回收也是獨占式回收器,在收集過程中,應用程序會全部暫停。但由于并行回收器使用多線程

進行垃圾回收,因此在并發能力比較強的CPU上,它產生的停頓時間要短于串行回收器。而在單

CPU上或者并發能力較弱的系統中,回收效果不會比串行回收器好。

開啟方法:

-XX:UserParNewGC

使用此參數后:新生代使用并行回收收集器,老年代使用串行收集器

-XX:ParallelGCThreads 可以指定線程數量,最好與CPU數量相當

新生代使用復制算法

新生代吞吐量優先回收器(Parallel Scavenge回收器):

1.吞吐量優先回收器:關注CPU吞吐量,即運行用戶代碼的時間/總時間,這種收集器能最高效率利用CPU。

開啟方法:

-XX:UseParallelGC開啟

使用此參數后:將使用Parallel Scavenge+Serial Old收集器組合回收垃圾,這也是Server模式下的默認值。

-XX:GCTimeRation 可以設置用戶執行時間占總時間的比例,默認為99,即用1%時間進行垃圾收集

新生代使用復制算法

新生代吞吐量優先回收器(Parallel Scavenge回收器):老生代用Parallel Old算法

開啟方法:

-XX:UseParallelOldGC開啟

使用Parallel Scavenge和Parallel Old組合收集器進行收集

老年代使用標記整理算法

并發標記清除回收器(CMS回收器):

運作過程分為4個階段:初始標記,并發標記,重新標記,并發清除

其中標記和重新標記兩個階段仍然需要Stop-The-World,其它過程中收集器和用戶線程是一起工作的

啟動方法:

-XX:ParallelCMSMarkSweepGC

使用此參數后:使用ParNew + CMS + Serial Old的組合進行內存回收。Serial Old作為CMS出現

“Concurrent Mode Failure”失敗后的后備收集器使用。

其它參數:

-XX:ParallelCMSThreads 手工設置CMS的線程數量

-XX:CMSInitiatingOccupancyFraction:設置CMS收集器在老年代空間被使用多少后發出垃圾收集,默認為68%,僅在CMS收集器時有效。

-XX:CMSFullGCBeforeCompaction:設置CMS收集器在進行若干次垃圾收集后再進行一次內存碎片整理過程,通常與-XX:CMSInitiatingOccupancyFraction一起使用

GC性能監控指標:

吞吐量 --> 應用花在非GC上的時間百分比

CG負荷 --> 與吞吐量相反,指應用花在GC上的時間百分比

暫停時間 --> 應用花在GC stop-the-world的時間

GC頻率 -->

一個交互式的應用要求暫停時間越少越好,非交互性應用,要求GC負荷越低越好

一個實時系統對暫停時間和GC負荷的要求都是越低越好

本文轉自激情燃燒的歲月博客51CTO博客,原文鏈接http://blog.51cto.com/liuzhengwei521/1925056如需轉載請自行聯系原作者

weilovepan520

總結

以上是生活随笔為你收集整理的java内存优化详解_jvm堆内存优化详解的全部內容,希望文章能夠幫你解決所遇到的問題。

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