사실은 다음과 같습니다.
-
Go 언어에는 가비지 수집기가 있습니다.
-
자바에는 가비지 컬렉션이 있습니다.
-
많은 Java 프로그램에 메모리 누수가 있습니다.
메모리 누수가있는 Java 프로그램의 예로서 (심각한 사람이 아니라 질문이 당신의 믿음을 흔들 수 있습니다), “누수 찾기”버튼이있는 Tomcat이라는 작은 Java 프로그램에 대해 여기를 참조하십시오 . 방법이 있습니까? Tomcat에서 배포 해제 메모리 누수를 방지하려면?
그래서 저는 궁금합니다. Go로 작성된 프로그램이 Java로 작성된 일부 프로그램이 보여주는 것과 동일한 종류의 (미묘한 또는 그렇지 않은) 메모리 누수를 나타낼까요?
답변
여기에서 다른 유형의 메모리 누수를 혼동하고 있습니다.
가증스럽고 명시적인 메모리 관리 기반 메모리 누수는 Java (또는 다른 GC 기반 언어)에서 사라졌습니다. 이러한 누수는 사용되지 않은 것으로 표시하지 않고 메모리 청크에 대한 액세스 권한이 완전히 상실되어 발생합니다.
“메모리 누출”은 컴퓨터가 우리의 마음을 읽을 수있을 때까지 지구상의 모든 다른 언어와 자바에 여전히 존재하며, 가까운 미래에있을 것입니다. 이러한 누출은 기술적으로 더 이상 필요하지 않은 객체에 대한 참조를 유지하는 코드 / 프로그래머로 인해 발생합니다. 이것은 근본적으로 논리적 인 버그이며 현재 기술을 사용하는 어떤 언어로도 예방할 수 없습니다.
답변
Go 프로그램이 메모리 누수를 보일 가능성이 매우 높습니다. Go의 현재 구현에는 간단한 표시 및 청소 가비지 수집기가 있습니다. 이것은 일시적인 해결책 일 뿐이며 장기 가비지 수집기로 의도 된 것이 아닙니다. 자세한 내용은이 페이지 를 참조하십시오. 헤더 아래를보십시오 Go Garbage Collector
. 해당 페이지에는 현재 버전의 코드에 대한 링크도 있습니다.
답변
‘메모리 누수’는 프로그래머가 해제 될 것이라고 생각한 메모리 조각이 해제되지 않는 경우입니다. 이것은 가비지 수집 여부에 관계없이 모든 언어로 발생할 수 있습니다. GC 언어의 일반적인 원인은 메모리에 대한 추가 참조를 유지하는 것입니다.
“언어는 메모리 누수를 일으키지 않고 프로그래머는 메모리 누수를 일으 킵니다.”
답변
가비지 수집 여부에 관계없이 Java, Go 또는 대부분의 다른 언어에서 메모리 누수가 발생하는 프로그램을 작성할 수 있습니다.
가비지 컬렉션은 프로그래머의 부담을 덜어 주지만 누수를 완전히 막지는 못합니다.
답변
여기서 추상화 수준을 혼합하고 있습니다. 메모리 누수는 라이브러리의 버그로 인해 발생합니다 ( ‘a 체인이 b에 대한 참조를 유지하지만 개체가 서로 참조하는 경우). 이러한 루프를 찾는 데 얼마나 많은 시간을 할애하고 싶으신가요? 두 배 더 많이 사용하면 두 배 더 긴 루프를 감지 할 수 있습니다.
따라서 메모리 누수 문제는 프로그래밍 언어에 국한되지 않으며 GO 자체가 Java보다 좋거나 나쁠 이유가 없습니다.