JVM優化了解下【乾貨】

作爲三年的開發程序員,如果JVM還不是太瞭解的話,那就太菜了,說出去丟人,僅是我個人的理解。

在這裏插入圖片描述

主要說下JVM內存結構以及怎麼使用方案。


Java內存結構(各個部分都有什麼作用)

在這裏插入圖片描述
主要流程就是一個java文件被編譯爲Class文件之後,然後被機器處理(包括運行到回收得過程),然後去本地方法操作

參數詳解:
1.類加載器:主要是用來加載類文件
2.方法區:也成爲永久區,存儲的是被static修飾變量,類的信息、常量信息、常量池信息、包括字符串字面量和數字常量等,方法區線程之前線程是共享的。定義太多變量會出現內存溢出
3.JAVA堆:存儲被new過的對象,數組。線程之間共享。定義太多變量會出現內存溢出。
堆分爲年輕代和老年代,年輕代分爲edn區,S0和S1,但是S0和S1分到的區域是一樣大的,目的就是爲了垃圾複製算法。

在這裏插入圖片描述

ps:垃圾回收機制一般回收的新生代的內存,但有時候也會回收老年代的內存(次數較少)
4.JAVA棧:存放局部變量,方法。線程之間不共享,執行得是JAVA方法服務
棧是一塊線程私有的空間,棧也分爲局部變量表,操作數棧,動態連接,出口以及其他

在這裏插入圖片描述
局部變量表:主要就是報錯函數的參數及局部變量
操作數棧:用於計算過程結果,同時作爲臨時的一個計算空間。
動態連接:操作局部變量表,操作數棧,同時還會報出一些異常。
出口:報異常,以及返回值。

5.本地方法棧:調用本地方法的,本地方法棧也會拋出StackOverflowError和OutOfMemoryError異常。
6.垃圾收集器:主要是對堆內存中不可達對象進行不定期的回收,回收得是年輕代的內存,但是爲了優化,儘可能的減少垃圾回收得次數,不管是對年輕代還是老年代老說。垃圾回收機制算法分析【乾貨】
7.PC寄存器:存放當前執行環境指針、程序技術器、操作棧指針、計算的變量指針等信息


<h3 id="two’>從那個幾個方面優化

a).減少垃圾回收的次數(將堆的初始值內存和堆的最大內存設置一致)
-Xms20	m -Xmx20m
b).減少變量的定義(能夠避免內存溢出)
c).設置新聲代,年老代的比例
-Xmn    新生代大小,一般設爲整個堆的1/31/4左右
-XX:SurvivorRatio    設置新生代中eden區和from/to空間的比例關係n/1


常用參數詳解


------堆設置:

  -Xms:初始堆大小

  -Xmx:最大堆大小

  -XX:NewSize=n:設置年輕代大小

  -XX:NewRatio=n:設置年輕代和年老代的比值。如:3,表示年輕代與年老代比值爲13,年輕代佔整個年輕代年老代和的1/4

  -XX:SurvivorRatio=n:年輕代中Eden區與兩個Survivor區的比值。注意Survivor區有兩個。如:3,表示Eden:Survivor=32,一個Survivor區佔整個年輕代的1/5

  -XX:MaxPermSize=n:設置持久代大小

------收集器設置

-XX:+UseSerialGC:設置串行收集器

  	-XX:+UseParallelGC:設置並行收集器

  	-XX:+UseParalledlOldGC:設置並行年老代收集器

  	-XX:+UseConcMarkSweepGC:設置併發收集器

------垃圾回收統計信息

-XX:+PrintGC

  	-XX:+PrintGCDetails

  	-XX:+PrintGCTimeStamps

  	-Xloggc:filename

------並行收集器設置

-XX:ParallelGCThreads=n:設置並行收集器收集時使用的CPU數。並行收集線程數。

  	-XX:MaxGCPauseMillis=n:設置並行收集最大暫停時間

  	-XX:GCTimeRatio=n:設置垃圾回收時間佔程序運行時間的百分比。公式爲1/(1+n)

------併發收集器設置

-XX:+CMSIncrementalMode:設置爲增量模式。適用於單CPU情況。

  	-XX:ParallelGCThreads=n:設置併發收集器年輕代收集方式爲並行收集時,使用的CPU數。並行收集線程數。
ps:Eclipse可設置實時關注內存:

window ------> Preferences ------> General ------> 右側中 Show Heap Status
如圖:在這裏插入圖片描述


內存溢出原因及解決辦法

內存溢出原因:

主要就是出現遞歸調用的方法,但是循環也能夠產生遞歸,也會出現這種問題。

內存溢出解決方案:
去Tomcat 中bin 目錄下 的 catalina.sh 修改JVM堆內存大小
JAVA_OPTS="-server -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m"

在實戰中學習,在快樂中成長

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章