java的圖像處理 java圖像處理爲什麼耗cpu

CPU: 有的應用需要大量計算,他們會長時間、不間斷地佔用CPU資源,導致其他資源無法爭奪到CPU而響應緩慢,從而帶來系統性能問題。例如:代碼遞歸導致的無限循環,正則表達式引起的回溯,JVM 頻繁的 FULL GC,以及多線程編程造成的大量上下文切換等,這些都有可能導致 CPU 資源繁忙。

內存: Java 程序一般通過 JVM 對內存進行分配管理,主要是用 JVM 中的堆內存來儲存 Java 創建的對象。系統堆內存的讀寫速度非常快,所以基本不存在讀寫性能瓶頸。但是由於內存成本要比磁盤高,相比磁盤,內存的儲存空間又非常有限。所以當內存空間被佔滿,對象無法回收時,就會導致內存溢出、內存泄露等問題。

磁盤 I/O: 磁盤相比內存來說,儲存空間要大很多,但磁盤 I/O 讀寫的速度要比內存慢,雖然目前引入的 SSD 固態硬盤 已經有所優化,但仍然無法與內存的讀寫速度相提並論。

網絡: 網絡對於系統性能來說,也起着至關重要的作用。如果你購買過雲服務,一點經歷過,選擇網絡帶寬大小這一環節。帶寬過低的話,對於傳輸數據比較大,或者是併發量比較大的系統,網絡就很容易成爲性能瓶頸。

異常: Java 應用中,拋出異常需要構建異常棧,對異常進行捕獲和處理,這個過程非常消耗系統性能。如果在高併發的情況下引發異常,持續地進行異常處理,那麼系統的性能就會非常明顯地收到影響。

數據庫: 大部分系統都會用到數據庫,而數據庫的操作往往是涉及到磁盤 I/O 的讀寫。大量的數據庫讀寫操作,會導致磁盤 I/O 性能瓶頸,進而導致數據庫操作的延遲性。對於有大量數據庫讀寫操作的系統來說,數據庫的性能優化是整個系統的核心。

鎖競爭: 在併發編程中,我們經常會需要多個線程,共享讀寫操作同一個資源,這個時候爲了保持數據的原子性。(即保證這個共享資源在一個線程寫的時候,不被另一個線程修改),我們就會用到鎖。鎖的使用可能會帶來上下文切換,從而給系統帶來性能開銷。JDK1.6 之後,Java 爲了降低鎖競爭帶來的上下文切換,對 JVM 內部鎖已經做了多次優化,例如,新增了偏向鎖、自旋鎖、輕量級鎖、鎖粗化、鎖消除等。而如何合理地使用鎖資源,優化鎖資源,就需要你瞭解更多的操作系統知識、Java 多線程編程基礎,積累項目經驗,並結合實際場景去處理相關問題。

衡量一般系統的性能
響應時間
響應時間是衡量系統性能的最重要指標之一,響應時間越短,性能越好,一般一個接口的響應是在毫秒級。在系統中,我們可以把響應時間自下而上分爲以下幾種:

數據庫響應時間:數據庫操作所消耗的時間,往往是整個請求鏈中最耗時的;

服務端響應時間:服務端包括 Nginx 分發的請求所消耗的時間以及服務端程序執行所消耗的時間;

網絡響應時間:這是網絡傳輸時間,網絡硬件需要對傳輸的請求進行解析等操作消耗的時間。

客戶端響應時間:對於普通的 Web、App 客戶端來說,消耗時間是可以忽略不計的,但如果你的客戶端嵌入了大量的邏輯處理,消耗的時間就可能變長,從而成爲系統的瓶頸。

吞吐量
在測試中,我們往往會比較注重系統接口的 TPS(每秒事務處理量),因爲 TPS 體現了接口的性能,TPS 越大,性能越好。在系統中,我們也可以把吞吐量自上而下地分爲兩種:磁盤吞吐量和網絡吞吐量。

我們先來看 磁盤吞吐量,磁盤性能有兩個關鍵衡量指標。

一種是 IOPS(Input/Output Per Second),即每秒的輸入輸出量(或讀寫次數),這種是指單位時間內系統能處理的 I/O 請求數量,I/O 請求通常爲讀或寫數據操作請求,關注的是隨機性能讀寫。適應於隨機讀寫頻繁的應用,如小文件儲存(圖片)、OLTP 數據庫、郵件服務器。

另一種是數據吞吐量,這種是指單位時間內可以成功傳輸的數據量。對於大量順序讀寫頻繁的應用,傳輸大量數據。例如,電視臺的視頻編輯、視頻點播VOD(Video On Demand),數據吞吐量則是關鍵衡量指標。

接下來看網絡吞吐量, 這個是指網絡傳輸時沒有幀丟失的情況下,設備能夠接受的最大數據速率。網絡吞吐量不僅僅跟帶寬有關係,還跟 CPU 的處理能力、網卡、防火牆、外部接口以及 I/O 等緊密關聯。而吞吐量的大小主要由網卡的處理能力、內部程序算法以及貸款大小決定。

計算機資源分配使用率
通常由 CPU 佔用率、內存使用率、磁盤 I/O、網絡 I/O 來表示資源使用率。這幾個參數好比一個木桶,如果其中任何一塊木板出現短板,任何一項分配不合理,對整個系統性能的影響都是毀滅性的。

負載承受能力
當系統壓力上升時,你可以觀察,系統響應時間的上升曲線是否平緩。這項指標能直觀地反饋給你,系統所能承受的負載壓力極限。例如,當你對系統進行壓測時,系統的響應時間會隨着系統併發數的增加而延長,直到系統無法處理這麼多請求,拋出大量錯誤時,就到了極限。

總結
通過今天的學習,我們知道性能調優可以是系統穩定,用戶體驗更佳,甚至在比較大的系統中,還能幫公司節約資源。

但是在項目的開始階段,我們沒有必要過早地介入性能優化,只需在編碼的時候保證其優秀、高效,以及良好的程序設計。

在完成項目後,我們就可以進行系統測試了,我們可以將以下性能指標,作爲性能調優的標準,響應時間、吞吐量、計算機資源分配使用率、負載承受能力。

回顧我自己的項目經驗,有電商系統、支付系統以及遊戲充值計費系統,用戶級都是千萬級別,且要承受各種大型搶購活動,所以我對系統的性能要求非常苛刻。除了通過觀察以上指標來確定系統性能的好壞,還需要在更新迭代中,充分保障系統的穩定性

這裏,給你延伸一個方法,就是將迭代之前版本的系統性能指標作爲參考標準,通過自動化性能測試,校驗迭代發版之後的系統性能是否出現異常,這裏就不僅僅是比較吞吐量、響應時間、負載能力等直接指標了,還需要比較系統資源的 CPU 佔用率、內存使用率、磁盤I/O、網絡 I/O 等幾項間接指標的變化。

本篇文章如有幫助到您,請給「翎野君」點個贊,感謝您的支持。

首發鏈接:https://www.cnblogs.com/lingyejun/p/18190233

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章