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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

JVM从入门到精通(八):JVM调优实战

發布時間:2024/2/28 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JVM从入门到精通(八):JVM调优实战 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
案例1:系統CPU經常100%,如何調優?

推理過程是:CPU100%,那么一定有線程在占用系統資源,所以

  • 找出哪個進程cpu高(top命令)
  • 該進程中的哪個線程cpu高(top -Hp)
  • 如果是java程序,導出該線程的堆棧 (jstack命令)
  • 查找哪個方法(棧幀)消耗時間,哪個方法調用的哪個方法 (jstack),然后去看這個方法的代碼
  • 工作線程占比高 / 垃圾回收線程占比高?
  • 案例2:系統內存飆高,如何查找問題?
  • 導出堆內存 (jmap)
  • 分析 (jhat jvisualvm mat jprofiler … )
  • 如何監控JVM?

    可以使用 jstat jvisualvm jprofiler arthas top…等等

    一個案例理解常用工具

  • 測試代碼:
  • package com.mashibing.jvm.gc;import java.math.BigDecimal;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.concurrent.ScheduledThreadPoolExecutor;import java.util.concurrent.ThreadPoolExecutor;import java.util.concurrent.TimeUnit;/*** 從數據庫中讀取信用數據,套用模型,并把結果進行記錄和傳輸*/public class T15_FullGC_Problem01 {private static class CardInfo {BigDecimal price = new BigDecimal(0.0);String name = "張三";int age = 5;Date birthdate = new Date();public void m() {}}private static ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(50,new ThreadPoolExecutor.DiscardOldestPolicy());public static void main(String[] args) throws Exception {executor.setMaximumPoolSize(50);for (;;){modelFit();Thread.sleep(100);}}private static void modelFit(){List<CardInfo> taskList = getAllCardInfo();taskList.forEach(info -> {// do somethingexecutor.scheduleWithFixedDelay(() -> {//do sth with infoinfo.m();}, 2, 3, TimeUnit.SECONDS);});}private static List<CardInfo> getAllCardInfo(){List<CardInfo> taskList = new ArrayList<>();for (int i = 0; i < 100; i++) {CardInfo ci = new CardInfo();taskList.add(ci);}return taskList;}}
  • java -Xms200M -Xmx200M -XX:+PrintGC com.mashibing.jvm.gc.T15_FullGC_Problem01

  • 一般是運維團隊首先受到報警信息(CPU過高, Memory占比大…然后你才去查原因)

  • top命令觀察到問題:內存不斷增長 CPU占用率居高不下

  • top -Hp 觀察進程中的線程,哪個線程CPU和內存占比高

  • jps定位具體java進程
    jstack 定位線程狀況,重點關注:WAITING BLOCKED
    e.g.
    waiting on <0x0000000088ca3310> (a java.lang.Object)
    假如有一個進程中100個線程,很多線程都在waiting on <xx> ,一定要找到是哪個線程持有這把鎖
    怎么找?搜索jstack dump的信息,找 ,看哪個線程持有這把鎖RUNNABLE
    作業:
    1: 寫一個死鎖程序,用jstack觀察
    2: 寫一個程序,一個線程持有鎖不釋放,其他線程等待

  • 為什么阿里規范里規定,線程的名稱(尤其是線程池)都要寫有意義的名稱?為了方便定位!
    怎么樣自定義線程池里的線程名稱?(自定義ThreadFactory)

  • jinfo pid了解即可,用處不是特別大

  • jstat -gc 動態觀察gc情況 / 閱讀GC日志發現頻繁GC / arthas觀察 / jconsole/jvisualVM/ Jprofiler(最好用,收費)
    jstat -gc 4655 500 : 每個500個毫秒打印GC的情況
    如果面試官問你是怎么定位OOM問題的?如果你回答用圖形界面(錯誤)
    1:已經上線的系統不用圖形界面用什么?(cmdline arthas)
    2:圖形界面到底用在什么地方?測試!測試的時候進行監控!(壓測觀察)

  • jmap - histo 4655 | head -20,查找有多少對象產生,這個命令對線上系統影響不大。
    jmap -dump:format=b,file=xxx pid手動導出堆文件,這個命令不能線上用。
    線上系統,內存特別大,jmap執行期間會對進程產生很大影響,甚至卡頓(電商不適合),你可以這么說:
    1:設定了參數HeapDump,OOM的時候會自動產生堆轉儲文件
    2:很多服務器備份(高可用),先把這臺機器隔離開,停掉這臺服務器對其他服務器不影響
    3:在線定位arthas(一般小點兒公司用不到,這樣吹容易露餡兒)

  • java -Xms20M -Xmx20M -XX:+UseParallelGC -XX:+HeapDumpOnOutOfMemoryError com.mashibing.jvm.gc.T15_FullGC_Problem01

  • 使用MAT / jhat /jvisualvm 進行dump文件分析
    https://www.cnblogs.com/baihuitestsoftware/articles/6406271.html
    jhat -J-mx512M xxx.dump
    http://192.168.17.11:7000
    拉到最后:找到對應鏈接
    可以使用OQL查找特定問題對象

  • 找到代碼的問題

  • 實戰

    top 命令

    列出1591進程下的所有線程,重點關注:WAITING BLOCKED

    java 日志

    總結

    以上是生活随笔為你收集整理的JVM从入门到精通(八):JVM调优实战的全部內容,希望文章能夠幫你解決所遇到的問題。

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