筆記:深入理解JVM 第5章 調優案例分析與實戰
1、每天15萬 PV 的線上文件型別網站
環境:4 CPU,16GB 記憶體, 64位 CentOS 5.4
問題:網站失去響應
原先JVM配置:JDK1.5, -Xmx12G -Xms12G
解決過程:發現問題來自GC停頓(12G記憶體 的 Full GC 需要12秒),記憶體中暫存檔案導致“朝生夕滅”大量大物件,採用預設吞吐量優先收集器。
最終JVM配置:使用5個32位JDK作為邏輯叢集,每個程序2GB記憶體,Apache服務作為前端負載均衡,垃圾回收改為CMS回收。
2、叢集間同步導致的記憶體溢位
環境:兩臺伺服器,每臺2個CPU、8GB記憶體、啟動3個WebLogic,構成6個節點的親和式叢集,JBossCache作為全域性快取
問題:記憶體溢位。
解決過程:配置-XX:+HeapDumpOnOutOfMemoryError ,檢查heap檔案,發現是JBossCache問題,快取多次被寫,。
最後結論:快取可以頻繁讀,但是不能頻繁寫。
3、堆外記憶體導致的溢位
環境:1CPU,4GB記憶體,32位Window系統,小型B/S的電子考試系統,使用了CometD技術
問題:不定時丟擲記憶體溢位異常
原先配置:
解決過程:加入-XX:HeapDumpOnOutOfMemoryError 無果,使用jstat 無果,查日誌發現是Direct Memory 溢位:OutOfMemory:null, at sun.misc.Unsafe.allocateMemory (Native Method)。
CometD技術 用到了NIO 技術。Direct Memory 不能像老生代、新生代那樣,發現空間不足了就通知收集器進行垃圾回收,他只能等待老生代Full GC的時候,順便幫他清理記憶體的廢棄物件,否則只能等待丟擲異常。
最後結論:除了Heap 和 Perm ,這些區域也會佔用記憶體: Direct Memory(-MaxDirectMemorySize)、執行緒棧 (-Xss)、Socket 快取、JNI程式碼、虛擬機器本身和GC
4、外部命令導致系統緩慢
環境:4CPU,Solaris,Glassfish
問題:請求響應慢,CPU使用率高
解決過程:通過Rumtime.getRuntime().exec() 執行外部shell指令碼, 啟動大量新程序,消耗大量時間。JVM執行Rumtime.getRuntime().exec() 流程:先複製一個與當前JVM擁有一樣環境變數的程序,再使用這個新的程序去執行外部命令,最後退出,這種呼叫方式即使命令很快能執行完成,頻繁建立程序的開銷也非常可觀。
解決方法:不使用shell 指令碼,使用Java API。
5、伺服器JVM程序崩潰
環境:2臺伺服器,2個CPU,8GB記憶體,WebLogic
問題:JVM自動關閉
解決過程:看日誌,"Java.net.SocketException:Connection reset" 。因為遠端連線到另外一個系統,呼叫另一個系統 完成Task,另一個系統處理速度非常慢,於是本系統積累了越來越多的等待執行緒和Socket連線。
解決方法:將呼叫另外一個系統的方式改成生產者-消費者模式的訊息佇列。
6、不恰當資料結構導致記憶體佔用過大
環境:後臺RPC伺服器,64位虛擬機器
原先JVM配置:-Xms4g -Xmx8g -Xmn1g -XX:+UseParNewGC -XX:+UseConcMarkSweepGC
問題:載入80M的資料檔案時候,每次Minor GC 造成停頓500 毫秒。
解決過程:看日誌,新生代有多次Minor GC還存在的大物件
解決方法:去掉Survivor,-XX:+SurviorRatio=65536 ; 加入引數 -XX: MaxTenuringThreshold=0 -XX:+AlwaysTenure,將Minor GC後的物件立即進入老生代。修改程式。
7、Windows 虛擬記憶體導致長時間停頓
環境:帶心跳檢查的GUI桌面程式,每15秒一次心跳
問題:心跳檢測有誤,偶爾1分鐘停頓
原先配置: -Xmx256M
解決過程:加入 -XX:PrintGCApplicaitonStoppedTime -XX:+PrintGCDateStamps -Xlooger:gclogs. 看日誌 .程式在最小化時候,其工作記憶體被自動交換到磁碟的頁面檔案中
加入:-Dsun.awt.keepWorkingSetOnMinimize=true
相關推薦
筆記:深入理解JVM 第5章 調優案例分析與實戰
1、每天15萬 PV 的線上文件型別網站 環境:4 CPU,16GB 記憶體, 64位 CentOS 5.4 問題:網站失去響應 原先JVM配置:JDK1.5, -Xmx12G -Xms12G 解決過程:發現問題來自GC停頓(12G記憶體 的 Full GC 需要12秒
《深入理解Java虛擬機器》第5章 調優案例分析與實戰
5.2.1高效能硬體上的程式部署策略 監控伺服器執行狀況發現網站沒有響應是由GC停頓導致的,虛擬機器執行在Server模式,預設使用吞吐量優先收集器,回收12GB的堆,一次Full GC的停頓時間高達14秒。訪問文件把其從磁碟提取到記憶體中,導致記憶體中出現很
第五章 調優案例分析與實戰
5.1 案例分析 5.1.1 高效能硬體上的程式部署策略 一個15萬PV/天左右的線上文件型別網站最近更換了硬體系統,新的硬體為4個CPU、16GB實體記憶體,作業系統為64為CentOS5.4,Resin作為web伺服器。整個伺服器暫時沒有部署別的
筆記:深入理解JVM 第2章 Java記憶體區域與記憶體溢位
1、JVM 執行時資料區 所有執行緒共享的資料區:方法區(持久代)、堆區 執行緒隔離的資料區:程式計數器、Java虛擬機器棧區 堆區構成:新生代 ( 由Eden, From Survivor, To Survivor 構成)、老生代 執行時常量池:方法區一部分,用於存放編
JVM之調優案例分析與實戰
第五章 調優案例分析與實戰 5.1 高效能硬體上的程式部署策略 在高效能硬體部署程式,目前主要有兩種方式: 1) 通過64位JDK來使用大記憶體; 2) 使用若干個32位虛擬機器建立邏輯叢集來利用硬體資源。
深入理解JVM—第三章:垃圾收集器與記憶體分配策略
概述 對於Java記憶體執行時區域的各位部分,其中程式計數器、虛擬機器棧、本地方法棧這三個區域都是隨執行緒而生,隨執行緒而滅。並且棧幀中分配的記憶體也是在編譯後就已知的。因此這幾個區域的記憶體分配和回收都具備確定性,所以我們在這幾個區域就不必過多地考慮
讀書筆記:深入理解計算機系統 第七章
int printf(const char * format,...); int global_init_var = 84; int global_uninit_var; void fun1(int i) { printf("%d\n",i); } int main
深入理解Nginx第八章:nginx基礎架構
Nginx效能指標 吞吐量(頻寬指的是單個連線的吞吐量) 單次請求的延遲性 網路效率:長連線減少建立、關閉連線的成本,壓縮演算法增加資訊攜帶量 Nginx 模組設計 NGX_CONF_MODULE:唯一隻有一個模組(ngx_conf_modul
學習筆記:深入理解Java虛擬機 第二章:Java內存區域與內存溢出異常(1)
block 物理 裝載 成熟 memory from ram 權力 一個 學習筆記:深入理解Java虛擬機 第二章:Java內存區域與內存溢出異常(1) Java與C++之間有一堵由內存動態分配和垃圾收集技術所圍成的"高墻",墻外面的人想進去,墻裏面的
學習筆記:深入理解Java虛擬機 第二章:Java內存區域與內存溢出異常(2)
保留 頻繁 深入 一是 init方法 對象的引用 整理 緩沖 出現 學習筆記:深入理解Java虛擬機 第二章:Java內存區域與內存溢出異常(2) 三、HotSpot虛擬機對象探秘 1.對象的創建 ? 在Java程序運行過程中時刻都有對象被創建。在語言層面上,創建對象(例如
讀書筆記:CLR var C# 第12章
clr data ase com esp ring 不能 program lcs 1 using System; 2 using System.Collections.Generic; 3 using System.IO; 4 using System.L
讀書筆記:CLR var C# 第13章
iconv gui 兩個 命名 ace class where 不同 window 1 using System; 2 using System.Collections.Generic; 3 using System.Linq; 4 using Syste
【vue大師晉級之路第一集:Vue基礎】第5章——Class 與 Style 繫結
Class 與 Style 繫結 操作元素的 class 列表和內聯樣式是資料繫結的一個常見需求。因為它們都是屬性,所以我們可以用 v-bind 處理它們:只需要通過表示式計算出字串結果即可。不過,字串拼接麻煩且易錯。因此,在將 v-bind 用於 class 和 style 時,Vue
Python機器學習筆記:深入理解Keras中序貫模型和函式模型
先從sklearn說起吧,如果學習了sklearn的話,那麼學習Keras相對來說比較容易。為什麼這樣說呢? 我們首先比較一下sklearn的機器學習大致使用流程和Keras的大致使用流程: sklearn的機器學習使用流程: 1 2 3 4
Laravel 學習筆記:深入理解控制反轉(IoC)和依賴注入(DI)
目的:解耦和減少依賴關係; 控制反轉(IoC):由外部負責其依賴行為; 例如“超人”類不需要在其內部固化它的“超能力”,而是由外部來產生、組裝“超能力”,再通過“超人”的某個介面中植入; 只要“超能力”滿足某個介面,就能被超人所使用; 依賴注入(DI
深入理解Magento – 第七章 – 自定義Magento系統配置
Magento的資源配置系統允許你直接拷貝安裝指令碼和升級指令碼到伺服器上,Magento會根據當前模組的版本自動執行相應的指令碼。這樣你就只需 要維護一份資料庫遷移指令碼。我們先來看看“core_resource”資料表 mysql> select code,version from core_re
深入理解 c# 第三章 證明不同的封閉類具有不同的靜態欄位
class StaticFieldPerClosedType { class TypeWithField<T> { public static string field;
深入理解 c# 第十章 使用Where方法的Lambda表示式去尋找奇數
class RangeFiltering { static void Main() { var collection = Enumerable.Range(0, 10)
深入剖析Kubernetes學習筆記:深入理解獎項(08)
fix ble 允許 容器 hello 工作目錄 rwx user open 一、Python 應用案例環境 [root@k8s-node1 Flask]# pwd /opt/Dockerfile/Flask [root@k8s-node1 Flask]# ll tota
深入理解jvm(四、虛擬機器效能監控與故障處理工具)
一、命令列工具 1.1 jps:虛擬機器程序狀況工具 1.2 jstat:虛擬機器統計資訊監視工具 假設每250ms查詢一次程序2764垃圾收集狀況,一共查詢20次。 jstat -gc 2764 250 20 例: S0:倖存