您好,登錄后才能下訂單哦!
這篇文章主要講解了“JVM如何優化”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JVM如何優化”吧!
垃圾回收的方式:復制算法、標記整理、標記清除、分代回收
垃圾回收的實現:Serial
、parNew
、parallel Scavenge
和g1d
等等
graph LR A("Eden") B("from") C("to") A -.- B B -.- C
Java堆中,默認Eden: from: to = 8: 1: 1
將轉移到老年代的對象數量降低到最小;
減少fullGC的執行時間
頻繁有大對象在新生代發生復制算法,性能大大降低?
-XX:PretenureSizeThreshold=<byte size> # 新生代中的對象進入老年代的大小閾值
當對象大小超過設定的字節大小,會直接進入老年代,不接受復制算法的影響
FGC 太過頻繁,怎么解決?
新生代過小,導致對象提前進入老年代,觸發老年代發送FGC;
老年代較大,進行GC時耗時較大;
-XX:NewRatio=4 # 老年代 與 新生代的 比值,即新生代:老年代 = 4:1 -XX:SurvivorRatio=4 # Eden 與 一個 Survivor 的比值,即 Eden: Survivor = 4:1
OOM (Out Of MemoryError) 內存溢出錯誤與SO(Stack OverFlow) 棧溢出?
Xss
設置過小,而每個方法執行需要的局部變量內存太大或者方法嵌套循環次數太高就是出現
存在死循環或者不斷重復創建對象,堆實際大小超過了Xmx
限制
虛擬機裝載了太多Class
和jar
信息,使得永久代(之前叫方法區)空間不夠
理解完后我們去解決
Java虛擬機規范 Java 堆的原文:The heap is the runtime data area from which memory for all class instances and arrays is allocated.
我們都知道,每個線程生命周期與虛擬機棧一樣,間接說明創建線程的同時也會創建對應的私有虛擬機棧,用于Java方法執行的內存模型
而Java中提供JVM
調優的三大參數:
用于Java堆(新生代和老年代)
-Xms, -Xmx
用于永久代
-XX:PermSize, -XX:MaxPermSize
用于線程棧,不同在于前者可以通過k、m和g來設置,后者要“=數字”,默認以KB(千字節)為單位
-Xss, -XX:ThreadStackSize
首先先理解堆,堆是GC
收集器管理的主要區域,這時應該會聯想到前文所講的新生代與老年代,更深入就是Eden
、From
和To
了。
首先先分類,內存溢出有棧溢出和堆溢出,-Xms
和-Xms
是設置Java
堆的初始化大小和可擴展最大值,一般設置成一致,避免發生內存抖動,而-Xss
則是Stack Size
的意思,即是每個線程創建虛擬機棧的大小
而且內存受操作系統限制,溢出的問題根源也在這里
物理最大內存 = 保留內存 + Xmx(堆) + Xss(棧) * 線程數 Xss = 虛擬機棧寬度(棧幀大小) * 虛擬機棧深度(棧幀數) 棧幀 = 局部變量表 + 操作數棧 + 動態鏈接 + 方法入口 + 其他
內存因為永久代導致的溢出,可以清理應用程序中web-inf/lib
下的jar
,或者tomcat
中啟動了多個程序則公用相同的Jar
其他內存溢出還有諸如直接內存內存溢出、垃圾回收超時內存溢出、創建本地線程內存溢出、超出交換區內存溢出、數組超限內存溢出、系統殺死進程內存溢出。
感謝各位的閱讀,以上就是“JVM如何優化”的內容了,經過本文的學習后,相信大家對JVM如何優化這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。