版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、JVM内存模型和垃圾收集,fanzhang 2009.08.31,意义何在,内存和垃圾收集对Java程序的性能起着至关重要的作用,特别是对服务器程序。 遭遇OOM?响应速度慢?并发上不去?吞吐量不够? 内存和垃圾收集是Java程序的OS。,遍布问号的底层,堆?:根集合?、链结构、老的居底、从顶分配、可达性、活跃对象 栈在哪里?:主内存和工作内存?栈空间也要配置? 引用:强引用和弱引用?垃圾收集不用引用计数用什么(无法回收:树、子指向父)?引用值会被改变?对象哈希值何时与之相关?,堆(Heap),JVM管理的内存叫堆(Heap);32位Linux最大3G;64位无限制 初始-Xms:默认1/64
2、但小于1G。最大-Xmx:默认1/4但小于1G。 -Xms与-Xms设置相同值,对服务端应用来说要给足空间(重要) 最小空余-XX:MinHeapFreeRatio=40%。 最大空余-XX:MaxHeapFreeRatio=70%。,堆的分代(Generation),堆分为三个代:Young、Old和Permanent,不同代采用不同的垃圾收集算法,以提升性能。(注:Permanent空间在大小上并没有计算在Heap空间之内)如下图:,年轻代(Young),年轻代采取复制收集算法。分为3个区域:一个Eden,所有新建对象;两个Survivor区,用来实施复制算法。 -XX:NewRatio=
3、Young:Old,推荐1:3 -XX:NewSize和-XX:MaxNewSize设置相同值,适当放大,减少GC(重要) -XX:SurvivorRatio= Eden:1个Survivor,默认比例8,适当减小,防止老年化(重要),老年代(Old),年轻代的对象挺过数次收集,就会进入老年代。老年代使用标记整理算法。老年代存活时间长,不用复制算法。 -XX:MaxTenuringThreshold=年轻代熬过多少次收集后进入老年代。,持久代(Permanent),装载Class信息等基础数据 XX:MaxPermSize=64M,满了之后会引起一种不同类型的 OOM。类很多很多的程序,需要加
4、大之,一般使用默认值即可。,GC的类型,Minor Collection:对Young,复制算法,频率高。 Major Collection:同时对Young和Old,也叫Full GC;Old频率要比Young低很多,采用标记清除/标记整理算法;System.gc()可以建议引发之,使用-XX:+DisableExplicitGC禁止代码调用。,Young的GC频繁,范围小,速度快,称之为Minor Collection。 Eden+1Suvivor空间达阀值 - 移动对象到to space - to space与from space互换角色 - 对象移动次数到阀值就足够老了-Old。 Su
5、rvivor是Eden和Old的缓冲区,为Old把关,减少Old的大小和GC频次,Suvivor不足会Old化。 Old的GC范围广,较慢,频率低称之为Major Collection(Full Collection)。 先Young GC,再Old GC。,垃圾收集算法,复制(copying):将堆内分成两个相同空间,从根开始访问每一个关联的活跃对象。 将空间A的活跃对象全部复制到空间B,然后一次性回收整个空间A。只访问活跃对象,遍历空间的成本较小,但需要巨大的复制成本和较多的内存,需要修改引用值。 如下图:,标记清除(mark-sweep):收集器先从根开始访问所有活跃对象,标记为活跃对象
6、。 然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。 遍历整个空间的成本较大、暂停时间随空间大小线性增大、整理后堆里的碎片很多。 如下图:,标记整理(mark-sweep-compact):综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。如下图:,GC收集器类型,串行收集器(Serial Collector)-XX:+UseSerialGC:年轻代串行复制,老年代串行标记整理。(注:目前已不使用)如下图:,并行收集器(Throughput Collector)-XX:+UseParallelGC:JDK5.0以上-server(Linux的JDK默认是
7、-server)的默认值。 年轻代:暂停应用程序,多个垃圾收集线程并行的复制收集,线程数默认为CPU个数,可用-XX:ParallelGCThreads= 设定线程数。年老代:暂停应用程序,与串行收集器一样,单垃圾收集线程标记整理。从上可知该收集器需要2+的CPU时才会优于串行收集器。如下图:,并发收集器(Concurrent Low Pause Collector-CMS)-XX:+UseConcMarkSweepGC:这是以上两种策略的升级版。年轻代:同样是暂停应用程序,多个垃圾收集线程并行的复制收集。年老代:则只有两次短暂停,其他时间应用程序与收集线程并发的清除。 对响应时间要求高的服务
8、器应用,应手工配置使用这种收集器。(重要) -XX:CMSInitiatingOccupancyFraction=68%配合使用,可以适当增大此值。 如下图:,增量并发收集器(Incremental Concurrent-Mark-Sweep/i-CMS):在CPU资源不足下使用CMS。 即将问世的Garbage First Collection(G1):JDK7.0,新的算法与巨大的性能提升。(世界属于搞C+的,也属于搞Java的,但最终还是属于搞C的),查看堆,mqq16_186:/resin-wapqq2008 jmap -heap 28146 Attaching to process
9、ID 28146, please wait. Debugger attached successfully. Server compiler detected. JVM version is 11.2-b01 using parallel threads in the new generation. using thread-local object allocation. Concurrent Mark-Sweep GC Heap Configuration: MinHeapFreeRatio = 40 MaxHeapFreeRatio = 70 MaxHeapSize = 10485760
10、00 (1000.0MB) NewSize = 262144000 (250.0MB) MaxNewSize = 262144000 (250.0MB) OldSize = 786432000 (750.0MB) NewRatio = 7 SurvivorRatio = 8 PermSize = 21757952 (20.75MB) MaxPermSize = 88080384 (84.0MB),Heap Usage: New Generation (Eden + 1 Survivor Space): capacity = 235929600 (225.0MB) used = 38844960
11、 (37.045440673828125MB) free = 197084640 (187.95455932617188MB) 16.464640299479168% used Eden Space: capacity = 209715200 (200.0MB) used = 37723976 (35.97638702392578MB) free = 171991224 (164.02361297607422MB) 17.98819351196289% used From Space: capacity = 26214400 (25.0MB) used = 1120984 (1.0690536
12、499023438MB) free = 25093416 (23.930946350097656MB) 4.276214599609375% used To Space: capacity = 26214400 (25.0MB) used = 0 (0.0MB) free = 26214400 (25.0MB) 0.0% used concurrent mark-sweep generation: capacity = 786432000 (750.0MB) used = 43648992 (41.626922607421875MB) free = 742783008 (708.3730773
13、925781MB) 5.55025634765625% used Perm Generation: capacity = 21757952 (20.75MB) used = 8137176 (7.760215759277344MB) free = 13620776 (12.989784240722656MB) 37.39863016519202% used,查看线程,状态 调用堆栈 辅助阅读代码 垃圾收集线程 观察线程池大小,qq16_186:/resin-wapqq2008 jstack 28146 | more 2009-09-01 11:31:50 Full thread dump Ja
14、va HotSpot(TM) 64-Bit Server VM (11.2-b01 mixed mode): Attach Listener daemon prio=10 tid=0 x00002aaaf5b08400 nid=0 x49db runnable 0 x0000000000000000.0 x0000000000000000 java.lang.Thread.State: RUNNABLE NioProcessor-3 prio=10 tid=0 x00002aaaf44bb800 nid=0 x7a86 runnable 0 x0000000042b53000.0 x00000
15、00042b53ca0 java.lang.Thread.State: RUNNABLE at sun.nio.ch.EPollArrayWrapper.epollWait(Native Method) at sun.nio.ch.EPollArrayWrapper.poll(EPollArrayWrapper.java:215) at sun.nio.ch.EPollSelectorImpl.doSelect(EPollSelectorImpl.java:65) at sun.nio.ch.SelectorImpl.lockAndDoSelect(SelectorImpl.java:69)
16、- locked (a sun.nio.ch.Util$1) - locked (a java.util.Collections$UnmodifiableSet) - locked (a sun.nio.ch.EPollSelectorImpl) at sun.nio.ch.SelectorImpl.select(SelectorImpl.java:80) at org.apache.mina.transport.socket.nio.NioProcessor.select(NioProcessor.java:68) at org.apache.mina.core.polling.Abstra
17、ctPollingIoProcessor$Processor.run(AbstractPollingIoProcessor.java:883) at org.apache.mina.util.NamePreservingRunnable.run(NamePreservingRunnable.java:64) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Thre
18、adPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619),pool-8-thread-12 prio=10 tid=0 x00002aaaf4197400 nid=0 x6f25 waiting on condition 0 x000000004264e000.0 x000000004264eda0 java.lang.Thread.State: WAITING (parking) at sun.misc.Unsafe.park(Native Method) - parking to wait for (a java.u
19、til.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) at java.util.concurrent.locks.LockSupport.park(LockSupport.java:158) at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:1925) at java.util.concurrent.LinkedBlockingQueue.take(
20、LinkedBlockingQueue.java:358) at java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:947) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:907) at java.lang.Thread.run(Thread.java:619) Gang worker#0 (Parallel GC Threads) prio=10 tid=0 x0000000040118c0
21、0 nid=0 x6df4 runnable Gang worker#1 (Parallel GC Threads) prio=10 tid=0 x000000004011a400 nid=0 x6df5 runnable Gang worker#2 (Parallel GC Threads) prio=10 tid=0 x000000004011c000 nid=0 x6df6 runnable Gang worker#3 (Parallel GC Threads) prio=10 tid=0 x000000004011d800 nid=0 x6df7 runnable Concurrent
22、 Mark-Sweep GC Thread prio=10 tid=0 x00002aaaf263b000 nid=0 x6df8 runnable,看对象数量,mqq16_186:/resin-wapqq2008 jmap -histo 28146 | head num #instances #bytes class name - 1: 51463 53202176 B 2: 46612 39488368 C 3: 7853 10870384 I 4: 256 4207192 Ljava.util.concurrent.ConcurrentHashMap$HashEntry; 5: 5134
23、0 2875040 java.util.HashMap$KeyIterator 6: 12896 1594832 7: 12896 1554848 mqq16_186:/resin-wapqq2008 jmap -histo 28146 | tail 459: 1 16 java.util.Hashtable$EmptyIterator 460: 1 16 sun.reflect.GeneratedSerializationConstructorAccessor1 461: 1 16 java.lang.ApplicationShutdownHooks 462: 1 16 org.apache
24、.mina.util.DefaultExceptionMonitor 463: 1 16 java.lang.String$CaseInsensitiveComparator 464: 1 16 java.util.ResourceBundle$Control 465: 1 16 sun.util.resources.LocaleData$LocaleDataResourceBundleControl 466: 1 16 .URLClassLoader$7 467: 1 16 java.lang.reflect.ReflectAccess Total 433176 132451240,参数调谐
25、,一个Java进程的示例: 28146 /usr/local/jdk/bin/java -Xss1m -XX:ErrorFile=/usr/local/app/GeneralSessionServer/log/jvm_error.log -Xmx1000m -Xms1000m -XX:NewSize=250m -XX:MaxNewSize=250m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=80 -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+Pr
26、intGCTimeStamps -XX:+PrintGCApplicationStoppedTime -cp com.qq.gss.server.GeneralSessionServer 看看控制台输出: Total time for which application threads were stopped: 0.0292230 seconds Total time for which application threads were stopped: 0.0004750 seconds Total time for which application threads were stopped: 0.0001030 seconds 2009-08-28T17:23:46.336+0800: 656.703: GC 656.703: ParNew: 219248K-16582K(230400K), 0.0410220 secs 235238K-32571K(998400K), 0.0411500 secs Times: us er=0.15 sys=0.01, real=0.04 secs,压力测试时很有用,并发和响
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 应急演练纠正预案(3篇)
- 南皮应急预案备案(3篇)
- 学校墙皮施工方案(3篇)
- 夏天露营策划活动方案(3篇)
- 日语朗诵活动方案策划(3篇)
- 快递应急预案演练(3篇)
- 手工画室活动方案策划(3篇)
- 故宫旅游营销方案(3篇)
- 水害抢险施工方案(3篇)
- 活动创意策划布置方案(3篇)
- 2026浙江省海洋风电发展有限公司校园招聘笔试备考试题及答案解析
- 教科版三年级下册科学实验报告(20 篇)
- 施工组织设计(老旧小区改造及配套设施)
- 建设工程第三方质量安全巡查标准
- GB/T 28292-2012钢铁工业含铁尘泥回收及利用技术规范
- 货币金融学第2章信用与信用工具
- Unit 1 Discover useful structures 语法精讲课件 【高效识记+延伸拓展】高中英语人教版(2019)选择性必修第三册
- 环境微生物学第六节微生物营养
- 高脂血症健康讲座课件
- 广东中考语文备考会讲座课件基于考情和学情的有效训练-中考作文备考例谈-
- 营养配餐员理论考试复习题库(附答案)
评论
0/150
提交评论