天天看點

JVM記憶體結構-2.3java程序線程CPU

java程序、線程、CPU

java程式的運作及運作效率和其所在伺服器環境息息相關,包括伺服器進行、線程、CPU、記憶體、網絡帶寬、磁盤IO等,這裡先介紹java和程序線程cpu的關系。

- CPU

  • CPU是什麼

      中央處理器(CPU,Central Processing Unit)是一塊超大規模的內建電路,是一台計算機的運算核心(Core)和控制核心( Control Unit)。

    它的功能主要是解釋計算機指令以及處理計算機軟體中的資料。

      它與内部存儲器(Memory)和輸入/輸出(I/O)裝置合稱為電子計算機三大核心部件。

      

      

    CPU = 運算邏輯部件 + 寄存器部件 + 控制部件

    運算邏輯部件 寄存器部件 控制部件
    學運算、位移及邏輯操作、執行位址運算及轉換 儲存指令執行過程中臨時存放的寄存器操作數和中間(或最終)的操作結果 負責對指令譯碼,并且發出為完成每條指令所要執行的各個操作的控制信号
  • 工作過程
    工作可以分為5個階段:取指令、指令譯碼、執行指令、訪存取數和結果寫回
    • 從存儲器或高速緩沖存儲器中取出指令
    • 放入指令寄存器
    • 對指令譯碼。它把指令分解成一系列的微操作,然後發出各種控制指令,執行微操作系列,進而完成一條指令的執行
    • 最終階段,寫回,以一定格式将執行階段的結果簡單的寫回
JVM記憶體結構-2.3java程式線程CPU
JVM記憶體結構-2.3java程式線程CPU
  • 多CPU多核多線程

    CPU個數:是指實體上,也及硬體上的核心數;

    CPU核數:是邏輯上的,簡單了解為邏輯上模拟出的核心數;

    CPU線程數:是同一時刻裝置能并行執行的程式個數,線程數=CPU個數 * 單CPU核數

  • 結論
    • 當Java線程數小于CPU線程數,無資源競争,每個CPU線程處理一個java線程,執行速度非常快。
    • 當Java線程數大于CPU線程數,作業系統使用時間片機制,采用線程排程算法,頻繁的進行線程切換。
    • 一般情況:程式線程數等于CPU線程數的2到3倍就能很好的利用cpu了,

      過多的程式線程數不但不會提高性能,反而還會因為線程間的頻繁切換而受影響,具體需要根據線程處理的業務考略,不斷調整線程數個數,确定目前系統最優的線程數

    • 計算密集型推薦:程式線程數應該設定在1~2倍CPU線程數。超過2倍或者小于1倍,吞吐量都會受到較大影響。

- 系統程序

  • 程序是指在系統中***正在運作的***一個應用程式,是執行程式的執行個體,是程式在計算機上的一次執行活動。
  • 每個程序都在CPU虛拟記憶體中配置設定位址空間中運作,每個程序的位址空間是完全獨立的,因為不同程序之間不會意識到其它程序的存在。兩個程序如果想互相通信,則必須要借助核心來實作。
  • 結論:java每啟動一個應用服務,都會啟動一個JVM程序。當然,可以針對每個java應用JVM程序進行參數調整,使其達到最優的服務性能和資源使用率。

- 系統線程

  • 線程是系統配置設定處理器時間資源的基本單元,或者說程序之内獨立執行的一個單元。
  • 對于作業系統而言,其排程單元是線程。
  • 一個程序至少包括一個線程,通常将該線程稱為主線程。一個程序從主線程的執行開始進而建立一個或多個附加線程,就是所謂基于多線程的多任務。
  • 線程是獨立排程的基本機關,共享同一個程序内的資源(線程有自己的棧),減少了程式并發時所付出的時空開銷,并且可以高效的共享資料,有效地利用多處理器和多核計算機,提高os的并發度。
  • 建立/撤銷/切換 程序的開銷遠大于線程的(建立線程比建立程序快10~100倍 UNPv2/P406)。
  • 結論:java應用啟動後生成JVM程序(主線程),其可以根據情況進行多線程操作。但是,每台伺服器都有最大線程數的限制,同時,線程并發并非越多越好,應該控制在一個合理的範圍,java應用最大可開線程數受實體伺服器限制。當伺服器無法支撐使用者對于服務的通路量時,這時應該考慮進行實體伺服器的擴充。

繼續閱讀