Java成神之路(一)-- JVM基礎

JVM.PNG

JVM內(nèi)存模型###

描述主內(nèi)存和工作內(nèi)存之間的通信規(guī)則,避免數(shù)據(jù)不一致威鹿。所有線程共享JVM內(nèi)存區(qū)域main memory剃斧。而每個單獨線程又有自己的工作內(nèi)存。為了保證從工作內(nèi)存寫到主內(nèi)存的數(shù)據(jù)的一致性忽你,JVM定義了一系列的規(guī)則

  • 所有變量都在主內(nèi)存中幼东,對所有線程共享(此處的變量與Java編程時所說的變量不一樣,指包括了實例字段科雳、靜態(tài)字段和構(gòu)成數(shù)組對象的元素根蟹,但是不包括局部變量與方法參數(shù),后者是線程私有的糟秘,不會被共享简逮。)
  • 每條線程都有自己的工作內(nèi)存,保存主內(nèi)存中變量的拷貝尿赚,線程對變量的操作只能在工作內(nèi)存中完成
  • 線程無法直接訪問對方的工作內(nèi)存

內(nèi)存之間的8個交互指令####

lock(main) unlock(main) read(main) load(work) use(work) assign(work) store(work) write(main)
必須順序執(zhí)行散庶,不必連續(xù)執(zhí)行

* 不許read load 和 store write單獨出現(xiàn)
* 不許丟棄assign結(jié)果蕉堰,必須同步回主內(nèi)存
* 不許未assign,直接同步主內(nèi)存
* 變量只能在主內(nèi)存誕生督赤。在使用use 和 store前嘁灯,必須先read和load
* 一個變量同一時刻只能由一個lock操作,與unlock必須成對出現(xiàn)
* 如果lock操作躲舌,那么這個變量需要重新執(zhí)行l(wèi)oad 和 assign操作
* 如果沒lock丑婿,不許unlock
* unlock前,必須執(zhí)行store和write 

JVM內(nèi)存管理###

Java虛擬機在運行時會把它所管理的內(nèi)存分為若干不同個數(shù)據(jù)區(qū)域
主內(nèi)存: 方法區(qū)+堆, 由線程共享
工作內(nèi)存:棧 + 程序計數(shù)器没卸,線程私有

  • 方法區(qū): 存放類信息羹奉,常量,靜態(tài)變量约计,即時編譯后的代碼诀拭。
  • 堆:存放對象,細分為新生代(Eden煤蚌,F(xiàn)rom Survivor耕挨, To Survivor)+ 老年代, 也可以劃分出多個線程私有的分配緩存區(qū)TLAB
  • 棧:局部變量表 + 操作數(shù)棧 + 動態(tài)鏈接 + 方法出參+其他(debug)
  • 程序計數(shù)器:當前線程所執(zhí)行的代碼的行號指示器

JVM垃圾回收###

對象已死分析:引用計數(shù)法 Vs 可達性分析法
GC roots:棧中引用的對象,類靜態(tài)變量引用的對象尉桩,常量引用的對象筒占,本地方法JNI引用的對象
垃圾回收算法:復制,標記-整理蜘犁,標記-清除翰苫,分代回收
垃圾回收時間:安全點,安全區(qū)域
垃圾回收器:
新生代:serial parNew ParallelScavenge
老年代:serialOld parallelOld CMS
G1
CMS垃圾回收器:初始標記 -》 并發(fā)標記-》重新標記-》并發(fā)清除

