1. 程式人生 > >使用tomcat java程序佔用cpu偏高的原因

使用tomcat java程序佔用cpu偏高的原因

使用tomcat做為java容器,cpu佔用偏高的原因,目前公司伺服器上面跑的ubuntu環境nginx+tomcat+mysql執行一段時間之後java程序cpu偏高,會出現網站打不開的情況。所以進行了如下分析。

一,首先檢視tomcat日誌,如果有出現OOM錯誤(記憶體溢位)可以對應的加大jvm的記憶體大小。

1,修改tomcat目錄下bin目錄下的catalina.sh檔案,在

#JAVA_OPTS="$JAVA_OPTS -Dorg.apache.catalina.security.SecurityListener.UMASK=`umask`"

這行下面新增如下內容

JAVA_OPTS="-server -Xms2048m -Xmx2048m -Xmn512m -XX:PermSize=256M -XX:MaxPermSize=256m -Xss256k -XX:SurvivorRatio=4 -XX:MaxTenuringThreshold=20 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=73 -XX:+UseCMSCompactAtFullCollection -XX:+CMSParallelRemarkEnabled -XX:CMSFullGCsBeforeCompaction=2 -Djava.awt.headless=true"

上面的配置是基於4G記憶體設定的,具體修改看自己手上伺服器的配置。

引數的含義:

-server 告訴tomcat使用server模式 能獲得更大併發數和效能

-Xms2048m -Xmx2048m JVM記憶體的總數

-Xmn512m 年輕代記憶體大小

-XX:PermSize=256M -XX:MaxPermSize=256m 永久帶記憶體大小

Xss256k 執行緒大小

-XX:SurvivorRatio=4 設定年輕代中Eden區與Survivor區的大小比值。設定為4,則兩個Survivor區與一個Eden區的比值為2:4,一個Survivor區佔整個年輕代的1/6

-XX:MaxTenuringThreshold=20 設定垃圾最大年齡。如果設定為0的話,則年輕代物件不經過Survivor區,直接進入年老代。對於年老代比較多的應用,可以提高效率。如果將此值設定為一個較大值,則年輕代物件會在Survivor區進行多次複製,這樣可以增加物件再年輕代的存活時間,增加在年輕代即被回收的概率

-XX:+UseParNewGC 對年輕代採用多執行緒並行回收,這樣收得快

XX:+UseConcMarkSweepGC

CMS gc,這一特性只有jdk1.5即後續版本才具有的功能,它使用的是gc估算觸發和heap佔用觸發。

我們知道頻頻繁的GC會造面JVM的大起大落從而影響到系統的效率,因此使用了CMS GC後可以在GC次數增多的情況下,每次GC的響應時間卻很短,比如說使用了CMS GC後經過jprofiler的觀察,GC被觸發次數非常多,而每次GC耗時僅為幾毫秒

-XX:CMSInitiatingOccupancyFraction=73 說明年老代到73%滿的時候開始執行對年老代的併發垃圾回收(CMS)。

-XX:+UseCMSCompactAtFullCollection 開啟對年老代的壓縮。可能會影響效能,但是可以消除碎片

-XX:+CMSParallelRemarkEnabled 降低標記停頓

-XX:CMSFullGCsBeforeCompaction 由於併發收集器不對記憶體空間進行壓縮、整理,所以執行一段時間以後會產生“碎片”,使得執行效率降低。此值設定執行多少次GC以後對記憶體空間進行壓縮、整理。

參考網站:http://blog.csdn.net/lifetragedy/article/details/7708724

2,修改引數之後重啟tomcat,檢視引數是否生效

jmap -heap javaPID 檢視JVM記憶體分配情況

jstat -gcutil javaPID 1000 30 檢視JVM記憶體回收情況

經過上面的修改應該就可以完成對tomcat程序飆高的情況了。如果執行一段時間之後通過jstat檢視各個記憶體代的使用情況,發現老年代100% 一直在觸發FULL GC 那就是記憶體大小的原因了。有條件的可以新增記憶體,沒條件的可以設定 每天重啟一次tomcat或者一個星期重啟一次來釋放jvm記憶體。問題解決。

