유영균
30
2022-01-12 20:43:53 작성 2022-01-12 20:53:31 수정됨
4
172

자바 GC를 사용함으로써 성능향상이 되는 경우가 있을까요?


자바는 어떻게 보면 GC가 있어서 장점이기도 하고 단점이기도 한데 

제 의견으로는 GC가 자바를 사용하면서 이점이 될 수도 있겠지만 단점이 더 크다고 생각했습니다.

그래서 GC에 관련된 면접 질문을 받았었는데 차라리 개발자가 직접 메모리를 풀어주는 작업을 추가하든가 아니면 C++처럼 destructor를 만들어줬으면 좋았겠다고 했습니다. 이유는 개발자가 직접적으로 언제 GC가 이루어질 지 모른다는 점에서였죠. 프로그래밍하면서 개발자가 언제 실행될지 모르는 것에 대해 경계해야 한다고 들은 적이 있거든요


그리고 이어서 이런 질문을 받게 됩니다

"그럼 자바 GC를 사용함으로써 성능향상이 되는 경우가 없나요? GC를 사용함으로써 성능향상이 되는 경우는 어떤 경우일까요?"

저는 일단 없다고 했습니다. 일단 GC가 있는 것 자체가 성능에 어느 정도 해가 있는 것이고 이것은 STW 때문에 어쨌든 GC가 없는 것보다 성능이 좋아질 수 없다고 했습니다.(메모리 잘 풀어준다는 가정하에) 지금 현재 GC도 계속 업데이트가 되고 있는데 어떻게 보면 이 STW를 줄이는 방향으로 나아가고 있는 것 같습니다.


하지만 이건 어디까지나 제 의견일 뿐이죠. 위 질문에 대한 어떤 면접관님이 원하셨던 답변이 있을까요?

위처럼 대답했으나 반응이 별로 좋지 않으셔서요

0
  • 답변 4

  • siyex42080
    199
    2022-01-13 02:13:16

    말씀하신대로 단순 이론적으로야 GC가 자체적으로 있는 것이 수동으로 100% 관리할 수 있는 것 보다 빠를 수야 없습니다. 수동으로 관리할 수 있다면 똑같은 GC 알고리즘을 직접 만들어서 적용할 수도 있다는 뜻이니까요.

    하지만 실제 적용으로는 GC가 더 빠를 수 있는 경우도 여러가지 생각해 볼 수 있을 것 같습니다. 일반적으로 프로그래밍 하게 되면 더이상 오브젝트가 필요 없어지는 순간 바로 free 시키지만 GC의 경우 여러 상황을 고려해 한거번에 배치로 더 효율적으로 작업할 수 있습니다. 그리고 많은 프로그램의 경우 로드가 일정하게 높게 유지 되는 것이 아니니 리소스가 남고 다른 성능에 적은 영향을 미칠때를 골라 실행 될 수도 있을 거고요.

    이 이외에도 개발자 실수로 생긴 메모리 누수 같은 경우도 당연히 성능에 엄청난 영향을 미칩니다. 이것도 물론 이론상으로야 메모리 누수가 없게 만들면 되는거지만 실제로는 흔하게 일어나는 일이기도 하고요. (GC가 메모리 누수를 다 막아주는 건 아니긴 하지만 당연히 발생 빈도가 훨씬 낮습니다.)

    저는 지금은 이정도가 생각 나는데 면접관분은 다른 생각이 더 있었을지도 모르겠네요.

  • 엡실론
    2k
    2022-01-13 05:58:00

    윗분 답변에 추가로 모든 GC가 그런건 아니지만 자바의 GC는 메모리 파편화를 어느 정도 막아줍니다. 그로 인해서 메모리 할당/해제 성능 향상이 있을 수 있겠네요.

  • 돈까스
    6k
    2022-01-14 15:26:57 작성 2022-01-14 15:27:47 수정됨

    gc를 한다는 것은 메모리 사용 상황을 런타임에서 모니터링 하고 관리할 수 있는 무엇인가가 있다는 뜻인데요,

    다른 의미로 말하자면 런타임에서 어떤 최적화를 할 수 있다는 여지가 생긴다는 말도 됩니다.


    메모리를 잘 풀어준다는 가정, 메모리 관리를 개발자가 완벽하게 할 수 있다는 가정을 하면 말씀하신대로 GC는 쓸모없습니다만,

    현실적으로 모든 개발자가 런타임 환경에서 어떤 일이 일어날지를 모두 예측하고 개발할 수는 없거든요.

    내가 개발한 프로그램이 32bit 머신에서 실행할지 64bit 머신에서 실행할지,

    cpu가 big-endian인지 little-endian인지, 

    실행환경의 ram이 몇 기가일지 처리할 데이터가 얼마의 메모리를 사용할지...

    이런 걸 개발 단계나 컴파일하는 시점에서 알수가 없거든요.


    아무리 메모리를 많이 써도 OOM이 절대 불가능한 조건이라면 메모리 관리 자체를 안하는게 성능이 더 빠르겠죠.

    근데 그건 런타임에서 결정되는 것이지 개발자가 미리 알 수 없는 경우가 대부분일겁니다.


    보통 어떤 공학적인 기술이나 관점에 대해서 면접에서 물어볼때  '전혀 없다'고 단정적으로 답변하는 것은 좋지는 않을 겁니다.

    맞는 답을 하기 보다는 조금은 틀린 답을 하더라도 경험과 고민의 양을 보여주시는 쪽에 초점을 맞추는 편이 좋을 거에요.

  • 유영균
    30
    2022-01-17 14:32:24

    다들 다양한 의견 감사합니다!

  • 로그인을 하시면 답변을 등록할 수 있습니다.