JVM內(nèi)存參數(shù)配置詳解
首先我們知道:JVM發(fā)生內(nèi)存錯誤的類型
1、堆內(nèi)存泄漏:OutOfMemory:Java heap space
此種內(nèi)存泄漏,增加內(nèi)存,只能暫時解決問題,并不能根治問題。必須要優(yōu)化代碼,一定是代碼的問題:排查堆中的大量對象,就會發(fā)現(xiàn),這些對象都被引用,對象不能及時被回收,導(dǎo)致超出了堆的設(shè)定最大內(nèi)存。
2、老年代內(nèi)存泄漏:OutOfMemoryError:PermGen space
類名、訪問修飾符、字段描述、方法描述等,所占空間大于永久代最大值,就會出現(xiàn),一般都是初始化內(nèi)存的時候,空間太小,解決辦法是擴大空間
3、棧內(nèi)存泄漏:StackOverflowError
代碼執(zhí)行時,代碼進棧,此刻如果棧的內(nèi)存不足以容納要進棧的代碼的大小空間,那么久會報該錯誤??梢酝ㄟ^設(shè)置棧的空間大小。一般通過:-Xss設(shè)置線程的大小來解決。比如:-Xss256m
下面進入如何檢測jvm內(nèi)存情況的實際操作:
1、監(jiān)控JVM的GC情況:
jstat -gcutil pid 2000 20 (只需要看O,如果達到100%,并且長期處于100%,則代表老年代內(nèi)存不足)
pid:服務(wù)進程的pid,可通過:ps -ef | grep java 來查看java的服務(wù)進程pid
2000:每隔多少秒進行監(jiān)控一次。這里是2秒
20: 總共獲取20次

