Go는 Java와 동일한 미묘한 메모리 누출의 영향을 받습니까?


89

사실은 다음과 같습니다.

  • Go 언어에는 가비지 수집기가 있습니다.

  • 자바에는 가비지 컬렉션이 있습니다.

  • 많은 Java 프로그램에 메모리 누수가 있습니다.

메모리 누수가있는 Java 프로그램의 예로서 (심각한 사람이 아니라 질문이 당신의 믿음을 흔들 수 있습니다), "누수 찾기"버튼이있는 Tomcat이라는 작은 Java 프로그램에 대해 여기를 참조하십시오 . 방법이 있습니까? Tomcat에서 배포 해제 메모리 누수를 방지하려면?

그래서 저는 궁금합니다. Go로 작성된 프로그램이 Java로 작성된 일부 프로그램이 보여주는 것과 동일한 종류의 (미묘한 또는 그렇지 않은) 메모리 누수를 나타낼까요?


29
"많은 자바 프로그램에 메모리 누수가 (미묘하건 없건) 있습니다."이 "사실"에 대한 증거가 있습니까? 아니면 단지 논점 일뿐입니다.
Peter Lawrey 2010

17
@Webinator : "많은"Java 프로그램이 가지고있는 "미묘한 메모리 누수"중 하나의 예를 제공해야한다고 생각합니다. 가비지 수집기에서 버그를 주장하지 않는 한 순수 Java에서 메모리를 누출하는 유일한 방법은 더 이상 사용하지 않는 참조를 유지하는 것입니다 (예 : 컬렉션에 개체를 넣고 해당 컬렉션에서 제거하지 않음). 이것이 당신이 언급하는 종류의 유출이라면 Go를 포함하여 세상의 어떤 언어도 그들을 보호하지 못할 것입니다.
JeremyP 2010

14
다음은 내가 이야기 한 메모리 누수입니다 (+200 개 upvotes, +150 개 upvotes에 대한 답변, 많은 실제 Java 메모리 누수 설명) : stackoverflow.com/questions/6470651/…
SyntaxT3rr0r

6
물론 JAVA 프로그램에는 메모리 누수가 있으므로 더 이상 필요할 때 참조를 null로 설정하는 것을 잊으십시오. 관찰자 디자인 패턴 또는 스레드 로컬 변수가있는 대규모 지속성 컬렉션 (예 : 캐시)에서 자주 발생합니다. 이것은 이론적이지 않으며 프로덕션에서 여러 메모리 누수를 직접 수정했습니다. 그리고 이것은 안티 자바가 아닙니다. 저는 5 년 넘게 정규 JAVA 개발자로 많은 다른 프로젝트를 진행하고 있습니다. JAVA (또는 기존의 다른 모든 언어)에서 메모리 누수가 발생할 수 있다는 것을 인식하지 못하는 것은 팬보이주의가 아니며 실제로 작동하는 방식을 이해하지 못하는 것입니다.
Nicolas Bousquet 2011

6
이 질문은 "팬보이 즘", "누군가의 신념을 흔들기"등에 대한 드라마와 코멘트 없이도 가능합니다. Esp. 전체 토론은 "내 정의 memory leak가 당신보다 낫다 "로 귀결되기 때문 입니다.
LAFK는 분석 재개 모니카 말한다

답변:


44

여기에서 다른 유형의 메모리 누수를 혼동하고 있습니다.

가증스럽고 명시적인 메모리 관리 기반 메모리 누수는 Java (또는 다른 GC 기반 언어)에서 사라졌습니다. 이러한 누수는 사용되지 않은 것으로 표시하지 않고 메모리 청크에 대한 액세스 권한이 완전히 상실되어 발생합니다.

"메모리 누출"은 컴퓨터가 우리의 마음을 읽을 수있을 때까지 지구상의 모든 다른 언어와 자바에 여전히 존재하며, 가까운 미래에있을 것입니다. 이러한 누출은 기술적으로 더 이상 필요하지 않은 객체에 대한 참조를 유지하는 코드 / 프로그래머로 인해 발생합니다. 이것은 근본적으로 논리적 인 버그이며 현재 기술을 사용하는 어떤 언어로도 예방할 수 없습니다.


23
메모리 누수는 단순히 메모리를 확보하는 것을 잊었을 때입니다. Java에서는 참조를 null로 설정하는 것을 잊었을 때 발생합니다. C ++에서는 free 호출을 잊었을 때 발생합니다. 둘 다 유효한 메모리 누수 사례입니다. 그리고 근본적인 문제는 동일합니다. 프로그램이 결국 OutOfMemory 오류로 충돌 할 때까지 점점 더 많은 메모리를 소비합니다.
Nicolas Bousquet 2011

