쓰레기 수집가 스트레스

누군가가 다음과 같이 말하는 것을 들어본 적이 있습니까?

don't stress the garbage collector



???

하지만, 무슨 뜻인가요?

Node.js Garbage Collector의 이론은 웹에서 광범위하게 설명되었습니다. this article이 제일 좋은 것 같아요.

그러나 여기에 실용적인 설명이 있습니다!

다음 간단한 코드로 새stress.js 파일을 만듭니다.

function doSomeThing () {
  const s = `${'a'.repeat(10e6)}-${'v'.repeat(10e6)}`
  return s
}

setInterval(doSomeThing, 10)

node --trace-gc stress.js로 실행

다음과 같은 끝없는 출력이 표시됩니다.

[8904:0000018D2126F130]       39 ms: Scavenge 2.1 (3.3) -> 1.7 (4.3) MB, 1.5 / 0.0 ms  (average mu = 1.000, current mu = 1.000) allocation failure 
[8904:0000018D2126F130]     1302 ms: Scavenge 2.4 (4.8) -> 2.0 (4.8) MB, 6.2 / 0.0 ms  (average mu = 1.000, current mu = 1.000) allocation failure 
[8904:0000018D2126F130]     5992 ms: Scavenge 2.9 (4.8) -> 2.0 (5.3) MB, 2.2 / 0.0 ms  (average mu = 1.000, current mu = 1.000) allocation failure 
[8904:0000018D2126F130]    10989 ms: Scavenge 3.0 (5.3) -> 2.0 (5.3) MB, 0.2 / 0.0 ms  (average mu = 1.000, current mu = 1.000) allocation failure 
[8904:0000018D2126F130]    14104 ms: Mark-sweep 2.6 (5.3) -> 1.6 (4.3) MB, 4.2 / 0.0 ms  (+ 0.1 ms in 2 steps since start of marking, biggest step 0.1 ms, walltime since start of marking 10 ms) (average mu = 1.000, current mu = 1.000) finalize incremental marking via task GC in old space requested
[8904:0000018D2126F130]    14730 ms: Mark-sweep 1.7 (4.3) -> 1.6 (4.3) MB, 0.5 / 0.0 ms  (+ 0.5 ms in 4 steps since start of marking, biggest step 0.3 ms, walltime since start of marking 23 ms) (average mu = 0.998, current mu = 0.998) finalize incremental marking via task GC in old space requested
[8904:0000018D2126F130]    20152 ms: Scavenge 2.6 (4.3) -> 1.6 (4.3) MB, 0.2 / 0.0 ms  (average mu = 0.998, current mu = 0.998) allocation failure
...


Garbage Collect Scavenge 프로세스는 ~5초마다 여러 번 실행됩니다! 영원히!!

후드 아래에서 무슨 일이 일어나고 있습니까?
  • 큰 문자열s이 할당되어 New Space
  • 에 추가됩니다.
  • s 문자열이 해제됨
  • 새로운 큰 문자열s이 할당되고 새 공간
  • 에 추가됩니다.
  • s 문자열이 해제됨
  • 또 다른 새로운 큰 문자열s이 할당되고 새 공간
  • 에 추가됩니다.
  • s 문자열이 해제됨
  • 힙 "새 공간"이 가득 차서 가비지 수집기 청소 단계가 시작되고 모든 할당s을 정리합니다
  • .
  • 처음부터 다시 시작

  • 이제 상위 범위에서 s 변수를 이동하는 스크립트를 수정하고 변경된 파일node --trace-gc no-stress.js을 실행합니다.

    const s = `${'a'.repeat(10e6)}-${'v'.repeat(10e6)}`
    function doSomeThing () {
      return s
    }
    
    setInterval(doSomeThing, 10)
    


    출력이 완전히 다릅니다.
  • Scavange
  • 에 2번만 통화
  • 막스위프 2개만

  • 15분 만에!!

    [16388:000002874922BD50]       33 ms: Scavenge 2.1 (3.3) -> 1.7 (4.3) MB, 1.2 / 0.0 ms  (average mu = 1.000, current mu = 1.000) allocation failure 
    [16388:000002874922BD50]     9338 ms: Scavenge 2.4 (4.8) -> 2.0 (4.8) MB, 4.7 / 0.0 ms  (average mu = 1.000, current mu = 1.000) allocation failure 
    [16388:000002874922BD50]    18877 ms: Mark-sweep 2.2 (4.8) -> 1.6 (4.8) MB, 3.6 / 0.0 ms  (+ 0.8 ms in 3 steps since start of marking, biggest step 0.7 ms, walltime since start of marking 17 ms) (average mu = 1.000, current mu = 1.000) finalize incremental marking via task GC in old space requested
    [16388:000002874922BD50]    19484 ms: Mark-sweep 1.6 (4.8) -> 1.6 (5.3) MB, 1.7 / 0.0 ms  (+ 1.1 ms in 2 steps since start of marking, biggest step 1.1 ms, walltime since start of marking 3 ms) (average mu = 0.995, current mu = 0.995) finalize incremental marking via task GC in old space requested
    


    후드 아래에서 무슨 일이 일어나고 있습니까?
  • 큰 문자열s이 할당되어 힙 공간
  • 에 추가됩니다.
  • s 스트링은 Scavange의 2대까지 살아남아 Old Space로 간다
  • 가비지 컬렉터에 대한 스트레스는 이제 그만!

  • 즉, RegExp!

    따라서 Garbage Collector를 스트레스 받지 마십시오!

    좋은 웹페이지 즐겨찾기