jvm性能優化到底在優化什麼?

1、jvm中的stop the world

  • 我們要知道jvm中的stop the world是指什麼?我們都知道當程序運行的時候,創建的對象等數據是放在jvm堆內存上的
  • 當堆內存滿了之後,jvm是會進行垃圾回收的,就是當jvm進行垃圾回收時會發生stop the world會停止其他的工作線程
  • 不能jvm一邊回收着垃圾,工作線程那邊創建着對象去佔用內存吧,所以stw是會導致系統對用戶來說產生卡頓停頓現象

2、jvm性能優化到底在優化什麼?

  • jvm性能優化就是指的是通過內存的合理分配,以及合理的設置參數,避免jvm頻繁的發生垃圾回收,減少系統停頓時間等。
  • jvm在年輕代發生的是yong Gc使用的是複製回收算法,一般使用的垃圾收集器是ParNew+CMS,複製回收算法效率較高,並且大部分對象都會再年輕代被回收掉(GcRoot跟路徑掃描判斷對象是否可回收),耗時較短
  • jvm在老年代會發生full Gc 使用的是標記整理髮,垃圾回收時分爲初始標記,併發標記,併發清理,內存整理等階段,耗時較長一般能有 young gc耗時的10倍左右,並且老年代的對象大部分都是長期存活的對象,執行過full Gc之後回收掉無用對象剩餘的空間可能還不夠年輕代將要晉升老年代的對象空間,那麼可能就會頻繁發生full gc了
  • 所以總結下來jvm性能優化的本質就是:通過年輕代&老年代內存合理的分配,儘量讓對象都在年輕代時被回收,儘量減少對象或者沒有對象進入老年代,儘量做到長時間或者零full Gc

3、垃圾收集器選擇

  • 一般針對小內存的機器可以使用ParNew+CMS當堆內存滿了採用並行垃圾回收的方式,儘量縮短垃圾回收時間,減少系統卡頓時間,但是這種方式不能控制stw停頓時間,如果當機器內存較大比如32G,新生代分了20G內存,當新生代快滿時進行young gc,一下子回收掉將近20G的內存,那麼stw的時間肯定會比較長,所以針對較大內存的機器可能ParNew+CMS這種垃圾回收器就不太適合了。
  • 用G1來優化大內存機器的young gc的性能,G1垃圾收集器可以設置一個預期的GC停頓時間,比如100ms,G1垃圾收集器會把年輕代空間劃分爲一個個的邏輯Region區,會根據設置的預期停頓時長來預估每個Region的垃圾回收時間,選擇能回收最多垃圾時長又在設置最大時長之內的Region區域進行回收,這樣就可以讓每次young gc的時候最多停頓100ms,避免影響用戶使用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章