欢迎来到天天文库
浏览记录
ID:20792769
大小:880.50 KB
页数:42页
时间:2018-10-15
《java垃圾收集》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、JAVA垃圾收集原理@gongyinflydreamgy@gmail.com“Garbagecollection(GC)isaformofautomaticmemorymanagement.Thegarbagecollector,orjustcollector,attemptstoreclaimgarbage,ormemoryoccupiedbyobjectsthatarenolongerinusebytheprogram”-Wikipedia自动内存管理年代还有必要学习和了解GC?垃圾收集器做
2、什么?释放非存活对象占据的内存空间管理内存,决定了内存分配机制垃圾收集器如何做?检测出垃圾对象直接方式:引用计数间接方式:追踪对象引用图回收垃圾对象所占用的内存空间直接清除压缩拷贝必须决定什么时候进行回收垃圾算法的基本要求必须是安全的,存活数据不能被错误回收应该是全面的,垃圾对象会在固定的收集周期被回收应该有合理的开销,时间/空间/运行频率尽可能少的内存碎片应该是可扩展的,不会成为可扩展瓶颈常用的GC算法和策略引用计数器(渐进式)标记-清扫垃圾收集节点复制垃圾收集标记-缩并垃圾收集分代垃圾收集并发
3、垃圾收集分布式垃圾收集自适应动态垃圾收集引用计数器Pros实现简单,能快速判断对象是否在使用交织在程序中执行,不会挂起应用Cons无法处理循环引用给程序执行带来额外的开销与用户程序紧密的耦合标记-清扫算法Pros非常自然的处理环形结构操纵指针没有额外的开销Cons停止-启动算法,STW问题内存碎片问题渐进复杂度正比与堆的大小节点复制算法Scavenger清道夫,从垃圾中捡起有价值的并带走Pros所有存活的数据都缩并的排列在一起无内存碎片,能够高效的分配对象Cons使用两个半区,存储容量加倍重复拷贝
4、性能随着内存占用率提高而下降,复杂度正比于存活数据结构的大小,而不是堆的大小标记-缩并算法缩并方式任意的/线性的/滑动的Pros不需要占用额外空间Cons缩并带来性能损失渐进复杂度类似与节点复制算法分代式垃圾收集器Weakgenerationalhypothesis理论大部分对象都是短暂的,生命周期很短只有很少的长生命对象会引用短生命对象把工作集中在回收最有可能是垃圾的对象上Pros不同的分代可以使用不同的算法和不同的搜集频率,能减少垃圾收集的整体开销Cons如果根集合巨大分代间引用以及占位垃圾问
5、题分代式垃圾收集器需要合理设置提升策略和提升阀值提升太快MajorGC占位垃圾和庇护现象程序的局部性有负面影响,工作集稀疏增大写拦截器的开销自适应提升策略在缩短中断时间和占位垃圾之间进行折衷调度策略隐藏在用户最不注意到时刻最多垃圾时触发渐进式和并发收集器三色标记已访问需重访问未访问Pros大幅缩短垃圾收集带来的中断时间Cons吞吐量,垃圾收集总耗时上升“多个读,多个写”一致性问题,需要和用户程序同步,漂浮垃圾问题需提前进行收集,可能并发收集失败自适应垃圾收集算法监视服务器和应用情况,自动调整和
6、选择合适的收集算法JAVA中的EronomicJava基于分代策略每个分代可以使用不同的垃圾收集器Java基于分代垃圾收集策略Java中如何检测垃圾对象的?找到GCRoot集合本地变量和局部变量引用的对象方法区中类静态属性引用的对象方法区中常量引用的对象本地方法栈中JNI所引用的对象跨分区引用的对象,分代间引用引用对象被提升被重新赋值指向新生分代对象Java中如何检测垃圾对象的?写拦截器Write-barrierDirtyCardJVM维护一个dirtycards表每512byte内存页关联到一个
7、dirtycard内存页发生变化,则标记dirtypageGC完成,重设dirtycardSnapshot-at-the-beginning(SATB)G1Java中如何检测垃圾对象的?根据对象存活状态(Reachable)标记出垃圾对象强引用软引用(SoftReference)-XX:SoftRefLRUPolicyMSPerMB弱引用(WeakReference)可复活对象被finalize方法复活(需两遍扫描)虚引用(PhantomReference)对象被回收时得到系统通知Referenc
8、eQueue不可达对象垃圾清扫阶段释放被占用的垃圾非压缩,直接释放清道夫复制滑动缩并新对象分配直接分配在新生代Eden或TLABTLABthreadlocalallocationblock-XX:+PrintTLAB-XX:+UseTLAB-XX:+ResizeTLAB-XX:TLABSize=-XX:MinTLABSize=大对象和大数组直接分派在旧生代-XX:PretenureSizeThreshold=n如果对象大于Eden大小堆外分配DirectBy
此文档下载收益归作者所有