二,如果想檢視是否是程式碼層的原因,就需要另外的辦法

1,使用命令jstack命令檢視佔用CPU最高的執行緒。

PID=`ps aux | grep java | head -1 | awk '{print $2}'`

ps -mp $PID -o THREAD,tid,time | sort -k 2 -r | head -20

echo -n -e " shur ru:"

read f

if [ -z $f ]

then

echo "no"

else

jstack "$PID" | grep `printf "%x\n" $f` -A 30

fi

一個簡單的監控指令碼,檢視JAVA程序佔用CPU最高的執行緒在做什麼以此來分析是否是程式碼層的問題。

參考網站:http://blog.csdn.net/blade2001/article/details/9065985

相關推薦

使用tomcat java程序佔用cpu原因

使用tomcat做為java容器,cpu佔用偏高的原因,目前公司伺服器上面跑的ubuntu環境nginx+tomcat+mysql執行一段時間之後java程序cpu偏高,會出現網站打不開的情況。所以進行了如下分析。 一,首先檢視tomcat日誌,如果有出現OOM錯誤(

linux排查java程序佔用CPU原因方法

前言 在運維tomcat伺服器時,我們通常會發現cpu的負載過高,大多數原因是由於java程式碼的bug引起的。可能你的java程式碼有很多,檔案也有很多,一行一行的排查是很費時間的。這時我們就可以使用jstack、top等工具對引起問題的程式碼進行定位,

linux下查詢java程序佔用CPU原因

1. 查詢程序 top檢視程序佔用資源情況 明顯看出java的兩個程序22714,12406佔用過高cpu. 2.查詢執行緒 使用top -H -p <pid>檢視執行緒佔用情況

java應用佔用cpu原因分析

線上伺服器cpu佔用過高問題排查 1、定位最耗cpu的程序 命令:top 2、定位最耗cpu的執行緒 命令:Top –Hp PID 例如:Top –Hp 12086 3、列印執行緒堆疊資訊 命令:Printf ‘%x\n’ PID 例如:printf

IAStorDataMgrSvc.exe程序佔用cpu解決方法

dell電腦無任何讀寫操作,但IAStorDataMgrSvc.exe程序始終佔用40%~50% 的cpu,高cpu佔用,電腦操作不順暢。 這個程序一般都是驅動程式版本有問題!別以為電腦都已經是裝的最新版本的驅動了就覺得不會是這個問題,本人就是安裝官方推薦的

Linux伺服器java程序佔用系統記憶體

使用top命令檢視系統資源的使用情況,命令:top 如圖可以看到java的程序記憶體使用率較高,java程序的記憶體使用率達到了70%+ 2.定位執行緒問題(通過命令檢視9718程序的執行緒情況),命令:ps p 9718 -L -o pcpu,pmem,pid,tid,time

【Windows筆記】-----工作管理員發現 NT Kernel & System 程序佔用CPU

兩個月前win10更新之後就發現系統用起來沒以前流暢了,後來也沒怎麼去優化。 電腦也沒裝遊戲之類的軟體件,但這兩天突然發現電腦管家老顯示CPU佔用95%以上,記憶體佔用86%以上(總記憶體12G),情況不對呀。 問題所在: 系統更新後會出現一些軟體執行出現問

線上Java程式佔用 CPU,請說一下排查方法?

> 我是風箏,公眾號「古時的風箏」,一個兼具深度與廣度的程式設計師鼓勵師,一個本打算寫詩卻寫起了程式碼的田園碼農! 文章會收錄在 [JavaNewBee](https://github.com/huzhicheng/JavaNewBee) 中,更有 Java 後端知識圖譜,從小白到大牛要走的路都在裡面。 這

window 查詢 java 程序佔用cpu比較的執行緒

概述 公司內部的一個產品 (java 開發的) 執行在 window 虛擬機器上,執行一段時間後CPU飆升,然後想檢視是哪個執行緒佔用。 折騰了一下午,終於定位到該執行緒。 下面我們通過兩種方式定位到佔用cpu比較高的執行緒。 * 1. 使用Proces

JAVA程序佔用記憶體原因分析與優化方法

首先看一下一個java程序的jmap輸出: 程式碼如下: [[email protected] ~]$ jmap -heap 837 Attaching to process ID 837, please wait... Debugger attached suc

linux下查找java進程占用CPU原因

jmeter 性能測試 linux下查找java進程占用CPU過高原因1. 查找進程top查看進程占用資源情況明顯看出java的兩個進程22714,12406占用過高cpu. 2.查找線程使用top -H -p <pid>查看線程占用情況 3.查找java的堆棧信息將線程id轉換成十六進制

伺服器被挖礦入侵,程序 command為ld-linux-x86-64佔用cpu

測試伺服器看到 ld-linux-x86-64的程序佔用cpu極高,user 是 mysql 的。 測試環境不會有這麼高的mysql負載,並且記憶體佔用基本為0。區塊鏈技術盛行,讓人不得不懷疑被抓去做礦機了。 初步排查 [[email protected]

linux查詢cpu原因--java

1. 查詢java pid  top -c 2. 查詢java程序下,執行緒情況  top -Hp pid(threadIdList) 3. 將10進位制執行緒id轉為16進位制  printf "%x \n" threadId(tid) 4. 查詢執行緒情況  jstack pid|grep '0xt

postgresql某程序佔用cpu資源過,降不下來

由於是開發階段,所以並沒有配置postgres的引數,都是使用安裝時的預設配置,以前執行也不見得有什麼不正常,可是前幾天我的cpu資源佔用突然升高.檢視程序,發現有一個postgres的程序佔用CPU都是80%以上,而且居高不下;剛開始以為是配置上需要修改,但事實上,預設配置基本上是很優化的,而且是開發階段,

Java如何定位佔用CPU比較的問題

編寫Java專案時,經常會遇到兩種問題。 第一種:Java程序佔用CPU比較高 第二種:Java程序堆記憶體溢位 今天主要跟大家聊聊第一種問題如何排查。 一、確定消耗CPU的Java程序 從上圖可以看到Java程序 27459 消耗的CPU比較高。

Java記憶體溢位的原因有哪些?Java程序佔用記憶體構成有哪些?

JVM記憶體佔用=作業系統自身耗記憶體 + 堆 + Java永久代/元資料區/方法區/常量池/程式碼快取 + 程式計數器(可忽略不計)*執行緒數 + 虛擬機器程序本身 + 虛擬機器棧(執行緒棧)*執行緒數 + 本地方法棧(JNI呼叫)*執行緒數 + 直接記憶體(Java NIO) metaspace的組成 K

解決windows7 下svchost程序佔用cpu問題

安裝windows7之後,有時候會出現svchost程序佔用cpu和記憶體很高的問題。一般是在啟動其他程序之後,svchost也會跟著佔用很資源,導致其他程序卡住。最直接的解決方法是在工作管理員中,右鍵svchost程

如何排查java應用中CPU使用率或記憶體佔用的問題

如何排查java應用中CPU使用率高或記憶體佔用高的問題?這類問題的排查步驟基本通用的。現在通過一個具體的例子來說明。 問題描

java線程數過原因分析

分享 有一個 其中 res set ava jhat 前臺 沒有 作者:鹿丸不會多項式 出處:http://www.cnblogs.com/hechao123 轉載請先與我聯系。 一、問題描述 前陣子我們因為B機房故障,將所有的流量切到了A機房,在經歷了推送+自然高峰

Java進程CPU使用率排查

java進程cpu使用率高排查生產java應用,CPU使用率一直很高,經常達到100%,通過以下步驟完美解決,分享一下。1.jps 獲取Java進程的PID。2.jstack pid >> java.txt 導出CPU占用高進程的線程棧。3.top -H -p PID 查看對應進程的哪個線程占用C