Java虛擬機調優,JVM優化,工做很是實用的調優

JVM大致結構

張澤立JVM

class 文件 加載-驗證-準備-解析-初始化-使用-卸載 一個線程一個棧,一個方法一個棧幀java

如何肯定垃圾

  • 引用計數
    • 會有循環引用的問題
  • 正向可達
    • 從roots對象計數能夠達到的對象

垃圾收集算法

  • 標記清除(缺點:內存碎片化,沒有連續的內存)算法

  • Copying (缺點:浪費內存 通常用在新生代[new])bash

  • 標記壓縮 (比copying慢一點 通常用在老年代[tenured])多線程

  • new併發

    • 存活對象少
    • 使用copying,佔用的內存空間也不大,效率也高
  • oldjvm

    • 垃圾少
    • 通常使用mark-compact

瞭解一下上一篇《垃圾收集器》spa

  • Serial Collector
    • XX:+UseSerialGC
    • 單線程
  • Parallel Collector
    • 並行量大,不過每次垃圾收集,JVM會停頓
    • CMS Collector
    • 併發分區來完成,停頓時間短
  • G1
    • 不只停頓短,同事併發大。僅僅是個平衡點
    • 有人說建議Java9用這個

JVM 參數

  • - 標準參數,全部jvm 都應該支持
  • -X 非標,每個jvm實現都不一樣
  • -XX 不穩定參數,下一個版本可能會取消

java 對象的分配

不開逃逸分析不會先分配在棧上
複製代碼
  • 棧上分配.net

    • 線程私有小對象
    • 無逃逸(-XX:+DoEscapeAnalysis開啓逃逸分析 默認是開啓的)
    • 支持標量替換
    • 無需調整
  • 線程本地分配TLAB(Thread Locla Allacation Buffer)線程

    在堆上也是eden區,這樣作的目的是有一部分數據能夠不加鎖

    • 佔用eden,默認1%
    • 多線程的時候不用競爭eden就能夠申請空間,提升效率
    • 小對象
    • 無需調整
  • 老年代code

    • 大對象
  • eden

  • 堆:
    -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=tmp/jvm.dump -XX:PrintGCDetails
    -Xms10M -Xmx10M 直接調大最大,避免中途分析和垃圾回收的計算

  • 棧 +Xss128k
    大 線程遞歸調用能夠很深
    小 線程併發數量能夠特別多

最後

喜歡的能夠關注個人公衆號'java小瓜哥的分享平臺"謝謝!

相關文章
相關標籤/搜索