Java 개발자는 가비지 수집 알고리즘에 대해 알아야합니까? [닫은]


11

최근 가비지 수집 알고리즘에 대해 알고 있는지 인터뷰에서 물었습니다.

가비지 수집이 무엇인지 알았지 만 개발자로서 그것에 대해 걱정할 필요가 없었고 가비지 수집기가 나를 위해 모든 노력을 기울이기 때문에 가비지 수집 알고리즘에 대해 배우는 것에 대해 결코 생각하지 않았습니다.

Java 개발자가 가비지 수집기 알고리즘에 대해 알아야한다고 생각하십니까? 그렇다면 어떤 것을 조사해야하는지 말씀해 주시겠습니까?



1
그렇습니다. 그렇지 않으면 과부하로 인해 소프트웨어가 작성 될 위험이 있습니다.
quant_dev

답변:


9

소프트웨어 플랫폼이 아닌 "표준 소프트웨어"를 개발하는 경우 가비지 수집 알고리즘을 아는 것이 전혀 중요하지 않다고 생각합니다. 가비지 수집기가 작동하는 방식과 그에 대한 기본적인 이해가 필요합니다. 가비지 수집으로 인해 소프트웨어에서 중대한 지연이 발생하거나 메모리 사용을 최적화해야하지 않는 한.

이러한 알고리즘에 관심이 있으시면이 게시물을 참조하십시오. 일시 중지 GC의 알고리즘은 무엇입니까?


7

가비지 콜렉션은 흥미롭고 사소한 컴퓨터 과학 문제입니다.

알고리즘을 알고 이해하면이 알고리즘에 대해 매우 깊은 관심과 이해가 있음을 나타냅니다. Java의 GC 알고리즘을 연구하지 않더라도 어떤 데이터 구조 및 알고리즘이 사용 될지에 대한 합리적인 설명을 누군가가 제공 할 수 있다면 인상적입니다.

Java 프로그래머의 관점에서 개발자가 GC의 장단점을 설명 할 수 있다면 좋을 것입니다. 여기에는 구현 방법에 대한 약간의 지식이 포함됩니다. 이는 수동적으로 사용하는 것이 아니라 사용하는 도구의 작동 방식에 관심이 있음을 나타냅니다. 비용을 알면 비용을 최소화하는 방식으로 프로그래밍하는 데 도움이됩니다.

나는 이것이 자바 개발자로서 생계를 유지하기 위해 "필수 지식"이라고 말하지는 않지만 오늘날의 일을 완수하기 위해 알아야 할 것보다 조금 더 깊이 갈 수 있다는 것을 보여주는 플러스 기술입니다.


2
내가 동의 할 기본 사항을 이해하면 사물을 이해하면 더 나은 코더가됩니다. 문제는 복잡한 세부 사항을 알고 use that information코드를 디자인하는 것입니다. 이것은 GC가 개선되고 GC가 더 이상 유지되지 않고 코드가 최적화되지 않는 방법에 대한 가정 (문제는 GC를 방해 할 수 있음)으로 인해 문제를 일으킬 수 있습니다. 알아두면 좋지만 특정 구현을 고려하지 않은 모범 사례를 사용하여 코드를 설계해야합니다. 컴파일러와 GC는 항상 향상되고 매크로 최적화는 결국 유용하지 않습니다.
Martin York

String구현 방법 에 대해 알고 있다면 +루프를 사용하여 문자열에 연결하지 않을 것이라고 생각 합니다.
JohnMcG

4

