您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > JVM垃圾回收原理GC
GarbageCollectionFenghuaJin1st,May,20072GCDescriptionWhat’sGC?–GC用于跟踪内存中的对象,并回收那些不再被其他对象引用的对象。–内存中的对象类型•活动对象:即当前正在其他对象引用的对象。•非活动对象:这类对象不再被其他对象所引用,是孤立的对象。这类对象可以被回收,回收的堆空间用于分配给其它新创建的对象。3GCDescription(2)GC何时会被触发?–系统空闲•GC线程的优先级低于系统应用线程,当系统中没有应用线程执行时,GC会被触发。–堆空间内存不足•当堆空间的内存不足以创建新对象时,GC会被触发。如果第一GC仍不能获得足够的空间,第二次GC将被触发,如果这一次仍无法获取足够的空间,“Outofmemory”将被抛出。4GCDescription(3)影响GC执行时间、频度的因素–JVM堆(heap)空间的大小•堆空间设置偏大,完全GC执行比较耗时,但执行频率会降低。•堆空间设置恰好符合应用内存需求,完全GC执行很快,但执行会变得更频繁。5HeapDescription什么是堆(heap)空间–堆是java程序中对象存活的地方,其中包括:•活动对象•非活动对象,这类对象不再为应用程序中的任何指针能够到达。•剩余内存–堆空间中包含三种区域:•新生代(younggeneration)•旧生代(tenuredgeneration)•永生代(permanentgeneration)6HeapDescription(2)新生代(younggeneration)–新生代被分为两块:Eden、Survivorspaces•Eden是为新对象分配的地方,很多对象分配后就变成非活动对象,即垃圾对象。这类对象具有“infantmortality”(幼儿死亡率)。如:方法体中的临时对象。•Survivorspaces也被称为两片生存空间,其中一片要保证任何时刻是空的,并作为下一个空间的目的地。当GC发生的时候,Eden中的存活对象被移入下一片空间。对象在生存空间之间移动,直到它们老化(达到存活时间阀值),然后被移入旧生代。•Eden中对象满的时候,发生一次小收集(minorcollection),小收集执行时间取决于Eden中对象的infantmortality。infantmortality高,执行就会很快。7HeapDescription(3)旧生代(tenuredgeneration)–该区域用于存放那些生命周期比较长的对象,Eden中的活动对象经过minorcollection后,被复制到两片生存空间,当两片生存空间中的对象老化时,这些对象被移入旧生代。–旧生代中对象满的时候,发生一次大收集(majorcollection),因为收集时要涉及所有存活对象,所以大收集的速度相对于小收集要慢很多。8HeapDescription(4)下图展示了典型应用中,对象生存周期9HeapDescription(5)永生代(permanentgeneration)–这个代比较特别,它负责保存反射对象。这些数据是虚拟机所需的数据,用来描述在Java语言中没有等同物的对象。例如,描述类与方法的对象存储在永生代中。10HeapDescription(6)分代后的heap结构11PerformanceTuning下图显示了GC性能对整个系统性能的影响12PerformanceTuning(2)从上图可以看出:–如果系统花费在GC上的时间为1%,一旦系统跨越32个处理器时,系统的吞吐量(Throughput)将减少20%–如果系统花费在GC上的时间为10%,一旦系统跨越32个处理器时,系统的吞吐量(Throughput)将减少高达75%Note:所谓throughput,即系统用于处理非GC时间的比例。13PerformanceTuning(3)Performancemeasurement–Pause:thetimeswhenanapplicationappearsunresponsivebecausegarbagecollectionisoccurring.–Footprint:theworkingsetofaprocess,measuredinpagesandcachelines.–Promptness:thetimebetweenwhenanobjectbecomesdeadandwhenthememorybecomesavailable.14PerformanceTuning(4)Howtoleveragethesemeasurement–averylargeyounggenerationmaymaximizethroughput,butdoessoattheexpenseoffootprint,promptness,andpausetimes.–asmallyounggenerationcanminimizepausetimesattheexpenseofthroughput15PerformanceTuning(5)ExampleoutputofGC16PerformanceTuning(6)TogetdetailedinfoofGC–-XX:+PrintGCDetailsExample:[GC[DefNew:64575K-959K(64576K),0.0457646secs]196016K-133633K(261184K),0.0459067secs]]–-XX:+PrintGCTimestampsExample:111.042:[GC111.042:[DefNew:8128K-8128K(8128K),0.0000505secs]111.042:[Tenured:18154K-2311K(24576K),0.1290354secs]26282K-2311K(32704K),0.1293306secs]Note:theoutputformatofaboveflagisdifferentfromeachversionofJVM.17PerformanceTuning(7)Generationsizediagram18PerformanceTuning(8)CommittedVSVirtual–每个代分成committed和virtual,JVM初始化的时候,所有heap被reserve。如果-Xms小于-Xmx,不是所有reserved的空间都立刻被commit,没有被commit的空间标志为virtual。–随着应用对内存需求的增长,commited的heap慢慢会达到-Xmx指定的数值。19PerformanceTuning(9)Parameterswhichaffecttotalheapsize–-XX:MinHeapFreeRatio=–-XX:MaxHeapFreeRatio=–-Xms–-XmxNote:JVM每次GC的时候,都会增加或收缩heap的大小,以保证free的空间的百分比在-XX:MinHeapFreeRatio和-XX:MaxHeapFreeRatio之间。同时建议-Xms和-Xmx设为相同值。20PerformanceTuning(10)Parameterswhichaffectyounggenerationsize–-XX:NewRatio=–-XX:NewSize=–-XX:MaxNewSize=–-XX:SurvivorRatio=Note:younggeneration的设置大点,小收集的执行频率降低,但大收集的执行频率会升高,可以依据应用中的对象生命周期进行younggeneration大小的调整。younggeneration的大小,可以由NewRatio控制,如NewRatio=4,这意味着younggeneration占整个heap的1/5。NewSize和MaxNewSize分别代表younggeneration的上下边界值。SurvivorRation用于指定survivor和eden的比例,如SurvivorRation=5,则意味着每个survivor占整个younggeneration的1/7(因为younggeneration中有两个survivor)。21TypesofCollectorsCollectorsinJ2SEplatform,version1.4.2–Defaultcollector–Throughputcollector–Concurrentlowpausecollector–IncrementallowpausecollectorNote:之前的介绍,都是基于defaultcollector的。通常情况下,在使用其他三种collector之前,推荐使用defaultcollector。如果调整heapsize仍不满足系统某些要求,则根据这些需求,再选择相应的collector。22ThroughputcollectorWhat’sThroughputcollector–Throughputcollector在younggeneration中使用并行版本收集器,而tenuredgeneration中仍使用defaultcollector。WhentouseThroughputcollector–Throughputcollector适用于应用跨越多CPU的场合。Defaultcollector进行minor收集的时候,使用单线程,而Throughputcollector使用多线程进行并行收集,这样可以减少收集时间。HowtouseThroughputcollector–Addflag-XX:+UseParallelGCtocommandline。23Throughputcollector(2)Performanceimprovement–对于单CPU的场合,因为并行收集的额外负荷(同步等),throughputcollector性能不但得不到提升,反而不如defaultcollector。–对于双CPU的场合,throughputcollector的性能基本和defaultcollector相当。–对于3CPU及以上的场合,throughputcollector在收集性能上能得到一定的提升。24Throughputcollector(3)GCthreadsinThroughputcollector–默认情况下,throughputcollector中GC线程数和系统的CPU数相当。但GC线程数可通过下面的flag进行控制,-XX:ParallelGCThreads=GCstatistics–Throughcollector收集时的统计数据包括:收集时间、收集速率、剩余heap大小等。可以根据这些数据调整younggeneration、tenuredgeneration的大小来满足系统要求。下面的flag用于控制这些统计数据是否输出,默认为on,-XX:+UseAdaptiveSizePolicy25Throughputcollector(4)SelftuningbyThroughputcollector–-XX:+AggressiveHeap自检物理机器的内存、CPU数,然后自行调整一些参数,以优化那些长期运行、大量内存分配需求的任务。这个flag比较适合那些大内存、多CPU的系统,–使用AggressiveHeap,必须保证物理内存256M,初始化的heap大小依赖于物理内存的大小。后续内存的使用,会尽可能多的使用物理内存(i.e.,itattempttouseheapsnearlyaslargeasthetotalphysicalmemory)。26Throughputcollector(5)Possibleshortcomings–因为多线程参与minor收集,每个线程都保留一部分tenuredgeneration,用于复制
本文标题:JVM垃圾回收原理GC
链接地址:https://www.777doc.com/doc-3185562 .html