本人近期在学习Java的的中GC的相关知识,此笔记为学习笔记,如有错误请批评指正:

    GC在的的Java中的对象是堆空间和永久区,GC中的算法主要是有四种:引用计数法,标记清除,标记压缩,复制算法

引用计数法:这种算法是比较老了,这是通过引用来进行垃圾的回收其实这种算法说起来比较简单,即:对于一个对象,如果有任何的一个其他的对象引用到它,那么就进行加一操作,当这个引用失效后就进行减一操作,当一个的引用的累计数值最终为0的时候,这个对象就将不在被使用。

引用计数法中的问题是:引用和被引用涉及到加法减法,这会影响性能,另外一个就是很难处理循环的引用的情况。

标记清除法:标记清除法是现在垃圾回收算法的基础,此方法包括两个步骤:标记和清除首先标记是指从根节点出发的所有可达的对象进行标记,没有标记的对象就是垃圾对象,然后当进入到清除阶段的时候回收的就是这些没有被标记的对象。

标记压缩法:标记压缩法用于存活的对象相对较多的场合,比如是老年代这种算法是在标记清除的算法的基础上上进行了优化处理,也是从根节点开始对可达对象进行标记,但是只有不是立即清除,而是对标记的对象进行压缩到内存的另外一侧,对外边界的对象进行清理。

复制算法:复制算法与标记清除算法相比来说是一种效率比较高的垃圾回收算法,但是这个算法不适用于存活对象较多的场合比如老年代,算法是将原来的内存空间分为两块,每次就适用其中的一块,在执行垃圾回收的时候,将正在使用的一块中的内存中存活的对象复制到另外一块内存中,然后清除正在使用的的那一块内存中的所有的对象。这两块内存切换,达到垃圾回收的目的。这种算法有个问题很明显就是会浪费一半的内存空间。

    根据对象中的存活周期进行分类的话,短命的对象归结到新生代,长命的对象归结到老年代所以根据对象属于不同的代进行选择合适的算法:当为少量的存活的对象的时候这个时候使用的是复制算法,可以提高执行的效率减少空间浪费,当为老年代的时候,此时有大量的对象存活,选择标记压缩法或者标记清除法

    STOP-TEH-WORLD现象

    停止这世界现象是Java的的中的一种全局暂停现象,何为全局暂停:所有的Java的的代码停止执行,本地方法可以运行,但是不能与JVM进行交互。

    这种现象多数是由于GC的回收有关,转储线程,死锁检查以及堆转储。这个GC就像是清理员打扫卫生一样,如果不停止扔垃圾,那么永远清理不干净,所以在清理的时候需要暂停“扔垃圾”的行为,这就会导致停止的世界现象。

    这种现象的危害就是,长时间的暂停没有响应会导致程序异常,还有在生产环境中,可能会导致主备切换,导致生产数据有误。