最近在最大的同性交友网站,找到了一个比较好的jvm教程。地址是这个https://github.com/visualizit/vpoc 。我把它下载下来看了一下源代码。
前后端的通讯使用的是websock,后端是springboot +websockt stomp
前端是websocket js .大家可以下载代码看看。
我们下载项目跑起来
上面的垃圾回收算法,有三个,我们来看第一个默认的年轻代标记复制算法。
我们先来运行一下看一下动画效果。
我们看到年轻代分为伊甸园区,幸存者0区,幸存者1 区。
这时候我们看一下代码中jvm 的配置
最大对象包括年轻代和老年代=300,
幸存者和伊甸园的比例是1:8,
老年代和年轻代的比例是1:2
由此我们可以得出
伊甸园80
幸存者0:10
幸存者1:10
老年代:200
从图上伊甸园的格子8X10 我们也能看出和我们的猜想是一样的。
首先伊甸园的格子数值是对象的编号,下面幸存者0 和1区的 格子里面有两个数值,第二个是年龄。也就是被回收一次,年龄加一,超过最大年龄就送到老年代。 默认是15 ,现在是3.
我们再接着往下面跑。
我们看到对象,从su0 到su1 , 并且38 号对象被回收两次。所以他的年龄就是2
我们再跑一下
这时候我们再看到38号对象年龄达到了三次,进入了老年代。
因为上一次的144,82,135 在新的一小gc 的时候没有被引用,直接被清理了。所以他们就消失了,只要多次被引用的才会在so-s1 相互复制,最后到old 去。 这个引用关系有两种,可达性算法,和引用计数法。这里就不多说了,大家自己回去看看书吧。
今天的标记复制算法就说到这里了, 记住标记复制算法主要发生在年轻代,因为年轻代的对象多,产生的快。使用标记复制算法最大可用90%的空间。
一个伊甸园区加上幸存者区, 但是这个需要老年代的分配担保。
要是伊甸园区不够,全部进入老年代就直接引发fullgc .
总之jvm 还是挺有趣的,为了方便大家学习,我搞了一个在线的,公众号回复jvm就行。欢迎点赞,转发,收藏。