1. 程式人生 > >JVM之調優案例分析與實戰

JVM之調優案例分析與實戰

                                      第五章   調優案例分析與實戰 5.1   高效能硬體上的程式部署策略       在高效能硬體部署程式,目前主要有兩種方式: 1) 通過64位JDK來使用大記憶體; 2) 使用若干個32位虛擬機器建立邏輯叢集來利用硬體資源。       對於第一種方式,需考慮以下可能面臨的問題:
  • 記憶體回收導致的長時間停頓;
  • 現階段,64位JDK的效能測試結果普遍低於32位JDK;
  • 需要保證程式足夠穩定,因為這種應用若產生堆溢位幾乎無法產生堆轉儲快照(因為要產生幾十G甚至更大的dump檔案),即使產生了快照也無法進行分析;
  • 相同的程式在64位JDK中消耗的記憶體一般比在32位JDK大,這是由指標膨脹及資料型別對齊補白等因素導致的。
      對於第二種方式,也需考慮如下問題:
  • 儘量避免節點競爭全域性資源,如磁碟競爭,各節點若同時訪問某個檔案的話,很容易導致I/O異常;
  • 很難最高效率地利用某些資源,如連線池,一般都是在各節點建立自己獨立的連線池,這可能導致一些節點池滿了而另外一些節點仍有較多的空餘;
  • 各節點不可避免的收到32位的記憶體限制,32位windows平臺每個程序最多隻能使用2GB記憶體;
  • 大量使用本地快取的應用,在邏輯叢集中會造成較大的記憶體浪費,因為每個邏輯節點都有一份快取,可考慮把本地快取改為集中式快取。
5.2   叢集間同步導致的記憶體溢位       使用類似JBossCache叢集快取來進行同步時,可以允許讀操作頻繁,因為資料在本地記憶體有一份副本,讀取的操作不會耗費多少資源,但不應有過於頻繁的寫操作,這會帶來很大的網路同步開銷。 5.3   堆外記憶體導致的記憶體溢位錯誤
       虛擬機器回收的記憶體包括堆記憶體和非堆記憶體,但是對於非堆記憶體,只能等到老年代滿了後Full GC,然後才會幫它清理掉廢棄的物件,否則,就會丟擲記憶體溢位異常。另外,若打開了-XX:+DisableExplicitGC,則虛擬機器不會對其進行回收。        從實踐經驗的角度出發,除了Java堆和永久代之外,我們還應關注以下區域也會佔用較多的記憶體,都受到作業系統的最大記憶體限制:
  • Direct Memory:可通過-XX:MaxDirectMemeorySize調整大小,記憶體不足時丟擲OutOfMemoryError或OutOfMemoryError:Direct buffer memory;
  • 執行緒堆疊:可通過-Xss調整大小,記憶體不足時丟擲StackOverFlowError或StackOverFlowError:unable to create new native thread;
  • Socket快取區:每個Socket連線都Recieve和Send兩個快取區,分別佔大約37KB和25KB,無法分配時丟擲IOException:Too many open files;
  • JNI程式碼:若程式碼中使用JNI呼叫本地庫,那本地庫使用的記憶體也不在堆中;
  • 虛擬機器和GC:虛擬機器和GC程式碼的執行也要耗費一定的記憶體。
5.4   外部命令導致系統緩慢        通常情況下,使用者應用的CPU佔用率應該佔主要地位,才能說明系統是正常工作的。在Java虛擬機器中,使用者編寫的Java程式碼最多隻有執行緒的概念,不應當有程序的產生。 5.5   伺服器JVM程序崩潰 5.6   實戰:Eclipse執行速度調優
  • 調優前的程式執行狀態:運用VisualVM及其擴充套件外掛VisualGC進行Eclipse執行狀態的採集;
  • 升級JDK的效能變化及相容問題:進行Exclipse調優時首先選擇升級虛擬機器的版本;
  • 編譯時間和類載入時間的變化:虛擬機器在進行類載入時會進行位元組碼驗證,可通過引數-Xverify:none方式禁止掉位元組碼的驗證過程以提高載入效能;對於編譯時間可通過引數-Xint禁止編譯器動作,這雖然提高了編譯效率,但是卻降低了執行效率;
  • 調整記憶體設定控制垃圾收集頻率:Eclipse啟動時Full GC大多數是由於老年代容量擴容而導致的,由永久代空間擴充套件而導致的也有一部分,為了避免因擴充套件帶來的效能浪費,可以把-Xms和-XX:PermSize的引數值分別設定為-Xmx和-XX:PermSizeMax引數值,強制虛擬機器在啟動時把老年代和永久代的容量固定下來,避免執行時自動擴充套件;
  • 選擇收集器降低延遲。
