1. 程式人生 > >一次jVM效能調優記錄

一次jVM效能調優記錄

前言

填別人留下來的坑其實挺無奈的,會被搞的特別煩,特別是我這種要填三四個人留下來的坑的時候,滿滿的都是無奈。

幸好的是填坑也可以選擇一種更能提升自己的方式來填。

這次遇到的一個程式,是一個從kafka消費並且插入mysql的程式,該程式歷經三人之手,頻頻出問題,一直沒有被解決。傳到現在,症狀是這樣的:該程式跑個兩三天後會莫名其妙的停止消費,不再插入資料了,據說也不報錯,程序還在,反正就是不幹活了。

分析過程

等了一天半,這個程式不出意料的出問題了,狀況依然是停止消費,不再插入資料。我不太清楚之前的人是怎麼排查的,暫時按照我自己的方式來摸索。

首先看一下jvm記憶體的分佈情況,一下子就看到點子上了。old區和perm區基本上都滿了,然後可以觀察到每隔幾秒鐘就會進行一次full gc。這樣的話,整個程式不是一直都在full gc了,哪還有心情幹別的活?

抓緊時間看一下程式的報錯,非常明顯的OOM問題,不曉得之前的童鞋找到這沒。

按理說看到程式出錯了就該趕快補資料了,但是為了抓住錯誤的本質,我只能頂住一些壓力,緩半個小時再說,抓緊時間看一下各個指標。

首先是top一下看看cpu和記憶體,pid是25729那隻,貌似壓力很大的樣子。

然後是jmap看一下各個區的情況。仔細看一下就會發現,在Old Generation區已經佔用了2.6G的大小了,這個應該是十分不正常的。

這時候第一反應就是看一下垃圾回收用的什麼,嗯,ParallelGc,按說也沒啥問題啊,我可能也就是用這個了。

這時候無意間發現了jstat的一個引數gccause

,功能是檢視最近一次GC統計和原因。發現是Allocation Failure,和猜測的差不多。

然後我就想匯出堆疊的資訊,然後分析一下,但是太大了,有4G的大小,我的筆記本根本打不開。所以只能先用jcmd看一下,就發現了了一些比較好玩的東西。排在前面的這倆JDBC是啥麼個意思。

其實追到這裡基本已經可以定位到程式裡面的問題了,和關閉statment有關。

但是我們不能到此就結束,為了證明我是愛學習的,我用eclipse的的視覺化分析工具,打開了jmap匯出的檔案,具體怎麼匯出的可以參考這篇:http://zhaodedong.com/2015/09/01/jvm-tools/

有個工具就是方便很多,首先就可以定位到到底是哪裡佔用了這麼的記憶體。然後就追呀追,果真還是學到了點東西。

看下面這個圖,首先程式裡面是用的inset語句,但是會有很多的ResultSet物件,然後我就挨個進去看了ResultSet裡面有什麼東西,發現都是要插入的資料,我一直以為JDBC只有在獲取結果的時候才會用ResultSet,沒想到插入資料同樣用的這個。

總結

jdk的各種工具我一直都有筆記做過記錄,但是沒有做過比較多的分析,趁此機會就詳細的挨個用了一遍。

個人感覺,其實在分析問題的時候還是需要一定的敏感度的,光知道工具是沒有用的,必須還要有對問題的敏感度,能夠明白每個工具獲得的結果有什麼用,哪些結果資料是不正常的。這點其實十分重要,至少我在分析之初是很懵的,看著一堆資料完全不知道怎麼下手,後來看了不少的文章也問了一些同事之後才把這些搞明白。

補充

本著嘗試的原則,我也嘗試jvm引數調優實踐。發現還是有效果的,至少多堅持的更久的時間程式都沒有出問題。但是由於沒有抓住問題的核心錯誤,依舊不是解決問題的方法。

nohup java -classpath $CLASS_PATH com.***.Consumer -Xms1024M -Xmx6000M -XX:PermSize=128M -XX:MaxPermSize=256M -XX:+UseParallelGC XX:+UseParallelOldGC &

2016-09-22 00:14:00 rljp

轉載請註明: 轉載自趙德棟的 個人主頁 CSDN部落格

作者:趙德棟,作者介紹

相關推薦

jVM效能調記錄

前言 填別人留下來的坑其實挺無奈的,會被搞的特別煩,特別是我這種要填三四個人留下來的坑的時候,滿滿的都是無奈。 幸好的是填坑也可以選擇一種更能提升自己的方式來填。 這次遇到的一個程式,是一個從kafka消費並且插入mysql的程式,該程式歷經三人之手,頻頻

如何合理的規劃一jvm效能調