가비지 수집기 (또는 알고리즘 / 기술)의 작동 방식을 알아야하는 두 가지 이유가 있습니다.
1. 그들이 작성한 코드 아래에서 무슨 일이 일어나고 있는지 더 잘 알 수 있습니다. 이렇게하면보다 효율적인 코드를 작성하여 더 나은 성능을 보장 할 수 있습니다. 어떤 경우에는 이것이 중요 할 수 있습니다. (GWT가 브라우저의 가비지 수집기에 의존 할 때 불쾌한 경험을했으며 Chrome에서 메모리 누수가 많이 발생했습니다. 따라서 누수의 원인을 정확히 파악해야했습니다.)
2. 이러한 알고리즘은 항상 (또는 거의 항상 똑똑하고 숙련되고 자격을 갖춘 숙련 된 개발자에게 항상 신뢰하는 것은 아닙니다. 따라서 그들의 접근 방식을 연구하는 것이 매우 유용 할 수 있습니다.

인터뷰에서 당신이 그런 질문을 한 또 다른 이유를 봅니다. 일부 개발자 (특히 전 동료)는 개발자가 그러한 지식을 모르면 충분히 똑똑하거나 열심히 일하지 않는다고 생각합니다. 나는이 진술에 동의하지 않습니다. 그러나 어쨌든 그러한 것을 아는 것은 면접관에게 깊은 인상을 줄 수있는 좋은 방법입니다.


1
(2)와 (1)의 절반 (디버깅에 도움이 됨)에 동의합니다. 그러나 (1)에는 GC가 개선되거나 다른 유형의 GC를 사용하는 구현으로 이동할 때 더 이상 최적의 코드가 아닌 GC의 특정 구현에서 작동하도록 코드를 설계 할 위험이 있습니다.
Martin York

@Loki Astari, 특정 구현에 위험하다는 점이 맞습니다. 그러나 다른 한편으로는 .NET의 가비지 수집 원칙과 같이 (적어도 오랫동안) 변하지 않는 것들이 있습니다.
superM

@superM : 사실, Mono의 GC는 Microsoft와 크게 다르며 또 다른 완전히 다른 것으로 대체되고 있습니다.
Jörg W Mittag

@ superM : Java의 진화가 느리게 보이지 않습니다 : en.wikipedia.org/wiki/Java_version_history (연 1 회 새로운 패치 또는 업데이트가있는 것처럼 보입니다). 내년에 새로운 버전으로 출시되었습니다. 이제 GC가 매번 업데이트되는 것이 아니라 그 가능성을 보여줍니다.
Martin York

@Loki Astari, 맞습니다. 많은 소프트웨어 개발이 빠르게 변화하고 있으며 우리의 임무는이를 따라 잡는 것입니다. 또한 모든 변경 사항은 이미 존재하는 내용을 기반으로하므로 1 또는 2 버전 내에서 급격한 변경이 예상되지 않습니다.
superM

4

세대 가비지 콜렉션 및 Java 가비지 콜렉션 (PermGen, Eden 및 Tenured 공간)에 대한 세부 사항에 대해 알아야합니다. 또한 가비지 콜렉션에 대해 잘 알고 있어야합니다 (레퍼런스 카운팅이 일반적으로 좋지 않은 이유 및 마크 앤 스윕이 더 좋은 이유). 또한 Azul의 Zing JVM에서 "일시 정지되지 않은"GC 및 IBM의 실시간 Metronome 프로젝트 와 같은 일부 대체 구현을 읽는 것이 좋습니다 .


3

Java에 대한 가비지 콜렉션이 작동하는 방식에 대한 몇 가지 지식이 있어야합니다.

먼저 어떻게 작동하는지 모르는 경우 실수로 실제 응용 프로그램에서 최악의 성능으로 이어지는 디자인 결정을 내릴 수 있습니다. 이것은 GC가 향상됨에 따라 점점 줄어들고 있지만 앱에서 알고리즘을 선택할 수 있다면 GC에 대해 아는 것이 있다면 원인을 찾는 대신 수행 할 작업에 대한 지식을 가진 알고리즘을 선택할 수 있습니다. 나쁜 행동.

둘째, 작동 방식을 모른다면 주어진 응용 프로그램에 대해 GC를 조정할 수 없습니다. 기본 매개 변수는 대부분의 시간 동안 충분히 작동하므로 대부분의 Java 프로그래머는 GC를 조정할 필요가 없습니다. '대부분의 시간'에서 벗어나는 일을하면 GC 매개 변수를 조정하는 것을 알 수 있습니다. GC에 대한 지식없이 그렇게하는 것은 무작위로 노브를 돌리는 것입니다-유용한 것을 얻을 수는 있지만 상황을 악화시킬 가능성이 높습니다.

따라서 훌륭한 Java 프로그래머가 GC에 대한 햇볕 아래 모든 것을 알 것으로 기대하지는 않지만 프로그래머는 JVM의 GC가 함수를 사용하는 방법과 그 절충점을 어느 정도 알고 있어야합니다. GC 알고리즘.


1

그렇습니다. 모든 Java 개발자는 가상 머신에서 어떤 일이 벌어지고 있으며 가비지 수집 작업을 포함하여 어떤 일이 일어나고 있는지 확실히 알고 있어야합니다.

그러나 지식 수준은 또 다른 질문입니다. 나는 정상적인 개발자가 실제 구현의 차이점을 설명하지 않을 것이라고 기대하지는 않지만 (내가 직접 조사해야 할 것입니다) GC의 역할과 메모리 관리에 대한 장단점이 무엇인지에 대한 기본 원칙 명확한.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.