




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、JVM內(nèi)存模型和渣滓搜集fanzhang 2021.08.31意義何在n內(nèi)存和渣滓搜集對Java程序的性能起著至關重要的作用,特別是對效力器程序。n遭遇OOM?呼應速度慢?并發(fā)上不去?吞吐量不夠?n內(nèi)存和渣滓搜集是Java程序的OS。遍及問號的底層n堆?:根集合?、鏈構(gòu)造、老的居底、從頂分配、可達性、活潑對象n棧在哪里?:主內(nèi)存和任務內(nèi)存???臻g也要配置?n援用:強援用和弱援用?渣滓搜集不用援用計數(shù)用什么無法回收:樹、子指向父?援用值會被改動?對象哈希值何時與之相關?堆堆HeapnJVM管理的內(nèi)存叫堆Heap;32位Linux最大3G;64位無限制n初始-Xms:默許1/64但小于1G。最大-
2、Xmx:默許1/4但小于1G。n-Xms與-Xms設置一樣值,對效力端運用來說要給足空間重要n最小空余-XX:MinHeapFreeRatio=40%。 最大空余-XX:MaxHeapFreeRatio=70%。堆的分代堆的分代Generationn堆分為三個代:Young、Old和Permanent,不同代采用不同的渣滓搜集算法,以提升性能。注:Permanent空間在大小上并沒有計算在Heap空間之內(nèi)如以下圖: 年輕代年輕代Youngn年輕代采取復制搜集算法。分為3個區(qū)域:一個Eden,一切新建對象;兩個Survivor區(qū),用來實施復制算法。n-XX:NewRatio=Young:Old,
3、引薦1:3n-XX:NewSize和-XX:MaxNewSize設置一樣值,適當放大,減少GC重要n-XX:SurvivorRatio= Eden:1個Survivor,默許比例8,適當減小,防止老年化重要老年代老年代Oldn年輕代的對象挺過數(shù)次搜集,就會進入老年代。老年代運用標志整理算法。老年代存活時間長,不用復制算法。n-XX:MaxTenuringThreshold=年輕代熬過多少次搜集后進入老年代。耐久代耐久代Permanentn裝載Class信息等根底數(shù)據(jù)nXX:MaxPermSize=64M,滿了之后會引起一種不同類型的 OOM。類很多很多的程序,需求加大之,普通運用默許值即可。G
4、C的類型的類型nMinor Collection:對Young,復制算法,頻率高。nMajor Collection:同時對Young和Old,也叫Full GC;Old頻率要比Young低很多,采用標志去除/標志整理算法;System.gc()可以建議引發(fā)之,運用-XX:+DisableExplicitGC制止代碼調(diào)用。nYoung的GC頻繁,范圍小,速度快,稱之為Minor Collection。nEden+1Suvivor空間達閥值 - 挪動對象到to space - to space與from space互換角色 - 對象挪動次數(shù)到閥值就足夠老了-Old。nSurvivor是Eden和
5、Old的緩沖區(qū),為Old把關,減少Old的大小和GC頻次,Suvivor缺乏會Old化。nOld的GC范圍廣,較慢,頻率低稱之為Major Collection(Full Collection)。n先Young GC,再Old GC。渣滓搜集算法渣滓搜集算法n復制復制(copying):將堆內(nèi)分成兩個一樣空間,:將堆內(nèi)分成兩個一樣空間,從根開場訪問每一個關聯(lián)的活潑對象。從根開場訪問每一個關聯(lián)的活潑對象。n將空間將空間A的活潑對象全部復制到空間的活潑對象全部復制到空間B,然,然后一次性回收整個空間后一次性回收整個空間A。只訪問活潑對象,遍歷空間的本錢較小,但需只訪問活潑對象,遍歷空間的本錢較小,
6、但需求宏大的復制本錢和較多的內(nèi)存,需求修正援求宏大的復制本錢和較多的內(nèi)存,需求修正援用值。用值。n如以下圖:如以下圖: n標志去除標志去除(mark-sweep):搜集器先從根開場:搜集器先從根開場訪問一切活潑對象,標志為活潑對象。訪問一切活潑對象,標志為活潑對象。n然后再遍歷一次整個內(nèi)存區(qū)域,把一切沒然后再遍歷一次整個內(nèi)存區(qū)域,把一切沒有標志活潑的對象進展回收處置。有標志活潑的對象進展回收處置。n遍歷整個空間的本錢較大、暫停時間隨空遍歷整個空間的本錢較大、暫停時間隨空間大小線性增大、整理后堆里的碎片很多。間大小線性增大、整理后堆里的碎片很多。n如以下圖:如以下圖: n標志整理標志整理(mar
7、k-sweep-compact):綜合了上述兩者的做法和優(yōu)點,先標志綜合了上述兩者的做法和優(yōu)點,先標志活潑對象,然后將其合并成較大的內(nèi)存活潑對象,然后將其合并成較大的內(nèi)存塊。如以下圖:塊。如以下圖: GC搜集器類型搜集器類型n串行搜集器串行搜集器(Serial Collector)-XX:+UseSerialGC:年輕代串行復制,:年輕代串行復制,老年代串行標志整理。注:目前已不老年代串行標志整理。注:目前已不運用如以下圖:運用如以下圖: n并行搜集器并行搜集器(Throughput Collector)-XX:+UseParallelGC:JDK5.0以上以上-serverLinux的的JD
8、K默許是默許是-server的默許值。的默許值。n 年輕代:暫停運用程序,多個渣滓搜集線程年輕代:暫停運用程序,多個渣滓搜集線程并行的復制搜集,線程數(shù)默以為并行的復制搜集,線程數(shù)默以為CPU個數(shù),可個數(shù),可用用-XX:ParallelGCThreads= 設定線程數(shù)。設定線程數(shù)。年老代:暫停運用程序,與串行搜集器一樣,年老代:暫停運用程序,與串行搜集器一樣,單渣滓搜集線程標志整理。單渣滓搜集線程標志整理。從上可知該搜集器需求從上可知該搜集器需求2+的的CPU時才會優(yōu)于時才會優(yōu)于串行搜集器。串行搜集器。如以下圖:如以下圖: n并發(fā)搜集器并發(fā)搜集器(Concurrent Low Pause Col
9、lector-CMS)-XX:+UseConcMarkSweepGC:這是以上兩種戰(zhàn)略:這是以上兩種戰(zhàn)略的晉級版。的晉級版。年輕代:同樣是暫停運用程序,多個渣滓搜集線程并年輕代:同樣是暫停運用程序,多個渣滓搜集線程并行的復制搜集。行的復制搜集。年老代:那么只需兩次短暫停,其他時間運用程序與年老代:那么只需兩次短暫停,其他時間運用程序與搜集線程并發(fā)的去除。搜集線程并發(fā)的去除。n對呼應時間要求高的效力器運用,應手工配置運對呼應時間要求高的效力器運用,應手工配置運用這種搜集器。重要用這種搜集器。重要n-XX:CMSInitiatingOccupancyFraction=68%配合配合運用,可以適當增
10、大此值。運用,可以適當增大此值。n如以下圖:如以下圖: n增量并發(fā)搜集器增量并發(fā)搜集器(Incremental Concurrent-Mark-Sweep/i-CMS):在在CPU資源缺乏下運用資源缺乏下運用CMS。n即將問世的即將問世的Garbage First CollectionG1:JDK7.0,新的算法與宏大的,新的算法與宏大的性能提升。世界屬于搞性能提升。世界屬于搞C+的,也屬的,也屬于搞于搞Java的,但最終還是屬于搞的,但最終還是屬于搞C的的查看堆nmqq16_186:/resin-wapqq2019 jmap -heap 28146nAttaching to process
11、ID 28146, please wait.nDebugger attached successfully.nServer compiler detected.nJVM version is 11.2-b01nusing parallel threads in the new generation.nusing thread-local object allocation.nConcurrent Mark-Sweep GCnHeap Configuration:n MinHeapFreeRatio = 40n MaxHeapFreeRatio = 70n MaxHeapSize = 10485
12、76000 (1000.0MB)n NewSize = 262144000 (250.0MB)n MaxNewSize = 262144000 (250.0MB)n OldSize = 786432000 (750.0MB)n NewRatio = 7n SurvivorRatio = 8n PermSize = 21757952 (20.75MB)n MaxPermSize = 88080384 (84.0MB)nHeap Usage:nNew Generation (Eden + 1 Survivor Space):n capacity = 235929600 (225.0MB)n use
13、d = 38844960 (37.045440673828125MB)n free = 197084640 (187.95455932617188MB)n 16.464640299479168% usednEden Space:n capacity = 209715200 (200.0MB)n used = 37723976 (35.97638702392578MB)n free = 171991224 (164.02361297607422MB)n 17.98819351196289% usednFrom Space:n capacity = 26214400 (25.0MB)n used
14、= 1120984 (1.0690536499023438MB)n free = 25093416 (23.930946350097656MB)n 4.276214599609375% usednTo Space:n capacity = 26214400 (25.0MB)n used = 0 (0.0MB)n free = 26214400 (25.0MB)n 0.0% usednconcurrent mark-sweep generation:n capacity = 786432000 (750.0MB)n used = 43648992 (41.626922607421875MB)n
15、free = 742783008 (708.3730773925781MB)n 5.55025634765625% usednPerm Generation:n capacity = 21757952 (20.75MB)n used = 8176 (7.760215759277344MB)n free = 20776 (12.989784240722656MB)n 37.39863016519202% used查看線程n形狀n調(diào)用堆棧n輔助閱讀代碼n渣滓搜集線程n察看線程池大小nqq16_186:/resin-wapqq2019 jstack 28146 | moren2021-09-01 1
16、1:31:50nFull thread dump Java HotSpot(TM) 64-Bit Server VM (11.2-b01 mixed mode):nAttach Listener daemon prio=10 tid=0 x00002aaaf5b08400 nid=0 x49db runnable 0 x0000000000000000.0 x0000000000000000n java.lang.Thread.State: RUNNABLEnNioProcessor-3 prio=10 tid=0 x00002aaaf44bb800 nid=0 x7a86 runnable
17、0 x0000000042b53000.0 x0000000042b53ca0n java.lang.Thread.State: RUNNABLEn at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method)n at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:215)n at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65)n at sun.nio.ch.SelectorImpl.lockA
18、ndDoSelect(SelectorImpl.java:69)n - locked (a sun.nio.ch.Util$1)n - locked (a java.util.Collections$UnmodifiableSet)n - locked (a sun.nio.ch.EPollSelectorImpl)n at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80)n at org.apache.mina.transport.socket.nio.NioProcessor.select(NioProcessor.java:68)n
19、 at org.apache.mina.core.polling.AbstractPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:883)n at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64)n at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)n at java.util.con
20、current.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)n at java.lang.Thread.run(Thread.java:619)npool-8-thread-12 prio=10 tid=0 x00002aaaf4197400 nid=0 x6f25 waiting on condition 0 x000000004264e000.0 x000000004264eda0n java.lang.Thread.State: WAITING (parking)n at sun.misc.Unsafe.park(N
21、ative Method)n - parking to wait for (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)n at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158)n at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925)n
22、at java.util.concurrent.LinkedBlockingQueue.take(LinkedBlockingQueue.java:358)n at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947)n at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907)n at java.lang.Thread.run(Thread.java:619)nGang worker#0
23、(Parallel GC Threads) prio=10 tid=0 x0000000040118c00 nid=0 x6df4 runnable nGang worker#1 (Parallel GC Threads) prio=10 tid=0 x000000004011a400 nid=0 x6df5 runnable nGang worker#2 (Parallel GC Threads) prio=10 tid=0 x000000004011c000 nid=0 x6df6 runnable nGang worker#3 (Parallel GC Threads) prio=10
24、tid=0 x000000004011d800 nid=0 x6df7 runnable nConcurrent Mark-Sweep GC Thread prio=10 tid=0 x00002aaaf263b000 nid=0 x6df8 runnable 看對象數(shù)量nmqq16_186:/resin-wapqq2019 jmap -histo 28146 | headn num #instances #bytes class namen-n 1: 51463 53202176 Bn 2: 46612 39488368 Cn 3: 7853 10870384 In 4: 256 42071
25、92 Ljava.util.concurrent.ConcurrentHashMap$HashEntry;n 5: 51340 2875040 java.util.HashMap$KeyIteratorn 6: 12896 1594832 n 7: 12896 1554848 nmqq16_186:/resin-wapqq2019 jmap -histo 28146 | tailn 459: 1 16 java.util.Hashtable$EmptyIteratorn 460: 1 16 sun.reflect.GeneratedSerializationConstructorAccesso
26、r1n 461: 1 16 java.lang.ApplicationShutdownHooksn 462: 1 16 org.apache.mina.util.DefaultExceptionMonitorn 463: 1 16 java.lang.String$CaseInsensitiveComparatorn 464: 1 16 java.util.ResourceBundle$Controln 465: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControln 466: 1 16 java.URLClass
27、Loader$7n 467: 1 16 java.lang.reflect.ReflectAccessnTotal 433176 132451240參數(shù)調(diào)諧n一個一個Java進程的例如:進程的例如:n28146 /usr/local/jdk/bin/java n-Xss1m n-XX:ErrorFile=/usr/local/app/GeneralSessionServer/log/jvm_error.log n-Xmx1000m n-Xms1000m n-XX:NewSize=250m n-XX:MaxNewSize=250mn-XX:+UseConcMarkSweepGC n-XX:CMS
28、InitiatingOccupancyFraction=80 n-verbose:gc n-XX:+PrintGCDetails n-XX:+PrintGCDateStamps n-XX:+PrintGCTimeStamps n-XX:+PrintGCApplicationStoppedTime n-cp com.gss.server.GeneralSessionServern看看控制臺輸出:看看控制臺輸出:nTotal time for which application threads were stopped: 0.0292230 secondsnTotal time for which application threads were stopped: 0.0004750 secondsnTotal time for which application threads were stopped: 0.0001030 secondsn2021-08-28T17:23:46.336+0800: 656.703: GC 656.703: ParNew: 219248K-16582K(230400K), 0.0410220 secs 235238K-32571K(998400K), 0.0411500 secs
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 護理年終考試練習試題及答案
- 嵌入式系統(tǒng)安全性問題試題及答案
- 未成年人保護宣傳月總結(jié)(19篇)
- 海外旅游行程及保險服務合同
- 家裝行業(yè)試題及答案
- 銷售分銷網(wǎng)絡管理規(guī)范合同書
- 服裝定制行業(yè)尺寸誤差免責合同
- 當陽話考試題及答案
- 行政組織理論的研究熱點試題及答案
- 量身定制2025年信息系統(tǒng)監(jiān)理師考試試題及答案
- 2025年浙江省湖州市吳興區(qū)中考數(shù)學二模試卷
- 2021城市運行管理服務平臺數(shù)據(jù)標準
- 消防車駕駛員基本素質(zhì)、車輛行車安全
- 2025湘美版(2024)小學美術一年級下冊教學設計(附目錄)
- 統(tǒng)編版(2024)語文一年級下冊第七單元綜合素質(zhì)測評A卷(含答案)
- 智慧樹知到《走進故宮(故宮研究院)》期末考試答案
- 杭州市蕭山區(qū)部分校教科版六年級下冊期末考試科學試卷(解析版)
- 超星爾雅學習通《紅色經(jīng)典影片與近現(xiàn)代中國發(fā)展(首都師范大學)》2025章節(jié)測試附答案
- 2024-2025學年統(tǒng)編版道德與法治七年級下冊知識點提綱
- 城市規(guī)劃設計合作框架協(xié)議
- 臨床科研專病數(shù)據(jù)庫
評論
0/150
提交評論