4.1 并发(Concurrent)

  • 在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理器上运行。
  • 并发不是真正意义上的“同时进行”,只是CPU把一个时间段划分成几个时间片段(时间区间),然后在这几个时间区间之间来回切换,由于CPU处理的速度非常快,只要时间间隔处理得当,即可让用户感觉是多个应用程序同时在进行

image.png

4.2 并行(Parallel)

  • 当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,我们称之为并行(Parallel)。
  • 其实决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。
  • 适合科学计算,后台处理等弱交互场景

image.png

4.3 并发 vs 并行

  • 并发,指的是多个事情,在同一时间段内同时发生了。
  • 并行,指的是多个事情,在同一时间点上同时发生了。
  • 并发的多个任务之间是互相抢占资源的。
  • 并行的多个任务之间是不互相抢占资源的。
  • 只有在多CPU或者一个CPU多核的情况中,才会发生并行。否则,看似同时发生的事情,其实都是并发执行的

    4.4 垃圾回收的并发与并行

    并发和并行,在谈论垃圾收集器的上下文语境中,它们可以解释如下:

  • 并行(Parallel):指多条垃圾收集线程并行工作,但此时用户线程仍处于等待状态。

√ 如 Pardew、Parallel Scavenge、Parallel Old。

  • 串行( Serial)

√ 相较于并行的概念,单线程执行。
√ 如果内存不够,则程序暂停,启动JVM垃圾回收器进行垃圾回收。回收完,再启动程序的线程。
image.png

  • 并发( Concurrent): 指用户线程与垃圾收集线程同时执行(但不一定是并行的,可能会交替执行),垃圾回收线程在执行时不会停顿用户程序的运行。

√ 用户程序在继续运行,而垃圾收集程序线程运行于另一个CPU上;
√ 如:CMS、G1
image.png

5. 安全点与安全区域

5.1 安全点(Safepint)的概述

  • 程序执行时并非在所有地方都能停顿下来开始GC,只有在特定的位置才能停顿下来开始GC,这些位置称为“安全点( Safepoint)”。
  • Safe point的选择很重要,如果太少可能导致GC等待的时间太长,如果太频繁可能导致运行时的性能问题。大部分指令的执行时间都非常短暂,通常会根据“是否具有让程序长时间执行的特征”为标准。比如:选择些执行时间较长的指令作为 Safe Point,如方法调用、循环跳转和异常跳转等。

如何在GC发生时,检査所有线程都跑到最近的安全点停顿下来呢?

  • 抢先式中断:(目前没有虚拟机采用了)

首先中断所有线程。如果还有线程不在安全点,就恢复线程,让线程跑到安全点。

  • 主动式中断:

设置一个中断标志,各个线程运行到 Safe Point的时候主动轮询这个标志如果中断标志为真,则将自己进行中断挂起。

5.2 安全区域(Safe Region)

  • Safepoint机制保证了程序执行时,在不太长的时间内就会遇到可进入GC的 Safepoint。但是,程序“不执行”的时候呢?例如线程处于 Sleep状态或 Blocked状态,这时候线程无法响应JVW的中断请求,“走”到安全点去中断挂起,JVM也不太可能等待线程被唤醒。对于这种情况,就需要安全区域( Safe Region)来解决。
  • 安全区域是指在一段代码片段中,对象的引用关系不会发生变化,在这个区域中的任何位置开始GC都是安全的。我们也可以把 Safe Region看做是被扩展了的 Safepoint

实际执行时:
1、当线程运行到 Safe region的代码时,首先标识已经进入了 Safe Region如果这段时间内发生GC,JVM会忽略标识为 Safe region状态的线程;
2、当线程即将离开 Safe Region时,会检查JVM是否已经完成GC,如果完成了,则继续运行,否则线程必须等待直到收到可以安全离开 Safe Region的信号为止;