赞
踩
当需要排查各种内存溢出、内存泄漏时,当垃圾回收成为系统到达更高并发量的瓶颈时,我们必须对内存动态分配和内存回收技术这样的“自动化”技术采用必要的监控和调节。
Java堆和方法区:一个接口的多个实现类需要的内存可能会不一样,一个方法所执行的不同条件分支所需要的内存也可能不一样,只有处于运行期间,我们才能知道程序究竟会创建哪些对象,创建多少个对象,这部分内存的分配和回收是动态的。
“GC Roots”的根对象作为起始节点集,从这些节点开始,根据引用关系向下搜索,搜索过程所走过的路径称为“引用链”(Reference Chain),如果某个对象到GC Roots间没有任何引用链相连,或者用图论的话来说就是从GC Roots到这个对象不可达时,则证明此对象是不可能再被使用的。
GC Roots:
tips:任何一个对象的finalize()方法都只会被系统自动调用一次
在大量使用反射、动态代理、CGLib等字节码框架,动态生成JSP以及OSGi这类频繁自定义类加载器的场景中,通常都需要Java虚拟机具备类型卸载的能力,以保证不会对方法区造成过大的内存压力。
分代假说:
Minor GC/ Young GC新生代收集
Major GC/Old GC老年代收集,请注意“M ajor GC”这个说法现在有点混淆,在不同资料上常有不同所指,读者需按上下文区分到底是指老年代的收集还是整堆收集。
Mixed GC混合收集:目标是收集整个新生代和部分老年代的垃圾收集,目前只有G1收集器有这钟行为
收集整个Java堆和方法区的垃圾收集。
算法分为“标记”和“清除”两个阶段:首先标记出所有需要回
收的对象,在标记完成后,统一回收掉所有被标记的对象,
也可以反过来,标记存活的对象,统一回收所有未被标记的对象。
“半区复制” 缺点:内存空间浪费大。
新生代中的对象有98%熬不过第一轮收集。因此
并不需要按照1∶1的比例来划分新生代的内存空间。
“Appel式回收”:HotSpot虚拟机默认的Eden : Survivor = 8 : 1 。“逃生门”安全设计
– Survivor空间不足以容纳一次Minor GC之后存活的对象时,需要依赖其他内存区域进行分配担保。即,Survivor空间没有足够空间存放上一次新生代收集下来的存活对象,这些对象便将通过分配担保机制直
接进入老年代。
移动式的垃圾回收算法。
优点:解决了弥散于堆中的存活对象导致的
空间碎片化问题。
缺点:Stop The World 对象移动操作必须全程暂停用户应用程序才能进行。
HotSpot虚拟机里面关注吞吐量的Parallel
Scavenge收集器是基于标记-整理算法的,而关注延迟的CM S收集器则是基于标记-清除算法的。
用户程序强制要求必须执行到达安全点后才能够停顿下来进行垃圾回收
主动式中断
:当垃圾收集需要中断线程的时候,不直接对线程进行操作。设置一个标志位,各个线程在执行的过程中会不断地轮询这个标志,线程发现标志为真时,就会在最近的安全点上中断挂起。解决户线程处于Sleep状态或者Blocked状态时,线程无法响应虚拟机的中断请求,不能再走到安全的地方去中断挂起自己,虚拟机也显然不可能持续等待线程重新被激活分配处理器时间的问题。
跨代引用的问题
抽象
数据结构-XX: +UseCondCardMark 决定是否开启卡表更新的条件判断
写屏障可以看作在虚拟机层面对“引用类型字段赋值”这个动作的AOP切面
写后屏障更新卡表
对象消失问题
:把原本存活的对象错误标记成已消亡。
图3-6展示了七种作用于不同分代的收集器,如果两个收集器之间存在连线,就说明它们可以搭配使用
图中收集器所处的区域,则表示它是属于新生代收集器抑或是老年代收集器。
Serial收集器:它进行垃圾收集时,必须暂停其他所有工作线程,直到它收集结束。HotSpot虚拟机运行在客户端模式下的默认新生代收集器。简单而高效、内存消耗最小、没有线程交互的开销,专心做垃圾收集自然可以获得最高的单线程收集效率。
ParNew erial收集器的多线程并行版本, 加粗除了Serial收集器外,目前只有它能与CMS收集器配合工作。
可以使用-XX:ParallelGCThreads参数来限制垃圾收集的线程数
Parallel Scavenge收集器“吞吐量优先收集器” CM S等收集器的关注点是尽可能地缩短垃圾收集时用户线程的停顿时间,而Parallel Scavenge收集器的目标则是达到一个可控制的吞吐量。而高吞吐量则可以最高效率地利用处理器资源,尽快完成程序的运算任务,主要适合在后台运算而不需要太多交互的分析任务。控制最大垃圾收集停顿时间的-XX:M axGCPauseM illis参数以及直接设置吞吐量大小的-XX:GCTimeRatio参数。
Serial Old是Serial收集器的老年代版本
Parallel Old是Parallel Scavenge收集器的老年代版本,支持多线程并发收集,基于标记-整理算法实现。“吞吐量优先”收集器终于有了比较名副其实的搭配组合,在注重吞吐量或者处理器资源较为稀缺的场合,都可以优先考虑Parallel Scavenge加Parallel Old收集器这个组合。
CMS
Concurrent M ark Sweep [标记-清除算法]目标:获取最短回收停顿时间
浮动垃圾: 出现在标记过程结束以后的垃圾对象。CM S无法在当次收集中处理掉它们,只好留待下一次垃圾收集
时再清理掉。
由于在垃圾收集阶段用户线程还需要持续运行,CM S收集器不能像其他收集器那样等待到老年代几乎完全被填满了再进行收集,必须预留一部分空间供并发收集时的程序运作使用。
要是CM S运行期间预留的内存无法满足程序分配新对象的需要,就会出现一次“并发失败”,这时候虚拟机将不得不启动后备预案:冻结用户线程的执行,临时启用Serial Old收集器来重新进行老年代的垃圾收集。
Garbage First
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。