作者回复: 思路非常清晰,赞👍
作者回复: 我希望更给大家的,既能有鱼,先填饱肚子解决手上的问题,然后还能有渔,学到捕鱼的技能,受用终生。
作者回复: A1: 标记阶段需要暂停,清除阶段一般是不需要的。
A2:这个问题有点复杂,你可以参考一下:https://stackoverflow.com/questions/16558746/what-mechanism-jvm-use-to-block-threads-during-stop-the-world-pause
A3:对于GC来说只有一个房间,你是没有办法分成多个完全独立的小房间的。 像java中的young gc就是为了缓解这个问题,而产生的变种算法,它可以减少FullGC的次数,但没有办法完全避免FullGC。
A4:内存是按页为单位管理的,也就是一块一块的,对于JVM来说,它有一套复杂的数据结构来记录它管理的所有页面与对象引用之间的关系。所谓清除和移动对象,就是修改这个记录关系的数据结构。
作者回复: 是这样的。
作者回复: 那能否用本节课中学到的一些内存管理的方法来解决呢?
作者回复: 这个问题比较复杂,没有统一的答案,在不同的编程语言中处理都不太一样。
一般面向对象的语言,比如Java这种,对象的属性如果是基本类型,它的内存空间会随着对象的创建就占用上了。如果属性也是一个对象,什么时候真正去申请内存,取决于你的代码中是在什么时候new出这个属性对象的。