核心內容出處:《深入理解Java虛擬機器:JVM高階特性與最佳實踐》

相關推薦

JVM調案例分析實戰

                                      第五章   調優案例分析與實戰 5.1   高效能硬體上的程式部署策略       在高效能硬體部署程式,目前主要有兩種方式: 1) 通過64位JDK來使用大記憶體; 2) 使用若干個32位虛擬機器建立邏輯叢集來利用硬體資源。

筆記:深入理解JVM 第5章 調案例分析實戰

1、每天15萬 PV 的線上文件型別網站 環境:4 CPU,16GB 記憶體, 64位 CentOS 5.4 問題:網站失去響應 原先JVM配置:JDK1.5,  -Xmx12G  -Xms12G 解決過程:發現問題來自GC停頓(12G記憶體 的 Full GC 需要12秒

第五章 調案例分析實戰

5.1 案例分析 5.1.1 高效能硬體上的程式部署策略       一個15萬PV/天左右的線上文件型別網站最近更換了硬體系統,新的硬體為4個CPU、16GB實體記憶體,作業系統為64為CentOS5.4,Resin作為web伺服器。整個伺服器暫時沒有部署別的

調案例分析實戰

記憶體動態分配和垃圾收集技術 高效能硬體上的程式部署策略 問題:網站經常出現不定期長時間失去響應的情況 監控伺服器執行狀況後發現網站響應是有GC停頓導致的,虛擬機器執行在Server模式,預設使用吞吐量優先收集器,由於程式設計的問題,訪問文件要把文件從磁碟

JAVA虛擬機器(六)調案例分析實戰

一個線上文件網站採用了新的硬體,4個CPU,16GB實體記憶體。管理員為了儘量利用硬體資源選用了64位的JDK1.5,並且將堆的大小固定位12GB。但是網站不定期出現失去響應的情況。 監控伺服器發現是由於GC停頓導致的,回收12GB的堆,一次Full GC停頓高

《深入理解Java虛擬機器》第5章 調案例分析實戰

5.2.1高效能硬體上的程式部署策略 監控伺服器執行狀況發現網站沒有響應是由GC停頓導致的,虛擬機器執行在Server模式,預設使用吞吐量優先收集器,回收12GB的堆,一次Full GC的停頓時間高達14秒。訪問文件把其從磁碟提取到記憶體中,導致記憶體中出現很

JVM調及常見場景分析

## JVM調優 ![微信圖片_20201127154300](https://sheungxin.github.io/notpic/%E5%BE%AE%E4%BF%A1%E5%9B%BE%E7%89%87_20201127154300.jpg) **GC調優是最後要做的工作**,GC調優的目的可以總結為

HBase 核心元件協調及RegionServer JVM引數調-OLAP商業環境實戰

本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何商業交流,可隨時聯絡。 1 弱化的Master

JVM常用調案例

在本文中會介紹一些常用的JVM調優思路以及調優方法,這些方法是為了解決某個具體問題,提高某個區域性效能而特別設定的。 使用它們可能會對其他效能指標產生不良的影響,應該在實際應用中,根據具體情況進行折中和權衡。總結自《Java程式效能優化》 1.將新物件預留在新生代

ifeve.com 南方《JVM 效能調實戰:使用阿里開源工具 TProfiler 在海量業務程式碼中精確定位效能程式碼》

https://blog.csdn.net/defonds/article/details/52598018 多次拉取 JStack,發現很多執行緒處於這個狀態:    at jrockit/vm/Allocator.getNewTla(JJ)V(Native Method) 

JVM 效能調實戰 使用阿里開源工具 TProfiler 在海量業務程式碼中精確定位效能程式碼

                本文是《JVM 效能調優實戰之:一次系統性能瓶頸的尋找過程》 的後續篇,該篇介紹瞭如何使用 JDK 自身提供的工具進行 JVM 調優將 TPS 由 2.5 提升到 20 (提升了 7 倍),並準確定位系統瓶頸:我們應用裡靜態物件不是太多、有大量的業務執行緒在頻繁建立一些生命週期

JVM快速調手冊七:Java程式效能分析工具JavaVisualVM(Visual GC)

VisualVM 是一款免費的\集成了多個JDK 命令列工具的視覺化工具,它能為您提供強大的分析能力,對 Java 應用程式做效能分析和調優。這些功能包括生成和分析海量資料、跟蹤記憶體洩漏、監控垃圾回收器、執行記憶體和 CPU 分析,同時它還支援在 MBeans

JVM 效能調實戰:一次系統性能瓶頸的尋找過程

玩過效能優化的朋友都清楚,效能優化的關鍵並不在於怎麼進行優化,而在於怎麼找到當前系統的效能瓶頸。效能優化分為好幾個層次,比如系統層次、演算法層次、程式碼層次...JVM 的效能優化被認為是底層優化,門檻較高,精通這種技能的人比較少。筆者呆過幾家技術力量不算弱的公司,每個公司內

HBase LRUBlockCacheBucketCache二級快取機制原理剖析引數調-OLAP商業環境實戰

本套技術專欄是作者(秦凱新)平時工作的總結和昇華,通過從真實商業環境抽取案例進行總結和分享,並給出商業應用的調優建議和叢集環境容量規劃等內容,請持續關注本套部落格。版權宣告:禁止轉載,歡迎學習。QQ郵箱地址:[email protected],如有任何學術交流,可隨時聯絡。

JVM快速調手冊二: 常見的垃圾收集器

如果說收集演算法是記憶體回收的方法論,那麼垃圾收集器就是記憶體回收的具體實現。 Java虛擬機器規範中對垃圾收集器應該如何實現並沒有任何規定,因此不同的廠商、不同版本的虛擬機器所提供的垃圾收集器都可能會有很大差別,並且一般都會提供引數供使用者根據自己的應用特點和要求組合出各個年代所使用的

JVM快速調手冊二:常見的垃圾收集器

如果說收集演算法是記憶體回收的方法論,那麼垃圾收集器就是記憶體回收的具體實現。 Java虛擬機器規範中對垃圾收集器應該如何實現並沒有任何規定,因此不同的廠商、不同版本的虛擬機器所提供的垃圾收集器都可能會有很大差別,並且一般都會提供引數供使用者根據自己的應用特點和

JVM基礎系列教程|第五篇:Java服務GC引數調案例

推薦視訊連結 本文介紹了一次生產環境的JVM GC相關引數的調優過程,通過引數的調整避免了GC卡頓對JAVA服務成功率的影響。 這段時間在整理jvm系列的文章,無意中發現本文,作者思路清晰通過步步分析最終解決問題。我個人特別喜歡這種實戰類的內容,經原作者的授權

tomcatJVM效能調

tomcat的效能調優是實際生產中很重要的一部分,雖然我們平時在除錯時只要能跑起來就行,但是實際部署之後,當訪問的使用者量一增加,就涉及到tomcat的最大併發量等問題。那麼如何設定tomcat以及JVM,使我們的web應用的併發量增加呢? 一、tomcat記憶體

深入理解JVM——JVM效能調實戰

如何在高效能伺服器上進行JVM調優? 為了充分利用高效能伺服器的硬體資源,有兩種JVM調優方案,它們都有各自的優缺點,需要根據具體的情況進行選擇。   採用64位作業系統,併為JVM分配大記憶體 我們知道,如果JVM中堆記憶體太小,那麼就會頻繁地發生垃圾回收

JVM效能調生成堆的dump檔案

 最近因專案存在記憶體洩漏,故進行大規模的JVM效能調優 , 現把經驗做一記錄。 一、JVM記憶體模型及垃圾收集演算法  1.根據Java虛擬機器規範,JVM將記憶體劃分為: New(年輕代)Tenured(年老代)永久代(Perm)   其中New和Tenured屬