JVM内存模型和垃圾收集_第1页
JVM内存模型和垃圾收集_第2页
JVM内存模型和垃圾收集_第3页
JVM内存模型和垃圾收集_第4页
JVM内存模型和垃圾收集_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、jvm内存模型和垃圾收集fanzhang 2009.08.31意义何在n内存和垃圾收集对java程序的性能起着至关重要的作用,特别是对服务器程序。n遭遇oom?响应速度慢?并发上不去?吞吐量不够?n内存和垃圾收集是java程序的os。遍布问号的底层n堆?:根集合?、链结构、老的居底、从顶分配、可达性、活跃对象n栈在哪里?:主内存和工作内存?栈空间也要配置?n引用:强引用和弱引用?垃圾收集不用引用计数用什么(无法回收:树、子指向父)?引用值会被改变?对象哈希值何时与之相关?堆(堆(heap)njvm管理的内存叫堆(heap);32位linux最大3g;64位无限制n初始-xms:默认1/64但小

2、于1g。最大-xmx:默认1/4但小于1g。-xms与-xms设置相同值,对服务端应用来说要给足空间(重要)n最小空余-xx:minheapfreeratio=40%。 最大空余-xx:maxheapfreeratio=70%。堆的分代(堆的分代(generation)n堆分为三个代:young、old和permanent,不同代采用不同的垃圾收集算法,以提升性能。(注:permanent空间在大小上并没有计算在heap空间之内)如下图: 年轻代(年轻代(young)n年轻代采取复制收集算法。分为3个区域:一个eden,所有新建对象;两个survivor区,用来实施复制算法。n-xx:newr

3、atio=young:old,推荐1:3-xx:newsize和-xx:maxnewsize设置相同值,适当放大,减少gc(重要)n-xx:survivorratio= eden:1个survivor,默认比例8,适当减小,防止老年化(重要)老年代(老年代(old)n年轻代的对象挺过数次收集,就会进入老年代。老年代使用标记整理算法。老年代存活时间长,不用复制算法。n-xx:maxtenuringthreshold=年轻代熬过多少次收集后进入老年代。持久代(持久代(permanent)n装载class信息等基础数据nxx:maxpermsize=64m,满了之后会引起一种不同类型的 oom。类很

4、多很多的程序,需要加大之,一般使用默认值即可。gc的类型的类型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互换角色 - 对象移动次数到阀值就

5、足够老了-old。nsurvivor是eden和old的缓冲区,为old把关,减少old的大小和gc频次,suvivor不足会old化。nold的gc范围广,较慢,频率低称之为major collection(full collection)。n先young gc,再old gc。垃圾收集算法垃圾收集算法n复制复制(copying):将堆内分成两个相同空间,从根开始访问每一个关联的活跃对象。将空间a的活跃对象全部复制到空间b,然后一次性回收整个空间a。只访问活跃对象,遍历空间的成本较小,但需要巨大的复制成本和较多的内存,需要修改引用值。如下图: n标记清除标记清除(mark-sweep):收集

6、器先从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理。遍历整个空间的成本较大、暂停时间随空间大小线性增大、整理后堆里的碎片很多。如下图: n标记整理标记整理(mark-sweep-compact):综合了上述两者的做法和优点,先标记活跃对象,然后将其合并成较大的内存块。如下图: gc收集器类型收集器类型n串行收集器串行收集器(serial collector)-xx:+useserialgc:年轻代串行复制,老年代串行标记整理。(注:目前已不使用)如下图: n并行收集器并行收集器(throughput collector)-xx:+us

7、eparallelgc:jdk5.0以上-server(linux的jdk默认是-server)的默认值。 年轻代:暂停应用程序,多个垃圾收集线程并行的复制收集,线程数默认为cpu个数,可用-xx:parallelgcthreads= 设定线程数。年老代:暂停应用程序,与串行收集器一样,单垃圾收集线程标记整理。从上可知该收集器需要2+的cpu时才会优于串行收集器。如下图: n并发收集器并发收集器(concurrent low pause collector-cms)-xx:+useconcmarksweepgc:这是以上两种策略的升级版。年轻代:同样是暂停应用程序,多个垃圾收集线程并行的复制收

8、集。年老代:则只有两次短暂停,其他时间应用程序与收集线程并发的清除。对响应时间要求高的服务器应用,应手工配置使用这种收集器。(重要)-xx:cmsinitiatingoccupancyfraction=68%配合使用,可以适当增大此值。如下图: n增量并发收集器增量并发收集器(incremental concurrent-mark-sweep/i-cms):在cpu资源不足下使用cms。n即将问世的garbage first collection(g1):jdk7.0,新的算法与巨大的性能提升。(世界属于搞c+的,也属于搞java的,但最终还是属于搞c的)查看堆nmqq16_186:/resi

9、n-wapqq2008 jmap -heap 28146nattaching to process 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 minheapfreerati

10、o = 40n maxheapfreeratio = 70n maxheapsize = 1048576000 (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 sur

11、vivor space):n capacity = 235929600 (225.0mb)n used = 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% use

12、dnfrom space:n capacity = 26214400 (25.0mb)n used = 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 (

13、750.0mb)n used = 43648992 (41.626922607421875mb)n free = 742783008 (708.3730773925781mb)n 5.55025634765625% usednperm generation:n capacity = 21757952 (20.75mb)n used = 8137176 (7.760215759277344mb)n free = 13620776 (12.989784240722656mb)n 37.39863016519202% used查看线程n状态n调用堆栈n辅助阅读代码n垃圾收集线程n观察线程池大小nqq

14、16_186:/resin-wapqq2008 jstack 28146 | moren2009-09-01 11: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

15、-3 prio=10 tid=0 x00002aaaf44bb800 nid=0 x7a86 runnable 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(epol

16、lselectorimpl.java:65)n at sun.nio.ch.selectorimpl.lockanddoselect(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.transpo

17、rt.socket.nio.nioprocessor.select(nioprocessor.java:68)n 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$worke

18、r.runtask(threadpoolexecutor.java:886)n at java.util.concurrent.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.th

19、read.state: waiting (parking)n at sun.misc.unsafe.park(native 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$condi

20、tionobject.await(abstractqueuedsynchronizer.java:1925)n 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

21、 at java.lang.thread.run(thread.java:619)ngang worker#0 (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 x6df

22、6 runnable ngang worker#3 (parallel gc threads) prio=10 tid=0 x000000004011d800 nid=0 x6df7 runnable nconcurrent mark-sweep gc thread prio=10 tid=0 x00002aaaf263b000 nid=0 x6df8 runnable 看对象数量nmqq16_186:/resin-wapqq2008 jmap -histo 28146 | headn num #instances #bytes class namen-n 1: 51463 53202176

23、bn 2: 46612 39488368 cn 3: 7853 10870384 in 4: 256 4207192 ljava.util.concurrent.concurrenthashmap$hashentry;n 5: 51340 2875040 java.util.hashmap$keyiteratorn 6: 12896 1594832 n 7: 12896 1554848 nmqq16_186:/resin-wapqq2008 jmap -histo 28146 | tailn 459: 1 16 java.util.hashtable$emptyiteratorn 460: 1

24、 16 sun.reflect.generatedserializationconstructoraccessor1n 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$

25、localedataresourcebundlecontroln 466: 1 16 .urlclassloader$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

26、-xx:maxnewsize=250mn-xx:+useconcmarksweepgc n-xx:cmsinitiatingoccupancyfraction=80 n-verbose:gc n-xx:+printgcdetails n-xx:+printgcdatestamps n-xx:+printgctimestamps n-xx:+printgcapplicationstoppedtime n-cp com.qq.gss.server.generalsessionservern看看控制台输出:看看控制台输出:ntotal time for which application threa

27、ds were stopped: 0.0292230 secondsntotal time for which application threads were stopped: 0.0004750 secondsntotal time for which application threads were stopped: 0.0001030 secondsn2009-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: usner=0.15 sys=0.01, real=0.04 secs n压力测试时很有用,并

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论