(综合网上各类回答总结)
java的一大特色,也是区别于c/c++的(此部分可重点参考《深入理解JVM》)
何时?对何物?做何事?(1.新生代、老年代结构,minor gc/full gc 等触发条件,OOM;2.从gc root搜索不到,且经历第一次标记、清理后仍未复活的对象3、腾出内存,停止其他线程,运行finalize,新生代复制,碎片清理……)
GC root(一组活跃的引用)。Tracing GC的根本思路就是:给定一个集合的引用作为根出发,通过引用关系遍历对象图,能被遍历到的(可到达的)对象就被判定为存活,其余对象(也就是没有被遍历到的)就自然被判定为死亡。
注意再注意:tracing GC的本质是通过找出所有活对象来把其余空间认定为“无用”,而不是找出所有死掉的对象并回收它们占用的空间。
对传统的、基本的GC实现来说,由于它们在GC的整个工作过程中都要“stop-the-world”,如果能想办法缩短GC一次工作的时间长度就是件重要的事情。如果说收集整个GC堆耗时太长,那不如只收集其中的一部分?
于是就有好几种不同的划分(partition)GC堆的方式来实现部分收集,而分代式GC就是这其中的一个思路。
这个思路所基于的基本假设大家都很熟悉了:weak generational hypothesis——大部分对象的生命期很短(die young),而没有die young的对象则很可能会存活很长时间(live long)。(并发GC:应用在分配,GC在收集)
强制垃圾回收:
1.System.gc()
2.Runtime.getRuntime().gc()
对象的强、软、弱、虚引用