摘要:垃圾回收垃圾檢測引用計數(shù)法和可達性分析算法。引用計數(shù)法給一個對象添加引用計數(shù)器,每當有個地方引用它,計數(shù)器就加,引用失效就減。通常會在老年代內存被占滿時將會觸發(fā),回收整個堆內存。
基礎知識
JVM - HotSpot內存布局(1.8之前版本)
1.8版本開始,持久區(qū)沒有了,替代它的是metaspace。對于32位JVM,我通常不建議Java堆大小超過2Gb(-Xms2048m, -Xmx2048m),對于64位而言,我通常建議在每個JVM進程中Java堆大小的起始值設置在3GB或者4GB。典型的年輕代和老年代的比例是1:3或者33%。
垃圾回收垃圾檢測:引用計數(shù)法和可達性分析算法。
引用計數(shù)法:給一個對象添加引用計數(shù)器,每當有個地方引用它,計數(shù)器就加1,引用失效就減1。如果對象互相引用,那么就導致內存泄漏,所以這個方法已經(jīng)被廢棄。
可達性分析算法:以根集對象為起始點進行搜索,如果有對象不可達的話,即是垃圾對象。這里的根集一般包括java棧中引用的對象、方法區(qū)常量池中引用的對象和本地方法中引用的對象等。JVM在做垃圾回收的時候,會檢查堆中的所有對象是否會被這些根集對象引用,不能夠被引用的對象就會被垃圾收集器回收。
年輕代被分為3個部分,Enden區(qū)和兩個Survivor區(qū)。當Eden區(qū)被對象填滿時,就會執(zhí)行Minor GC,并把所有存活下來的對象轉移到其中一個survivor區(qū)。Minor GC同樣會檢查先前存活下來的對象,也把它們轉移到這個survivor區(qū)。這樣在一段時間內,總會有一個空的survivor區(qū)。經(jīng)過多次GC周期后,仍然存活下來的對象會被轉移到年老代內存空間。
年老代存放的都是生命周期較長的對象。通常會在老年代內存被占滿時將會觸發(fā)Full GC,回收整個堆內存。
jstack:查看每個線程的當前狀態(tài)、調用棧、鎖住或等待去鎖定的資源,直接報告是否有線程死鎖。
/root/jdk1.8.0_101/bin/jstack -l 6126
jmap:打印出java進程(使用pid)內存內的,所有‘對象’的情況(如:產生那些對象,及其數(shù)量)。
jmap -dump:format=b,file=test.bin 6126
工具詳細列表:http://blog.csdn.net/fenglibi...
JVM參數(shù)詳解:http://0opslab.com/2016/01/16...
常見場景:CPU狂飆,通過ps -o pcpu,pid,tid找出是哪些線程在高頻率的使用CPU,然后使用jstack命令找出這些線程,如果是普通線程,它的call stack直接反映出問題所在。如果是GC線程,通過gc日志可以看出GC線程在拼命GC,但是GC前后效果不明顯,已用堆內存始終降不下來,其它線程會表現(xiàn)為alloc_enqueue_allocation_and_wait_for_gc的native_blocked阻塞狀態(tài),此時用jmap命令dump堆內存情況,使用eclipse MAT工具找出問題所在。
很多時候性能異常表現(xiàn)為偶然性,就是在不定的時間出現(xiàn)問題,此時通過給jvm加啟動參數(shù)來生成轉儲文件,然后事后分析。-verbose:gc -Xloggc:xxx.txt生成gc日志,-XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=yyy.txt在OOM出現(xiàn)后自動生成了堆轉儲文件,據(jù)此可分析堆和線程的情況。
內存溢出out of memory,是指程序在申請內存時,沒有足夠的內存空間供其使用,出現(xiàn)out of memory;比如申請了一個integer,但給它存了long才能存下的數(shù),那就是內存溢出。
內存泄露memory leak,是指程序在申請內存后,無法釋放已申請的內存空間,一次內存泄露危害可以忽略,但內存泄露堆積后果很嚴重,無論多少內存,遲早會被占光。memory leak會最終會導致out of memory!
以下為常見的內存錯誤:
java.lang.OutOfMemoryError: Java heap space 堆空間被占滿
java.lang.OutOfMemoryError: PermGen space 持久代被占滿(1.8之前版本)
java.lang.StackOverflowError 線程棧溢出
Fatal: Stack size too small 線程local area滿
java.lang.OutOfMemoryError: unable to create new native thread 系統(tǒng)內存被占滿
文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/66996.html
面試官:今天要不來聊聊JVM調優(yōu)相關的吧?面試官:你曾經(jīng)在生產環(huán)境下有過調優(yōu)JVM的經(jīng)歷嗎?候選者:沒有面試官:...候選者:嗯...是這樣的,我們一般優(yōu)化系統(tǒng)的思路是這樣的候選者:1. 一般來說關系型數(shù)據(jù)庫是先到瓶頸,首先排查是否為數(shù)據(jù)庫的問題候選者:(這個過程中就需要評估自己建的索引是否合理、是否需要引入分布式緩存、是否需要分庫分表等等)候選者:2. 然后,我們會考慮是否需要擴容(橫向和縱向都...
摘要:在設計堆的大小時。設計為比更大的數(shù)前提是內存允許。這樣既可以降低堆調整的頻率,還可以提高系統(tǒng)的負載能力新生代調優(yōu)大小增大區(qū)。因為時間跟存活對象成正比新生代調優(yōu)晉升盡可能讓對象停留在中。 jvm支持的垃圾收集器組合 showImg(https://segmentfault.com/img/bVbbcTv?w=1101&h=351); 組合選擇的標準 吞吐量=應用運行時間/總時間 關...
摘要:一內存調優(yōu)主要的目的是減小的頻率和的次數(shù)。調優(yōu)工具之主要用來輸出中運行的進程狀態(tài)信息。調優(yōu)工具之和用來查看堆內存使用狀況,一般結合使用。 一、jvm內存調優(yōu) 主要的...
摘要:內存設置現(xiàn)在線上業(yè)務系統(tǒng)基本物理內存都是夠用的,不過物盡其用,我們調優(yōu)就是爭取讓每空間都發(fā)揮出最大的作用。區(qū)總內存減去一個區(qū)的大小不宜過大,否則可能把物理內存耗光。 在生產系統(tǒng)中,高吞吐和低延遲一直都是JVM調優(yōu)的最終目標,但這兩者恰恰又是相悖的,魚和熊掌不可兼得,所以在調優(yōu)之前要清楚舍誰而取誰。一般計算任務和組件服務會偏向高吞吐,而web展示則偏向低延遲才會帶來更好的用戶體驗。 本文...
摘要:現(xiàn)象登入生產環(huán)境,使用命令因為這時候并沒有打的,所以只能觀察現(xiàn)象。其他的可以根據(jù)這個類推,是內純的占用量。 前言 我們的游戲上線之初,經(jīng)常有玩家反饋卡,或者有網(wǎng)絡延遲等現(xiàn)象,造成用戶流失等現(xiàn)象,這時候我就想到是不是可能是之前的jvm配置有問題,或者存在內存泄露等問題。 現(xiàn)象 登入生產環(huán)境,使用命令,因為這時候并沒有打gc的log,所以只能觀察現(xiàn)象。 jstat -gcutil 270...
摘要:性能調優(yōu)概述性能優(yōu)化有風險和弊端,性能調優(yōu)必須有明確的目標,不要為了調優(yōu)而調優(yōu)盲目調優(yōu),風險遠大于收益程序性能的主要表現(xiàn)點執(zhí)行速度程序的反映是否迅速,響應時間是否足夠短內存分配內存分配是否合理,是否過多地消耗內存或者存在內存泄漏啟動時間程序 [TOC] Java性能調優(yōu)概述 性能優(yōu)化有風險和弊端,性能調優(yōu)必須有明確的目標,不要為了調優(yōu)而調優(yōu)!!!盲目調優(yōu),風險遠大于收益!!! 程序性...
閱讀 1179·2023-04-26 02:38
閱讀 1473·2021-11-22 09:34
閱讀 1180·2021-09-26 10:19
閱讀 3159·2019-08-29 17:15
閱讀 3515·2019-08-29 12:27
閱讀 1715·2019-08-26 13:51
閱讀 1858·2019-08-26 13:47
閱讀 1010·2019-08-26 12:20