15、GC垃圾回收机制
GC的作用区只有方法区和堆。分类有轻GC和重GC,轻GC主要是新生代,重GC是全局的清理。
幸存区一个from,一个to。两个相互转换。即幸存区0可以是from,也可以是to,幸存区1可以是from,也可以是to。
GC题目:
JVM的内存模型和分区,详细到每个区放什么?
堆里面的分区有哪些,Eden,from,to,老年区,说说他们的特点!
GC的算法有哪些?标记清除法,标记压缩,复制算法,引用计数器,怎么用的?
轻GC和重GC分别在什么时候发生。
GC算法:
-
引用计数法,每个对象有被用的次数的统计,当次数为0时,就清除出去了。但是计数器本身也有消耗,并且碰到有些死循环,就会一直计数出不来。现在一般不采用此方法。

-
复制算法,空的始终都是to。当幸存0和幸存1区都有一个的话,就把其中一个复制到另一个,这样,有两个对象的就是from,空的就为to。要是把from中的两个复制到to中,那么to就变成了from,from就变成了to。

图示

每次垃圾清理完之后,伊甸园区空,to区空了。其中的对象等到15次后,进入到养老区。

复制算法好处:没有内存的碎片;坏处,浪费一个幸存区空间,多了一半空间永远是空to。假设对象100%存活,复制成本很高。
最佳使用场景:对象存活度较低的时候,即在新生区中用复制算法。
-
标记清除算法
回收垃圾时,扫描这些对象,对活着的对象进行标记。清除的时候,对没标记的清除掉。

优点:不需要额外的空间。
缺点:两次扫描,严重浪费时间,会产生内存碎片(对象存储的时候用hash,找内存也需要时间成本,对象位置很散乱)
弹幕说可达性分析。
-
标记压缩法

也可以先标记+清除几次之后,再进行一次压缩。
-
GC算法总结
内存效率:复制算法 > 标记清除算法 > 标记压缩算法 (时间复杂度 )
内存整齐度:复制算法 = 标记压缩算法 > 标记清除算法
内存利用率:标记压缩算法 = 标记清除算法 > 复制算法
最优算法:没有最好,只有最合适的算法。GC:不同位置有不同的垃圾收集算法
年轻代,年轻区:存活率低,使用复制算法。
老年代,老年区:区域大,存活率高,使用标记清除+标记压缩混合实现
所谓的JVM调优就是在调这些东西,根据实际情况,标记清除算法导致的内存碎片不是太多的情况就继续标记清除,直到最后碎片太多到达一定就标记压缩。
后续学习可以百度GC分代收集算法,不同区域(代)用不同GC算法。
一天时间学习JVM,不现实,多花时间看面试题,《深入理解JVM》,但是可以理解JVM的学习方法。
16、JMM
-
什么是JMM?java memory model - java内存模型
-
干嘛的?官方百科,博客,对应的视频。
作用:缓存一致性协议,


上述定义的理解:见下图。主内存的一个数,在各个线程中都拷贝了一份。

解决共享对象可见性的问题:用volilate。

-
怎么学习?
JMM是抽象的概念,理论,那么看到多次volatile,所以学习volatile。再看看其他人的博客,又提到了可见性,写完了代码,立马刷新进主内存。volatile保证可见性,不保证原子性。

再搜JMM面试题答案
18、总结
学习新东西是常态 netty,spring cloud alibaba
面试回来,要分析面试题,要触类旁通这些题-百度面试题,将10道题变成100道题,总结出两三套解题思路。
通过大量的面试总结,得到一套解题思路
拿到一个新的面试知识点,就像JMM一样去准备面试:是什么,干嘛的,怎么学习
本文介绍了Java的GC(垃圾回收)机制,包括GC的作用区、新生代和老年代的分区、复制算法、标记清除和标记压缩等。强调了不同GC算法的适用场景和优缺点,以及轻GC和重GC的发生时机。此外,还讨论了Java内存模型(JMM)的作用,如解决共享对象可见性问题,以及volatile关键字的应用。JVM调优涉及选择合适的GC算法以适应不同内存区域的需求。
351

被折叠的 条评论
为什么被折叠?



