版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JVM内存模型和渣滓搜集fanzhang 2021.08.31意义何在n内存和渣滓搜集对Java程序的性能起着至关重要的作用,特别是对效力器程序。n遭遇OOM?呼应速度慢?并发上不去?吞吐量不够?n内存和渣滓搜集是Java程序的OS。遍及问号的底层n堆?:根集合?、链构造、老的居底、从顶分配、可达性、活泼对象n栈在哪里?:主内存和任务内存?栈空间也要配置?n援用:强援用和弱援用?渣滓搜集不用援用计数用什么无法回收:树、子指向父?援用值会被改动?对象哈希值何时与之相关?堆堆HeapnJVM管理的内存叫堆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空间之内如以下图: 年轻代年轻代Youngn年轻代采取复制搜集算法。分为3个区域:一个Eden,一切新建对象;两个Survivor区,用来实施复制算法。n-XX:NewRatio=Young:Old,
3、引荐1:3n-XX:NewSize和-XX:MaxNewSize设置一样值,适当放大,减少GC重要n-XX:SurvivorRatio= Eden:1个Survivor,默许比例8,适当减小,防止老年化重要老年代老年代Oldn年轻代的对象挺过数次搜集,就会进入老年代。老年代运用标志整理算法。老年代存活时间长,不用复制算法。n-XX:MaxTenuringThreshold=年轻代熬过多少次搜集后进入老年代。耐久代耐久代Permanentn装载Class信息等根底数据nXX:MaxPermSize=64M,满了之后会引起一种不同类型的 OOM。类很多很多的程序,需求加大之,普通运用默许值即可。G
4、C的类型的类型nMinor Collection:对Young,复制算法,频率高。nMajor Collection:同时对Young和Old,也叫Full GC;Old频率要比Young低很多,采用标志去除/标志整理算法;System.gc()可以建议引发之,运用-XX:+DisableExplicitGC制止代码调用。nYoung的GC频繁,范围小,速度快,称之为Minor Collection。nEden+1Suvivor空间达阀值 - 挪动对象到to space - to space与from space互换角色 - 对象挪动次数到阀值就足够老了-Old。nSurvivor是Eden和
5、Old的缓冲区,为Old把关,减少Old的大小和GC频次,Suvivor缺乏会Old化。nOld的GC范围广,较慢,频率低称之为Major Collection(Full Collection)。n先Young GC,再Old GC。渣滓搜集算法渣滓搜集算法n复制复制(copying):将堆内分成两个一样空间,:将堆内分成两个一样空间,从根开场访问每一个关联的活泼对象。从根开场访问每一个关联的活泼对象。n将空间将空间A的活泼对象全部复制到空间的活泼对象全部复制到空间B,然,然后一次性回收整个空间后一次性回收整个空间A。只访问活泼对象,遍历空间的本钱较小,但需只访问活泼对象,遍历空间的本钱较小,
6、但需求宏大的复制本钱和较多的内存,需求修正援求宏大的复制本钱和较多的内存,需求修正援用值。用值。n如以下图:如以下图: n标志去除标志去除(mark-sweep):搜集器先从根开场:搜集器先从根开场访问一切活泼对象,标志为活泼对象。访问一切活泼对象,标志为活泼对象。n然后再遍历一次整个内存区域,把一切没然后再遍历一次整个内存区域,把一切没有标志活泼的对象进展回收处置。有标志活泼的对象进展回收处置。n遍历整个空间的本钱较大、暂停时间随空遍历整个空间的本钱较大、暂停时间随空间大小线性增大、整理后堆里的碎片很多。间大小线性增大、整理后堆里的碎片很多。n如以下图:如以下图: n标志整理标志整理(mar
7、k-sweep-compact):综合了上述两者的做法和优点,先标志综合了上述两者的做法和优点,先标志活泼对象,然后将其合并成较大的内存活泼对象,然后将其合并成较大的内存块。如以下图:块。如以下图: GC搜集器类型搜集器类型n串行搜集器串行搜集器(Serial Collector)-XX:+UseSerialGC:年轻代串行复制,:年轻代串行复制,老年代串行标志整理。注:目前已不老年代串行标志整理。注:目前已不运用如以下图:运用如以下图: n并行搜集器并行搜集器(Throughput Collector)-XX:+UseParallelGC:JDK5.0以上以上-serverLinux的的JD
8、K默许是默许是-server的默许值。的默许值。n 年轻代:暂停运用程序,多个渣滓搜集线程年轻代:暂停运用程序,多个渣滓搜集线程并行的复制搜集,线程数默以为并行的复制搜集,线程数默以为CPU个数,可个数,可用用-XX:ParallelGCThreads= 设定线程数。设定线程数。年老代:暂停运用程序,与串行搜集器一样,年老代:暂停运用程序,与串行搜集器一样,单渣滓搜集线程标志整理。单渣滓搜集线程标志整理。从上可知该搜集器需求从上可知该搜集器需求2+的的CPU时才会优于时才会优于串行搜集器。串行搜集器。如以下图:如以下图: n并发搜集器并发搜集器(Concurrent Low Pause Col
9、lector-CMS)-XX:+UseConcMarkSweepGC:这是以上两种战略:这是以上两种战略的晋级版。的晋级版。年轻代:同样是暂停运用程序,多个渣滓搜集线程并年轻代:同样是暂停运用程序,多个渣滓搜集线程并行的复制搜集。行的复制搜集。年老代:那么只需两次短暂停,其他时间运用程序与年老代:那么只需两次短暂停,其他时间运用程序与搜集线程并发的去除。搜集线程并发的去除。n对呼应时间要求高的效力器运用,应手工配置运对呼应时间要求高的效力器运用,应手工配置运用这种搜集器。重要用这种搜集器。重要n-XX:CMSInitiatingOccupancyFraction=68%配合配合运用,可以适当增
10、大此值。运用,可以适当增大此值。n如以下图:如以下图: n增量并发搜集器增量并发搜集器(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调用堆栈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 看对象数量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参数调谐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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年南昌大学附属眼科医院高层次人才招聘9人备考题库及答案详解(考点梳理)
- 2026年洛阳铁路备考题库工程学校公开招聘工作人员备考题库及完整答案详解一套
- 2026年重庆鈊渝金融租赁股份有限公司招聘备考题库及答案详解(夺冠系列)
- 融安县长安镇卫生院2026年乡村医生招聘备考题库及答案详解(易错题)
- 2026年北京航空航天大学宇航学院聘用编科研助理(知识产权)F岗招聘备考题库及答案详解(新)
- 中国石化丽江石油分公司2026年一季度加油站汽修类专业人才招聘备考题库及一套答案详解
- 中国热带农业科学院湛江实验站2026年第一批公开招聘工作人员备考题库及答案详解(考点梳理)
- 2026年招聘缙云电信业务项目部智慧家庭工程师备考题库及完整答案详解1套
- 2026年揭阳市引进基层医疗卫生急需紧缺人才招聘备考题库及参考答案详解
- 一中·招聘我校2026年编外教师招聘备考题库及一套完整答案详解
- 生命伦理学:生命医学科技与伦理智慧树知到期末考试答案章节答案2024年山东大学
- 纪检监察信访知识讲座
- 2024年合同知识产权审查表-(含附件)
- 智能教育:科技驱动下的学校革新
- 汉字笔画练习字帖
- 酒店住宿和餐饮行业企业安全风险分级管控清单
- 手机靓号抵押借款合同
- GB/T 7044-2013色素炭黑
- GB/T 26059-2010钛及钛合金网板
- 羊的品种课件
- 国家开放大学《机械设计基础》机考试题001-009参考答案
评论
0/150
提交评论