찾다

 >  Q&A  >  본문

java - Full Gc过程会发生stop the world,这里jvm是怎么处理的呢?【面试题】

在不采用cms垃圾收集器或者在cms垃圾收集器初始标记和重新标记阶段,都会发生stop the world,也就是会暂停用户线程的执行,jvm是如何暂停所有用户线程的?烦请知道的朋友帮忙解答一下~
在实际场景中,可能gc的时间很短,但是暂停所有用户线程会用去很大一部分时间,这个时间又是如何得知的呢?

迷茫迷茫2889일 전933

모든 응답(4)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 10:07:31

    JVM에는 "안전 지점"과 "안전 구역"이라는 것이 있습니다. GC가 발생하면 모든 스레드가 "안전 지점"까지 실행되고 중지됩니다.
    GC가 필요한 경우 JVM은 스레드가 안전한 지점에 도달하면 플래그를 설정하고 이 플래그를 폴링하여 감지합니다. GC가 필요한 경우 스레드는 자체적으로 일시 중지되고 실행을 재개하지 않습니다. GC가 완료될 때까지.

    또 다른 전략은 GC가 발생할 때 모든 스레드를 직접 일시 중단한 다음 모든 스레드가 안전한 지점에 있는지 여부를 감지하고 스레드 실행을 재개하고 실행이 특정 지점에 도달할 때까지 기다리는 것입니다. 정지 전 안전 지점.

    그러나 CPU 시간을 얻지 못했거나 얻을 수 없는 일부 스레드의 경우 안전 지점에 도달할 때까지 기다릴 방법이 없으므로 이때 스레드가 안전 영역에 있는 한 GC도 가능합니다. 안전 영역은 코드 조각이므로 이 코드 세그먼트에 있는 개체의 참조 관계는 변경되지 않으므로 이때 GC를 수행하는 것이 안전합니다.

    회신하다
    0
  • PHP中文网

    PHP中文网2017-04-18 10:07:31

    스레드를 안전하게 일시정지하는 Java 방식은 안정적이지 않습니다. Full GC 중에는 기본 방식을 사용해야 한다고 생각합니다.
    주의를 기울이고 배우세요. .

    회신하다
    0
  • 怪我咯

    怪我咯2017-04-18 10:07:31

    전체 gc를 피하고 대규모 배열의 사용을 줄이세요.

    회신하다
    0
  • 迷茫

    迷茫2017-04-18 10:07:31

    GC는 자주 발생하지 않으며 메모리가 부족한 경우에만 발생하므로(물론 절대적인 것은 아닙니다) Stop World는 자주 발생하지 않으므로 사용자 스레드에 영향을 미치지 않습니다. 사용자 스레드는 안전 지대에서 세상을 멈추려면 모든 스레드가 안전 지대에 있을 때까지 기다려야 합니다. 일부 장기 작업은 안전 지대에 도달하는 데 오랜 시간이 걸릴 수 있습니다. 이는 세계가 GC 자체보다 오래 기다릴 수 있음을 의미하며, 이 문제를 해결하는 방법은 안전 영역을 합리적으로 설정하는 것입니다. 루프가 완료된 후에만 일시 중지합니다. 보안 영역의 구체적인 설정은 JVM 제조사의 결정에 따릅니다

    회신하다
    0
  • 취소회신하다