由问题引发的疑惑
Java的垃圾回收机制中,gc线程启动后不会阻塞其他线程,判断是否正确!
Java gc机制回顾
常见的gc算法
1.标记-清扫(也有其他的书命名与此不同,此命名来源于《Java编程思想》)
该算法的思路是从堆栈和静态存储区出发,遍历所有的引用,进而找出所有存活的对象。每当找到一个存活的对象,就会给对象设一个标记,这个过程不会回收任何对象。只有全部标记工作完成的时候,清理动作才会开始。清理过程中,会释放没有带标记的存储区域,不进行任何的复制动作。
弊端:由于不进行复制动作,便会使留下的内存空间不是连续的,而当下次需要存放一个比较大(指占用空间大)的数据的时候,便会多触发一次gc操作。
2.停止-复制
该算法与其他的gc算法不同,它不属于后台回收模式,因为它需要停止所有的除gc之外的线程。算法的思路是:准备两块大小相同的存储区,使用的过程中只使用其中之一,然后遍历所有的引用,并将引用所指向的对象复制到另一块存储区中,未被复制的便是需要回收的“垃圾”
弊端:需要两块相同的存储区,内存开销较大,而且执行时会阻塞其他线程。
3.标记-整理
顾名思义,该算法结合了上述两种算法的优势,即在“标记-清扫”算法的清理时,将带有标记的对象向一端移动,最后达到回收和整理的功能。
4.分代收集算法
分代收集算法是目前使用最为广泛的算法。它的核心思想是根据对象存活的生命周期将内存划分为若干个不同的区域。一般情况下将堆区划分为老年代(Tenured Generation)和新生代(Young Generation),老年代的特点是每次垃圾收集时只有少量对象需要被回收,而新生代的特点是每次垃圾回收时都有大量的对象需要被回收,那么就可以根据不同代的特点采取最适合的收集算法。
gc算法总结
现在使用最为广泛的gc算法便是分代收集算法,而早期的sun版本的垃圾回收器使用的是前两种算法,在早期的Sun公司开发的垃圾回收器中,当程序可用内存数量较低时,回收器会暂停运行程序,执行gc算法。但是现在基本已经不再使用阻塞线程的方式来执行垃圾回收,而是让gc线程在后台执行。
结论
严格意义上来讲,开头提出的判断题应该是错的,因为存在某种gc算法会阻塞其他线程;当然,目前使用的gc算法基本不再采用这种方式回收垃圾,所以在某种意义上来说又能说的通!所以对这个题目的结果,要视具体情况而定(感觉自己说了废话呢!不过我持错误的观点)