原文中的評論很有參考價值,轉發只是為了以後方便檢視 這是jvm優化系列第三篇: JVM效能調優涉及到方方面面的取捨,往往是牽一髮而動全身,需要全盤考慮各方面的影響。但也有一些基礎的理論和原則,理解這些理論並遵循這些原則會讓你的效能調優任務將會更加輕鬆。為了更好的理解本

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

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

JVM效能調():GC初級調

JAVA 調優有一部分工作就是減少GC對系統的影響,主要從以下幾個方面: FULL GC頻繁執行 FULL GC執行導致系統停頓 針對上面這兩個問題,從垃圾回收器選擇,垃圾回收引數調整兩方面進行JVM調優。本文只說明從JVM的引數方面的調優,程式碼的優化也減少上面的問題,

JVM效能調監控工具專題JVM自帶效能調工具

前提概要:  JDK本身提供了很多方便的JVM效能調優監控工具,除了整合式的VisualVM和jConsole外,還有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具,每一種工具都有其自身的特點,使用者可以根據你需要檢測的應用或者程式片段的狀況,適

線上gc調的過程

aspect hash 接下來 JD lac abs rac 數據庫 %x 近期公司運營同學經常表示線上我們一個後臺管理系統運行特別慢,而且經常出現504超時的情況。對於這種情況我們本能的認為可能是代碼有性能問題,可能有死循環或者是數據庫調用次數過多導致接口運

IDEA編譯器調

str out style its sun 復制算法 dsc this max 前言: 我們知道,IDEA是用Java寫的,那麽他肯定也存在虛擬機的調優的問題,那麽今天我們就對它進行開刀。 下面是默認參數 位置在:C:\Program Files\JetBrains\I

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

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

JVM效能調監控工具jps、jstack、jstat、jmap、jinfo使用

 現實企業級Java開發中,有時候我們會碰到下面這些問題: OutOfMemoryError,記憶體不足 記憶體洩露 執行緒死鎖 鎖爭用(Lock Contention) Java程序消耗CPU過高 ...... &n

JVM效能調監控工具jps、jstack、jmap、jhat、jstat、hprof詳解

來源:https://my.oschina.net/feichexia/blog/196575 現實企業級Java開發中,有時候我們會碰到下面這些問題: OutOfMemoryError,記憶體不足 記憶體洩露 執行緒死鎖 鎖爭用(Lock Contention)

JVM效能調監控工具jps、jstack、jmap、jhat、jstat、hprof使用詳解,以及例子

現實企業級Java開發中,有時候我們會碰到下面這些問題: OutOfMemoryError,記憶體不足 記憶體洩露 執行緒死鎖 鎖爭用(Lock Contention) Java程序消耗CPU過高 ......     這

深入理解Java虛擬機器(四)——JVM效能調監控工具

Jinfo 檢視正在執行的Java應用程式的擴充套件引數 檢視jvm的引數 檢視java系統引數 Jstat jstat命令可以檢視堆記憶體各部分的使用量,以及載入類的數量。命

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

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

JVM效能調

 一、JVM記憶體模型及垃圾收集演算法  1.根據Java虛擬機器規範,JVM將記憶體劃分為: New(年輕代)Tenured(年老代)永久代(Perm)  其中New和Tenured屬於堆記憶體,堆記憶體會從JVM啟動引數(-Xmx:3G)指定的記憶體中分配,Perm

tomcat與JVM效能調

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

1分鐘帶你入門JVM效能調

版本:JDK8 一、閱讀前熱身: 1、瞭解jvm啟動流程: 2、瞭解硬體、系統、程序三個層面的記憶體之間的概要記憶體分配,一張圖你就懂: 3、下面是需要背住的重點,敲黑板!!堆記憶體分配,想了解引數的可以到最下面看下備註和建議: 先來個日誌(看

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

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

視訊:深入理解Java虛擬機器(jvm效能調+記憶體模型+虛擬機器原理)共110集

龍果學院深入理解Java虛擬機器(Jvm效能調優+記憶體模型+虛擬機器原視訊 Java虛擬機器視訊教程一套不錯的視訊,課程一共有110課,課程目錄較多隻展示部分出來,喜歡的朋友下載看下 課程目錄(課程較多,只展示部分目錄) 課程大綱 第1節說在前面的話 [免費觀看]

遊戲伺服器JVM效能調

最近開始優化頁遊服務端的效能,一些心得總結一下。現在的伺服器硬體越來越好,幾十G記憶體,十幾個CPU。當硬體不是瓶頸的時候,如果讓程式發揮最大效用就成了我們需要考慮的問題。就遊戲伺服器來說,得滿足幾

JVM記憶體模型,以及JVM效能調

轉載批註:最近因與別人討論問題時,問到JVM記憶體模型,但是苦於只知道JVM的大概內容,不知道詳細,也罷,近期會逐漸有充足的自己的時間,好好整理學習學習。以下內容為轉載別人的資料,個人認為寫的很好,就全文拷貝了。 ===================華麗的分割線==