系統優化怎麼做-JVM優化之開篇

来源:https://www.cnblogs.com/changsong/archive/2018/08/21/9511084.html
-Advertisement-
Play Games

大家好,這裡是「聊聊系統優化 」,併在下列地址同步更新 博客園:http://www.cnblogs.com/changsong/ 知乎專欄:https://zhuanlan.zhihu.com/youhua 思否專欄:https://segmentfault.com/blog/youhua 全網私 ...


大家好,這裡是「聊聊系統優化 」,併在下列地址同步更新

在這裡我會從基於J2EE系統及互聯網架構方面,來談談系統優化的各個方面,乾貨滿滿,歡迎訂閱及關註!

前言

在上一期Tomcat優化中,針對JVM相關主要參數做過一定說明,這一期主要介紹進行一些概念及經驗。後面分章節去講述相關工具的基本使用。

優化優先順序

整體來講,系統優化應先優化架構及代碼,來解決具體功能點效率問題。最後通過JVM監控工具來發現一些隱藏較為深入的問題。

相關情形

  • 記憶體占用並不斷增加, 系統壓力大情況下Full GC頻繁,系統出現卡頓
  • 線程出現大量等待及死鎖, CPU使用率過高, 系統響應慢
  • 堆(heap)記憶體不足或類載入導致JVM Crash,系統宕機
出現以上情況,就得使用工具分析JVM來確定問題

JVM記憶體模型

JDK1.7及以下

JDK1.8下,PermGen替換成Vm MetaSpace

Heap域

  • 全局被所有線程分享
  • 存所有對象及集合對象

方法域

  • 全局被所有線程分享
  • 存所有類的結構定義包含屬性,方法及構造函數等

Thread1.N

  • 本地私有棧,一個線程一個棧
  • 保持著所有在Heap域的對象引用(4byte長度)
  • 存儲本地局部變數的存儲(基礎數據類型),程式運行狀態,方法返回值

記憶體泄漏的分類

  • 堆記憶體泄漏 - 比較常見
  • 持久代記憶體泄漏
  • 棧記憶體泄漏
  • 系統資源記憶體泄漏 -比較常見

線程相關知識

JVM線程狀態遷移

線程狀態

  • 初始化(New):初期創建,啟動後則進入可執行狀態
  • 可執行狀態(Runnable): 只要獲取CPU時間,則開始執行
  • 運行狀態(Running): 正在使用CPU執行
  • 阻塞狀態(Bloked)

    • 等待阻塞(wait)
    • 同步阻塞(synchronized)
    • 睡眠阻塞(sleep)
    • Join阻塞: 等待join子線程結束後,主線程才能執行,將非同步執行的線程合併為同步的線程
  • 結束狀態: 線程執行完畢或者異常退出

性能監控關註點

  • 系統線程總數
  • 死鎖線程 需要優先解決
  • 線程Bloked總數數量

    線程Bloked多的情況下,考慮對待處理數據進行分片,進行多通道,多線程處理提高系統性能
    如果系統處理慢,但CPU占用一直很低,就需要梳理系統處理流程,串列處理該並行處理,並行處理流程提高併發來解決。

線程死鎖

當兩個或者多個線程嘗試獲取其他資源的鎖,而每個線程又陷入無限等待其他資源鎖的釋放(相互等待),除非一個用戶的進程被終止。

幾個死鎖場景

  • 兩個線程相互調用Thread.join(), 導致互相等待同步結束。

慎用線程join操作
  • 當兩個線程使用嵌套的同步塊時,一個線程占用了另一個線程的必需的鎖,互相等待時被阻塞,就有可能出現死鎖。 也可能多個線程形成環狀鎖,比如線程A等待線程B,線程B等待線程C,線程C等待線程A。線程A為了檢測死鎖,它需要遞進地檢測所有被B請求的鎖。從線程B所請求的鎖開始,線程A找到了線程C,發現線程C請求的鎖被線程A自己持有著。這是它就知道發生了死鎖。

  • MySql死鎖

MySql中兩個線程同時對兩條記錄做先讀後寫操作

避免死鎖

  • 安全狀態
找到一個分配資源的序列能讓所有進程都順利完成
  • 銀行家演算法
採用預分配策略檢查分配完成時系統是否處在安全狀態

檢測死鎖

  • VisualVM(或其他工具)
監控線程狀態,如果出現死鎖得到相關代碼位置
  • 死鎖定理化間資源分配圖
利用死鎖定理化間資源分配圖來分析死鎖的存在
參見以下資料:
https://www.coursera.org/lect...

總結

本章主要講了一些核心知識,主要為了讓大家瞭解系統優化到底優化和解決什麼問題,什麼是優化的目標。後續章節會講到tomcat的JMX配置,VisualVM,Tprofile等工具的使用。

思考題

JVM線程有哪些狀態,這些線程大多處於什麼樣的狀態分佈, 我們可以稱系統運行是健康的。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在微信開發中,寫過的一個簡單的音樂播放組件,記錄下。 music 音樂播放組件。 屬性 代碼 properties: { // 音樂路徑 music: { type: String, value: '', observer: function (newVal) { this._initMusic(n ...
  • this其實是一個Html 元素。 $this 只是個變數名,加$是為說明其是個jquery對象。 而$(this)是個轉換,將this表示的dom對象轉為jquery對象,這樣就可以使用jquery提供的方法操作。 先來看看JQuery中的 $() 這個符號,實際上這個符號在JQuery中相當於J ...
  • 此文是我的出版書籍[《React Native 精解與實戰》](http://rn.parryqiu.com/)連載分享,此書由機械工業出版社出版,書中詳解了 React Native 框架底層原理、React Native 組件佈局、組件與 API 的介紹與代碼實戰,以及 React Native... ...
  • Element.getBoundingClientRect()返回元素的大小及相對於視窗的位置 語法: rectObject=object.getBoundingClientRect(); 返回值是一個DOMRect對象,即DOMRect={x:scrollLeft,y:scrollY,width: ...
  • 開發環境: 安裝JDK8 安裝STS http://spring.io/tools/sts/ 安裝MySql 伺服器 https://www.mysql.com/downloads/ 客戶端 Navicat Premium 12 ...
  • 一、什麼是分散式系統 分散式系統是建立在網路之上的系統。分散式系統背後是由一系列的電腦組成的,但用戶感知不到背後的邏輯,就像訪問單個電腦一樣。 特征: 最開始一臺伺服器上存儲著文件,數據,應用程式。隨著流量的增多,瓶頸出現,應用程式需要更快CPU,資料庫伺服器要更大記憶體(緩存)和硬碟,文件伺服器 ...
  • 熟悉TCP變成的可以知道,無論是客戶端還是服務端,但我們讀取或者發送消息的時候,都需要考慮TCP底層粘包/拆包機制,下麵我們先看一下TCP 粘包/拆包和基礎知識,然後模擬一個沒有考慮TCP粘包/拆包導致功能異常的案例,最後,通過正確的常式來談談Netty是如何實現的。 主要內容: TCP粘包/拆包的 ...
  • 工廠模式出現的原因 在java中,創建一個對象最簡單的方法就是使用new關鍵字。但在一些複雜的業務邏輯中,創建一個對象不只需要new一行代碼就成了,可能需要一些列的初始化設置,或先創建一些輔助對象來創建這個對象。 在這種場景中,如果需要多次創建這種對象,那每次都要寫很多代碼。工廠模式的產生就是為瞭解 ...
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...