
1. JVM執行緒優化
1.1. 當空間不足時,可以調整執行緒使用的記憶體
1.2. 每個執行緒都有一個原生堆疊,作業系統會在這里存盤執行緒的呼叫堆疊資訊
1.3. 原生堆疊的大小是1 MB
-
1.3.1. 32位的Windows JVM原生堆疊大小是320KB
-
1.3.2. 在64位的JVM中,通常不會修改這個值
- 1.3.2.1. 除非機器的物理記憶體相當緊張
-
1.3.3. 較小的堆疊大小可以防止應用程式用完原生記憶體
-
1.3.3.1. 許多程式可以在堆疊大小為256 KB時運行
-
1.3.3.2. 很少有程式需要用到完整的1 MB
-
1.4. -Xss=N標志
- 1.4.1. 改變執行緒的堆疊大小
2. 原生記憶體溢位
2.1. 在32位的JVM中,行程使用的記憶體達到了4 GB(或者小于4 GB,取決于作業系統)的最大大小
2.2. 系統實際已經耗盡虛擬記憶體
2.3. 減小堆疊的大小可以解決
2.4. 在Unix風格的系統上,用戶創建的行程(他們正在運行的所有程式)已經達到了此次登錄配置的最大行程數
- 2.4.1. 單個執行緒被認為是一個行程
2.5. 無法從JVM的例外中判斷是這三種情況中的哪一種
3. 偏向鎖
3.1. 讓鎖偏向于最近訪問鎖的執行緒
- 3.1.1. 如果一個執行緒最近使用了某個鎖,那么下次它執行被同一個鎖保護的代碼時,處理器的快取更有可能還包含該執行緒需要的資料
3.2. 但是偏向鎖需要簿記資訊,所以有時機器性能會更糟糕
3.3. 使用執行緒池的應用程式(包括某些應用程式和REST服務器)在偏向鎖生效時,往往表現得更差
3.4. -XX:-UseBiasedLocking
-
3.4.1. 禁用偏向鎖
-
3.4.2. 默認開啟的
4. 執行緒優先級
4.1. 每個Java執行緒都有一個由開發人員定義的優先級,這是對作業系統的一種提示,用來說明程式認為特定執行緒有多重要
4.2. 作業系統會為機器上運行的每個執行緒計算一個當前優先級
-
4.2.1. 當前優先級既考慮了Java分配的優先級,也考慮了許多其他因素
-
4.2.2. 最重要的因素是執行緒上次運行到現在有多長時間
-
4.2.3. 無論其優先級如何,都不會有執行緒因為等待訪問CPU而“饑餓”
4.3. 在Windows上,Java優先級較高的執行緒往往比優先級較低的執行緒運行得更多,但即使是低優先級的執行緒也會獲得相當多的CPU時間
4.4. 無論在哪種情況下,都不能依賴執行緒的優先級來決定它的運行頻率
4.5. 如果某些任務比其他任務更重要,就必須使用應用程式邏輯來確定它們的優先級
5. 監控執行緒和鎖
5.1. 執行緒的總數
-
5.1.1. 通過系統提供的基本執行緒資訊可以大致了解運行的執行緒數量
-
5.1.2. 確保它不會太高或太低
5.2. 查看執行緒資訊可以確定執行緒被阻塞的原因
-
5.2.1. 它們在等待資源
-
5.2.2. 它們在等待I/O
5.3. 查看執行緒
-
5.3.1. jconsole
- 5.3.1.1. 顯示JVM內的執行緒狀態
5.4. 查看阻塞執行緒
-
5.4.1. Java飛行記錄器JFR
-
5.4.1.1. 可以查看JVM內部、并能在底層知道執行緒何時被阻塞
-
5.4.1.2. 提供了一個簡單的方法來檢查導致執行緒阻塞的事件
-
-
5.4.2. jstack
-
5.4.2.1. 提供虛擬機中每個執行緒的狀態資訊,包括執行緒是否在運行、是否在等待鎖、是否在等待I/O
-
5.4.2.2. 在一定程度上可以查看執行緒阻塞在什么資源上
-
-
5.4.3. 大量的阻塞執行緒會降低性能,不管是什么原因造成的阻塞,都需要改變配置或應用程式,以避免阻塞
6. 執行緒性能沒有太多可以優化
6.1. 可以調整的JVM標志相對較少
6.2. 這些標志的效果也十分有限
6.3. 良好的執行緒性能最佳實踐準則
-
6.3.1. 管理執行緒數
-
6.3.2. 限制同步影響
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/548213.html
標籤:其他