JVM參數(shù)調(diào)優(yōu)###

  • 標準參數(shù) (-) -verbose

  • 非標準參數(shù) (-X) -Xmx20m
    -Xmx 堆最大值
    -Xms 堆最小值
    -Xmn 新生代內(nèi)存
    -Xss 棧內(nèi)存

  • 非穩(wěn)定參數(shù) (-XX) -XX:SurvivorRatio=8

    • 行為參數(shù):
      DisableExplicitGC 禁止顯示調(diào)用system.gc
      UseConcMarkSweepGC
      UseSearialGC
      UseParallelGC

    • 性能調(diào)優(yōu):
      PermSize 方法區(qū)內(nèi)存
      MaxPermSize
      SurvivorRatio 新生代中Eden和Survivor的容量比值这橙,默認8:1
      PretenureSizeThreshold 直接晉升到老年代的對象大小閾值
      MaxTenuringThreshold 晉升到老年代的年齡
      UseAdaptiveSizePolicy 動態(tài)調(diào)整Java堆各區(qū)域的大小及進入老年代的年齡
      HandlePromotionFailure 是否允許擔保失敗
      ParallelGCThreads GC內(nèi)存回收的線程數(shù)
      GCTimeRatio GC占總時間的比例奏窑,默認99, 只允許1%,只在parallelScavenge生效
      MaxGCPauseMillis GC最大停頓時間屈扎,只在parallelScavenge生效
      CMSInitiatingOccupancyFraction 老年代在空間占用多少后觸發(fā)回收埃唯,默認68%,只在CMS生效
      UseCMSCompactionAtFullCollection 是否需要整理助隧,僅在CMS生效
      CMSFullGCsBeforeCompaction 幾次后再整理
      CompileThreshold JIT編譯閾值 client默認1500 server默認10000

    • 調(diào)試:
      printGCDetails 打印內(nèi)存回收日志
      HeapDumpOnOutOfMemoryError
      TraceClassLoading
      TraceClassUnloading

java工具###

jps: 打印java進程
jstack: 查看線程信息
jmap: 查看堆信息
jconsole筑凫, jinfo, jhat并村, javap, btrace

問題解決###

HeapOutOfMemory
當堆上分配的對象大于指定堆的最大值時滓技,拋出該錯哩牍。
可以使用-XX:+HeapDumpOnOutOfMemoryError 查看內(nèi)存快照進行分析

MethodArea OutOfMemory
方法區(qū)內(nèi)存不足,存放類信息令漂,常量膝昆,靜態(tài)變量丸边,即時編譯后的代碼,檢查這幾個信息是否有異常
大多的原因是因為動態(tài)產(chǎn)生過多的類荚孵。

ConstantPool OutOfMemory
常量池溢出妹窖,查看是否intern使用不當

DirectMemory OutOfMemory
本機直接內(nèi)存溢出,容量可通過-XX:MaxDirectMemorySize指定收叶,如果不指定骄呼,默認和堆最大值相同。
這個溢出發(fā)生在系統(tǒng)進行直接內(nèi)存分配判没。例如:unsafe.allocateMemory()
特征為:OOM后發(fā)現(xiàn)Dump問價你很小蜓萄,程序中直接或間接使用了NIO

Stack OutOfMemory
擴展棧時無法獲取足夠的內(nèi)存空間,在創(chuàng)建線程時
解決方法之一:減少最大堆

Stack OverFlow
棧深度大于虛擬機所允許的深度澄峰,經(jīng)常是由于死循環(huán)的遞歸調(diào)用

當一個Java程序響應很慢時如何查找問題


check.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末嫉沽,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子俏竞,更是在濱河造成了極大的恐慌绸硕,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件魂毁,死亡現(xiàn)場離奇詭異玻佩,居然都是意外死亡,警方通過查閱死者的電腦和手機漱牵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門夺蛇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人酣胀,你說我怎么就攤上這事刁赦。” “怎么了闻镶?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵甚脉,是天一觀的道長。 經(jīng)常有香客問我铆农,道長牺氨,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任墩剖,我火速辦了婚禮猴凹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘岭皂。我一直安慰自己郊霎,他們只是感情好,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布爷绘。 她就那樣靜靜地躺著书劝,像睡著了一般进倍。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上购对,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天猾昆,我揣著相機與錄音,去河邊找鬼骡苞。 笑死垂蜗,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的烙如。 我是一名探鬼主播么抗,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼亚铁!你這毒婦竟也來了蝇刀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤徘溢,失蹤者是張志新(化名)和其女友劉穎吞琐,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體然爆,經(jīng)...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡站粟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了曾雕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片奴烙。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖剖张,靈堂內(nèi)的尸體忽然破棺而出切诀,到底是詐尸還是另有隱情,我是刑警寧澤搔弄,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布幅虑,位于F島的核電站,受9級特大地震影響顾犹,放射性物質(zhì)發(fā)生泄漏倒庵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一炫刷、第九天 我趴在偏房一處隱蔽的房頂上張望擎宝。 院中可真熱鬧,春花似錦浑玛、人聲如沸认臊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽失晴。三九已至,卻和暖如春拘央,著一層夾襖步出監(jiān)牢的瞬間涂屁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工灰伟, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拆又,地道東北人。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓栏账,卻偏偏與公主長得像帖族,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挡爵,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內(nèi)容