1
어떤 언어도 프로그래머가 이러한 논리 오류를 만드는 것을 막을 수 없다는 것은 사실이지만, 그러한 오류가 Java SDK 자체에 존재하는 것도 사실입니다 (예를 들어, java.util.logging.Level구성 ArrayList되는 모든 객체가 포함 된 개인 정적 을 포함하는 참조). 구성에 배치되고 제거되지 않음) 이러한 결함이없는 다른 언어보다 Java를 프로그래밍 할 때이를 피하는 것이 더 어렵습니다
Jules

7
나는 OP가 연결된 질문에 대한 대답과 같이 실제로 도달 할 수없는 객체의 메모리 누수에 대해 묻고 있다고 생각합니다. 스레드에서 클래스로드로 인해 발생하는 메모리 누수입니다. -1
qbt937 2014

1
또한 정적 분석이 참조가 유효 수명이 지난 후에도 계속 존재하는지 여부를 판단 할 수 있다는 것도 생각할 수 있습니다.
Kyle Strand

1
@Amrit 아니요, 가비지 수집기는 더 이상 참조 하지 않는 메모리를 수집합니다 . 아직 참조하고있는 것을 제거해도 괜찮은지 알 수있는 방법이 없습니다.
Raphael Schmitz

19

Go 프로그램이 메모리 누수를 보일 가능성이 매우 높습니다. Go의 현재 구현에는 간단한 표시 및 청소 가비지 수집기가 있습니다. 이것은 일시적인 해결책 일 뿐이며 장기 가비지 수집기로 의도 된 것이 아닙니다. 자세한 내용은이 페이지 를 참조하십시오. 헤더 아래를보십시오 Go Garbage Collector. 해당 페이지에는 현재 버전의 코드에 대한 링크도 있습니다.


1
Java에서 마크 및 스윕 수집기의 문제 중 하나는 메모리 조각화입니다. 기술적으로 메모리는 아니지만 응용 프로그램에서 사용 가능한 메모리 손실 일 수 있습니다.
Peter Lawrey 2010

9

'메모리 누수'는 프로그래머가 해제 될 것이라고 생각한 메모리 조각이 해제되지 않는 경우입니다. 이것은 가비지 수집 여부에 관계없이 모든 언어로 발생할 수 있습니다. GC 언어의 일반적인 원인은 메모리에 대한 추가 참조를 유지하는 것입니다.

"언어는 메모리 누수를 일으키지 않고 프로그래머는 메모리 누수를 일으 킵니다."


8

가비지 수집 여부에 관계없이 Java, Go 또는 대부분의 다른 언어에서 메모리 누수가 발생하는 프로그램을 작성할 수 있습니다.

가비지 컬렉션은 프로그래머의 부담을 덜어 주지만 누수를 완전히 막지는 못합니다.


4
내가 알지. 나는 자바에 존재하는 약간의 미묘한 메모리 누수에 대해 구체적으로 말하고있다. 심지어 거친 자바조차도 처음 에는 GC 덕분에 메모리 누수가 존재하지 않는 언어로 판매되었다 .
SyntaxT3rr0r 2010

4
명확하지 않은 것이 죄송합니다. 당신은 "많은 자바 프로그램이 (미묘하거나없는) 메모리 누수가있다"고 말했다.
jzd 2010

3

여기서 추상화 수준을 혼합하고 있습니다. 메모리 누수는 라이브러리의 버그로 인해 발생합니다 ( 'a 체인이 b에 대한 참조를 유지하지만 개체가 서로 참조하는 경우). 이러한 루프를 찾는 데 얼마나 많은 시간을 할애하고 싶으신가요? 두 배 더 많이 사용하면 두 배 더 긴 루프를 감지 할 수 있습니다.

따라서 메모리 누수 문제는 프로그래밍 언어에 국한되지 않으며 GO 자체가 Java보다 좋거나 나쁠 이유가 없습니다.


1
전적으로 동의하지 않습니다. 메모리 누수는 자바가 스스로를 쏠 수있게 해주 며 라이브러리 버그와 관련이있는 것은 아니기 때문입니다. 많은 프로그래머가 Java에서 느리지 만 확실하게 메모리를 누출하는 프로그램을 작성하며 이는 라이브러리의 잘못이 아니라 자신의 잘못입니다. 또한 정확하게 Java GC가 시간 / 누출 가능성의 절충안을 만들고 있다면 Go가 동일한 절충안을 만들고 있습니까?
SyntaxT3rr0r 2010

1
그리고 질문은 실제로 "이러한 루프를 찾는 데 얼마나 많은 시간을 할애하고 싶은가?" 가 아닙니다. 질문은 "사양의 의무와 같은 루프에 이동 GC 지출 할 얼마나 많은 시간을" 이럴 흥미로운 질문이다.
SyntaxT3rr0r 2010

16
순환 참조 체인은 Java에서 가비지 콜렉션을 방지하지 않습니다.
Andy Thomas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.