E:eden區(qū)
O:老年代
P:永久代
YGC:新生代的GC次數(shù)
YGCT:當(dāng)前統(tǒng)計的YGC一共花費的時間(毫秒)
FGC:fullGC老年代的GC次數(shù)
FGCT:當(dāng)前統(tǒng)計的FGC一共花費的時間(毫秒)
GCT:YGC+FGC
2、查看jvm配置信息
jmap -head pid //可以看到j(luò)ava進程的堆的配置信息,各區(qū)的空間大小和配置信息
?
3、查看jvm中類和對象的占用情況
jmap -histo 5279 | head -20 //查看jvm中各個類的實例數(shù)、占用內(nèi)存數(shù)量以及類的全名
?
4、上面使我們的基本命令使用,那么我們怎么預(yù)測或者說內(nèi)存泄漏會有什么征兆?
1、tps出現(xiàn)大幅波動,并慢慢降低,甚至降為0,響應(yīng)時間隨之波動,慢慢升高
2、通過jstat命令看到,Jvm中Old區(qū)不斷增加,F(xiàn)ullGC非常頻繁,對應(yīng)的FullGC消耗的時間也不斷增加
3、通過jconsole/jvisualvm可以看到,堆內(nèi)存曲線不斷上升,接近上限時,變成一條直線
4、日志報錯java.lang.OutOfMemoryError: Java heap space
5、內(nèi)存泄露怎么定位?
(1、確定征兆: 現(xiàn)象方面,Java進程拋出OOM異常,分析屬于那種異常,是正常的內(nèi)存資源耗盡還是內(nèi)存泄漏。
(2、監(jiān)控jvm的GC情況: jstat -gcutil pid 1000 100 (只需要看O,如果達到100%,并且長期處于100%,則代表老年代內(nèi)存不足) 如果有大量的FGC就要查詢是否有內(nèi)存泄漏的問題了
(3、通過jmap命令:jmap -histo pid | head -20,查看當(dāng)前堆內(nèi)存中實例數(shù)和占用內(nèi)存最多的前20個對象
(4、通過jvisualvm分析定位:進行遠程堆dump,然后把dump文件下載下來,用jvisualvm打開進行分析,可以看到更直觀的jvm中對象的信息
6、下面是進行最后的JVM參數(shù)調(diào)優(yōu):
vm常用參數(shù)
---------------------------------------
堆內(nèi)存 = 年輕代+老年代
年輕代 = Eden+Survivor
Survivor = From Space+To Space
---------------------------------------
年輕代 = Eden+From Space+To Space
堆內(nèi)存=Eden+From Space+To Space+老年代
====================================
-Xms2048m:初始堆大小,建議<物理內(nèi)存的1/4,默認值為物理內(nèi)存的1/64
-Xmx2048m:最大堆大小,建議與-Xms保持一致,默認值為物理內(nèi)存的1/4
-Xmn512m:新生代大小,建議不超過堆內(nèi)存的1/2-Xss256k,線程堆棧大小,建議256k
-XX:PermSize=256m:永久代初始值,默認值為物理內(nèi)存的1/64
-XX:MaxPermSize=256m:永久代最大值,默認值為物理內(nèi)存的1/4
-XX:SurvivorRatio=8:年輕帶中Eden區(qū)和Survivor區(qū)的比例,默認為8:1,即Eden(8),F(xiàn)romSpace(1),ToSpace(1)
-XX:MaxTenuringThreshold=15:晉升到老年代的對象年齡,每個對象堅持過一次MinorGC后對象年齡+1,默認值是15,年齡超過15進入到老年代,該參數(shù)在串行GC時有效-
XX:PretenureSizeThreshold=3145728:單位字節(jié),只對Serial和ParNew兩款收集器有效,新生代采用Parallel Scavenge GC時無效,大于這個值的對象直接在老年代進行分配
7、參數(shù)設(shè)置在哪里?
一般來說,一個服務(wù)器可能有多個java服務(wù)進行,對吧?是很多服務(wù)器都會有這種情況,那么問題來了,那我要是統(tǒng)一在jvm配置文件修改jvm參數(shù),那么豈不是所有服務(wù)都是這個參數(shù)?所以有沒有其他辦法?
有?。。?!那就是在java進程啟動命令設(shè)置。
nohup java ${JAVA_OPT} -jar xxx.jar 2>&1&JAVA_OPT的參數(shù):里面參數(shù)自行看要設(shè)置什么,以及具體的參數(shù)值
JAVA_OPT="-server -Xms256m -Xmx256m -Xmn512m -XX:MetaspaceSize=64m -XX:MaxMatespaceSize=256m"
到此這篇關(guān)于JVM內(nèi)存參數(shù)配置詳解的文章就介紹到這了,更多相關(guān)JVM內(nèi)存參數(shù)配置內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot如何通過不同的策略動態(tài)調(diào)用不同的實現(xiàn)類
這篇文章主要介紹了springboot如何通過不同的策略動態(tài)調(diào)用不同的實現(xiàn)類,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-02-02
java:程序包org.springframework.boot不存在的完美解決方法
最近項目中運行的時候提示了"java: 程序包org.springframework.boot不存在",下面這篇文章主要給大家介紹了關(guān)于java:程序包org.springframework.boot不存在的完美解決方法,需要的朋友可以參考下2023-05-05
Java使用elasticsearch基礎(chǔ)API使用案例講解
這篇文章主要介紹了Java使用elasticsearch基礎(chǔ)API使用案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細內(nèi)容,需要的朋友可以參考下2021-08-08
SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng)
WebSocket是一種在單個TCP連接上進行全雙工通信的協(xié)議。這是一種比較官方的說法,簡單點來說就是,在一次TCP連接中,通信的雙方可以相互通信。這篇文章主要介紹了SpringBoot+WebSocket搭建簡單的多人聊天系統(tǒng),需要的朋友可以參考下2019-10-10
Java編程通過匹配合并數(shù)據(jù)實例解析(數(shù)據(jù)預(yù)處理)
這篇文章主要介紹了Java編程通過匹配合并數(shù)據(jù)實例解析(數(shù)據(jù)預(yù)處理),分享了相關(guān)代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下2018-01-01
java并發(fā)編程JUC CountDownLatch線程同步
這篇文章主要介紹CountDownLatch是什么、CountDownLatch 如何工作、CountDownLatch 的代碼例子來展開對java并發(fā)編程JUC CountDownLatch線程同步,需要的朋友可以參考下面文章內(nèi)容2021-09-09

