Skip to content

工作线程(例如tomcat线程)一直不停的往堆里面生产对象(生产垃圾),GC线程(垃圾回收线程)一直不停的回收垃圾,这种一边生产垃圾一边回收垃圾对于jvm来说,其实是非常复杂的,现阶段的jvm还无法实现一边生产垃圾一边回收垃圾。

所以在清除垃圾的时候,只能停一边, 即停工作线程,让垃圾回收线程,全心全意回收垃圾,打扫干净后,再让工作线程干活。

stw

什么是安全点?

  1. 从CPU角度解释:CPU上下文切换,从工作线程切换去执行GC线程;此时工作线程保存了线程上下文的全部信息,例如程序计数器保存了下一条字节码指令。
  2. 从线程的角度解释:线程被挂起,如WAIT、BLOCK状态。只有当GC线程执行结束后,工作线程就继续处于running状态。

什么是STW?

Java应用程序所有工作线程就进入了安全点SafePointh后,所有工作线程被挂起,导致java应用程序全局暂停的现象被称为STW.

垃圾回收中的串行、并行与并发

  • 串行回收:指垃圾回收线程执行时,用户线程(执行java代码的线程)处于等等状态。串行回收适合单个CPU或硬件资源较差的服务器,故串行回收默认应用在客户端的Client模式下使用。
  • 并行回收:是多条垃圾回收线程和用户线程分别在不同CPU上同时工作。不过并行回收仍然与串行回收一样采用独占式,使用了"stop-the- World"机制。
  • 并发回收:垃圾收集线程和用户线程交替执行,以尽可能减少应用程序的停顿时间。