NextObjPrt现在也正常的指向了bytes的后面
监测点8
数据确实在里面被改动了,而且bytesStart bytesThen也的确处于G1
监测点9
这次回收除了a1 其他的bytesStart bytesThen bytes ,应该都会被回收
之前放着bytesStart bytesThen bytes 指针的内存 数据已经被覆盖了,现在他们都被移动到另外一块内存
而a1 现在应该由g1提升到了g2
之前存放a1指针的地址也全部被覆盖了,在内存里搜索到4块新内存,其中一块还与前面的bytesStart bytesThen 新指针放在一起
虽然现在NextObjPrt 现在不为0 ,但也明显被重置了 (因为打印的缘故,GC后马上创建了新的对象)
也很明显,并没有覆盖前面的内存,而是直接指向了后面的内存
现在来看刚刚被认为是标记GC后下一次分配内存的地址的的内存块,现在的地址02488A88,这个地址也十分合理,正好在两次NextObjPrt 的中间
标识这个地址的确是标记GC后 新NextObjPrt的初始值
监测结束
跳出RunTest,马上就执行了一次完全的GC
上面写的比较杂乱,虽然很对东西还是没有弄明白也没有发现什么规律,不过至少可以得到下面的一些结果
1:证明了NextObjPrt 的存在,也了解他的基本行为(其结构后面数据可能还包含G0阈值等其他数据)
2:GC回收使用的标记方法的确是根搜索
3:被回收的内存不会被擦除,只是通过移动NextObjPrt标记下一个内存能被分配的位置
4:对象从G0移动到G1,内存本身不会移动(可能记录对象的指针的表会有相应更新)
5:不是每次回收都会压缩内存,大部分时间都维持原有结构
6:对象在内存中的存储细节