欢迎来到天天文库
浏览记录
ID:30838415
大小:122.52 KB
页数:8页
时间:2019-01-04
《源码分析hotspotgc过程(上)-编程开发技术》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、源码分析HotSpotGC过程(上)■编程开发技术源码分析HotSpotGC过程(上)原文出处:iceAeterna对于HotSpot虚拟机垃圾回收过程,这里将分析介绍默认配置下MarkSwccpPolicy的DefNewGcncration和TcnurcdGcncration的垃圾回收内容以及介绍其他GC策略和代实现的GC思想。GC的过程姑月.简单地分为内存代实现无关的GC过程和内存代GC过程。木文将先进行内存代实现无关的GC过程分析,内存代GC过程将在后面进行分析。从GenCollectedlleap的do_collection()说起:1•在GCZ前有许多必要的检查和统计任务,
2、比如对回收内存代的统计、堆内存大小的统计等,注意本节内容将不再去分析一些性能统计的内容,有兴趣的可自行分析。(1)・检查是否已经GC锁是否已经激活,并设置需要进行GC的标志为true,这时,通过is_active_and_needs_gc()就可以判断是否己经有线程触发了GC。if(GC_lockcr::chcck_activc_bcforc_gc()){return;//GCisdisabled(e.g・JN1GetXXXCriticaloperation)(2).检查是否需要冋收所有的软引用。constbooldo_clear_all_soft_refs=clear_all_so
3、ft_refscollectorpolicy()->should_clear_all_soft_refs();(3).记录永久代已经使用的内存空间大小。constsize_tpermprevused二permgen()->used();(4).确定冋收类型是否是FullGC以及gc触发类型(GC/FullGC(system)/FullGC,用作Log输出)。boolcomplete=full&&(max_level==(n_gens()T));constchar*gccausestr=〃GC“;if(complete){GCCause::Causecause二gc_cause();i
4、f(cause==GCCause::_java_lang_systcm_gc){gc_cause_str="FullGC(System)“;}else{gccausestr二"FullGC〃;(1)•gc计数加1操作(包括总GC计数和FullGC计数)。increment_total_col1ections(complete);(2)•统计堆已被使用的空间大小。sizetgchprevused=used();(3).如果是FullGC,那么从最高的内存代到最低的内存代,若某个内存代不希望对比其更低的内存代进行单独冋收,那么就以该内存代作为GC的起始内存代。这里说明下什么是单-独冋收。
5、新牛代比如DefNewGeneration的实现将对新牛代使用复制算法进行垃圾回收,而老年代TenuredGeneration的垃圾回收则会使用其标记-压缩-清理算法对新生代也进行处理。所以可以说DcfNcwGencration的垃圾回收是对新生代进行单独回收,而TenuredGeneration的垃圾回收则是对老年代和更低的内存代都进行冋收。intstarting_level二0;if(full){//Searchfortheoldcstgenerationwhichwillcollectallyounger//generations,andstartcollectionloopt
6、here.for(inti=maxlevel;i>=0;i--){if(_gens[i]->full_col1ects_younger_genegations()){starting_level二i;break;}}}2•接下來从GC的起始内存代开始,向最老的内存代进行冋收。(1)•其Hlshould_collectO将根据该内存代GC条件返回是否应该对该内存代进行GC。若当前回收的内存代是最老的内存代,如果本次gc不是FullGC,将调用increment_total_full_collections()修止Z前的FulllGC计数值。intmax_level_collected二
7、starting_level;for(inti二starting_level;i<=max_level;i++){if(_gcns[i]->should_collect(full,size,is_tlab)){if(i==n_gens()-1){//amajorcollectionistohappenif([complete){//Thefull_collectionsincrementwasmissedabove,increment_total_full
此文档下载收益归作者所有