关于跨代引用和YGC什么的我就解释了,如果描述清楚的话,又要写一大篇,况且网上关于这些概念的解释有很多,我这里只说一下几个我理解错和理解好长时间的地方。
参考文章
Region
Region这个概念,我一直理解错了,看了很多博客,从博主贴的图上理解一直以为一个对象是一个Region,其实不是,Region中可以包含一个或多个对象,Region中的对象类型有Eden,Survivor,Old,Humongous。Humongous是大对象,当Humongous的大小超过Region一半是,使用多个连续的Humongous来盛放。
记忆集和卡表
我一直以为记忆集和卡表是两个东西,并且每个Region都有一个记忆集(RSet)和卡表,然后问了大牛之后才知道,其实RSet就是卡表的实现,卡表是数组,而RSet是HashTable。其实这么说不好理解,我是这么理解的,老年代的Region中不要考虑RSet,只需要记住有一个卡表(也就是数组)就行了;而新生代的Region中有一个RSet(也就是HashTable)。
因为老年代的Region会进行平均分割,分割后的区域都会记录在卡表里;而新生代的RSet是HashTable,key为引用新生代的Region初始内存地址,这里也就是老年代的Region初始内存地址,而value是个数组,数组的值为老年代中卡表的索引,也就是第一个卡的第几个元素
如图,初始地址为A的老年代,引用了新生代的两个对象,在新生代的RSet中,key为A,value为a,b(表示卡表的索引及元素位置);而初始地址为B的老年代,引用了新生代的一个对象,在新生代的RSet中也有相应的记录