what is garbage collection java
이 자습서에서는 Java의 가비지 수집이 무엇이며 가비지 수집기가 어떻게 작동하는지 설명합니다. 가비지 수집을위한 알고리즘에 대해서도 학습합니다.
C / C ++에 대한 지식이있는 독자는 C / C ++에서 개체를 만들고 삭제하는 것이 프로그래머의 책임임을 인식해야합니다.
프로그래머가 생성 된 객체를 파괴하는 것을 잊으면 심각한 오류가 발생합니다. 객체를 파괴하지 않으면 ' OutOfMemory ”오류, 메모리 누수 등
프로그래머가 객체를 추적 할 필요가 없기 때문에이 상황은 Java에서 완전히 처리됩니다. Java는 자동 가비지 수집을 통해 객체 파괴를 처리합니다.
=> 처음부터 Java를 배우려면 여기를 방문하십시오.
더 이상 사용하지 않는 개체를 힙 메모리에서 제거하는 프로세스를 '가비지 수집'이라고합니다. 가비지 콜렉션 기술은 Java에서 메모리 관리의 일부입니다.
따라서 Java에서 가비지 수집기는 더 이상 사용되지 않는 모든 개체를 삭제합니다.
학습 내용 :
Java에서 가비지 수집기 란 무엇입니까?
Java의 Garbage Collection은 Garbage Collector라는 프로그램에 의해 관리됩니다.
Garbage Collector는 개체 할당 해제를 처리하여 메모리를 자동으로 관리하는 데 사용되는 프로그램으로 정의 할 수 있습니다.
Java 언어에서는 new 연산자를 사용하여 새 객체가 생성되고 메모리가 할당된다는 것을 알고 있습니다. new 연산자를 사용하여 개체에 할당 된 메모리는 참조가이 개체를 사용할 때까지 할당 된 상태로 유지됩니다.
참조가 더 이상 존재하지 않으면 객체가 차지하는 메모리가 회수됩니다. 그런 다음 Java는 객체의 할당 해제 또는 파괴를 자동으로 처리하므로 객체를 명시 적으로 삭제할 필요가 없습니다.
이 기술은 프로그래머가 객체 할당 해제를 명시 적으로 처리 할 필요가없는 Java의 가비지 수집 기술입니다.
객체가 메모리를 필요로하지 않을 때 프로그램이 메모리를 할당 해제하지 않으면 결국 할당 할 메모리가 남지 않고 프로그램이 충돌합니다. 이 상황을 메모리 누수라고합니다.
가비지 수집기는 항상 데몬 스레드의 백그라운드에서 실행됩니다. 가비지 수집기는 데몬 스레드의 가장 좋은 예로 간주됩니다.
가비지 콜렉터가 힙 메모리를 해제하려고 실행됩니다. '도달 할 수없는'개체를 제거하여이를 수행합니다.
'연결할 수없는'개체 란 무엇입니까?
연결된 참조가 하나도 없으면 개체에 연결할 수 없게됩니다.
다음 코드를 고려하십시오.
Integer ref_obj = new Integer (5); //ref_obj is a reference to Integer ref_obj = null; //Integer object now becomes unreachable
위의 코드에서 볼 수 있듯이 참조가 연관되어있는 한 객체에 도달 할 수 있습니다. 참조 연결이 제거되는 순간 (위의 경우 null에 대한 설정 참조) 개체에 연결할 수 없게됩니다.
객체에 접근 할 수 없게되면 가비지 컬렉션 (GC)에 적합하게됩니다.
개체를 GC에 적합하게 만들려면 어떻게해야합니까?
프로그래머는 GC가 처리하는 객체를 파괴 할 필요가 없지만 적어도 프로그래머는 더 이상 필요하지 않을 때 이러한 객체에 도달 할 수 없도록 만들 수 있습니다.
이렇게하면 GC는 도달 할 수없는 개체를 수집하고 파괴합니다.
개체에 도달 할 수 없도록 만들어 GC에 적합한 개체를 만드는 몇 가지 방법이 있습니다.
그들은:
# 1) 참조 무효화
객체에 할당 된 참조가 주어지면이 객체가 더 이상 필요하지 않으면 참조를 null로 할당합니다.
Student s = new Student (); s = null;
s가 null로 설정되면 Student 개체에 연결할 수 없게됩니다.
# 2) 참조 재 할당
이는 객체를 GC에 적합하게 만드는 또 다른 방법입니다.
다음 코드를 고려하십시오.
Student s1 = new Student (); Student s2 = new Student (); s1 = s2;
이제 s1을 다른 개체에 할당 했으므로 s1이 참조하는 Student 개체가 역 참조됩니다.
# 3) 익명 개체 만들기
익명 객체를 생성하여 객체를 GC에 적합하게 만들 수 있습니다.
아래와 같이 익명 객체를 만들 수 있습니다.
new Student();
객체를 GC에 적합하게 만들면 이러한 객체는 GC에 의해 즉시 삭제되거나 삭제되지 않을 수 있습니다. 이는 우리가 원하는 때에 GC를 실행하도록 명시 적으로 강제 할 수 없기 때문입니다.
가비지 콜렉터는 언제 실행됩니까?
가비지 콜렉터 프로그램을 실행하는 것은 JVM에 달려 있습니다. JVM이 가비지 콜렉터를 실행하면 도달 할 수없는 개체가 삭제됩니다. 그러나 여전히 JVM이 언제 실행되는지 보장 할 수 없습니다.
GC를 강제로 실행할 수는 없지만 가비지 컬렉션을 매우 잘 요청할 수 있습니다.
GC는 다음 방법 중 하나를 사용하여 요청할 수 있습니다.
# 1) System.gc () : Java의 System 클래스는 가비지 콜렉터를 실행하기 위해 JVM을 요청할 수있는 정적 메소드 gc ()를 제공합니다.
# 2) Runtime.getRuntime (). gc () : System.gc ()와 마찬가지로 'Runtime class'의 gc () 메서드를 사용하여 가비지 수집기를 실행하도록 JVM을 요청할 수도 있습니다.
노트 : 가비지 콜렉터가이 두 메서드의 요청 후에 실행된다는 보장은 없습니다.
마무리
객체를 파괴하기 직전에 Garbage Collector에 의해 마무리가 수행됩니다. 마무리 기술의 일부로 가비지 수집기는 객체에 대해 finalize () 메서드를 호출합니다. finalize () 메서드는 정리 작업을 수행하는 데 사용됩니다.
finalize () 메서드는“Object”클래스에서 제공하며 다음과 같은 프로토 타입을 가지고 있습니다.
protected void finalize () throws Throwable
finalize () 메서드는 객체가 가비지 수집 될 때마다 호출됩니다.
노트 : 가비지 수집기는 new 키워드를 사용하여 생성 된 개체 만 수집합니다. 다른 개체의 경우 정리를 수행하려면 finalize () 메서드를 사용해야합니다.
아래 프로그램은 Java의 간단한 가비지 컬렉션을 보여줍니다.
class TestGC{ @Override // finalize method: called on object once // before garbage collecting it protected void finalize() throws Throwable { System.out.println('Garbage collector called'); System.out.println('Object garbage collected : ' + this); } } class Main{ public static void main(String args()){ TestGC gc1=new TestGC(); TestGC gc2=new TestGC(); gc1 = null; //nullify gc1 System.gc(); //request for GC to run gc2 = null; //nullify gc2 Runtime.getRuntime().gc(); //request for GC to run } }
산출
위의 프로그램에서 우리는 TestGC 클래스를 만들었습니다. 이 클래스에서는 finalize () 메서드를 재정의했습니다. 그런 다음 메인 클래스에서 TestGC 클래스의 두 개체를 만듭니다. 먼저 객체를 무효화하고 System.gc ()를 호출하여 가비지 수집기를 요청합니다.
다음으로 두 번째 객체를 무효화하고 Runtime.getRuntime.gc () 메서드를 호출하여 가비지 수집기를 요청합니다. 출력은 finalize 메소드 출력을 두 번 표시하여 가비지 수집기가 두 번 실행되었음을 나타냅니다.
노트 : 이 출력을 얻었지만 매번 동일한 출력을 얻을 것이라는 보장은 없습니다. JVM에 완전히 의존합니다.
가비지 콜렉션은 Java에서 어떻게 작동합니까?
이 섹션에서는 가비지 컬렉션이 Java에서 어떻게 작동하는지 살펴 보겠습니다.
가비지 수집 중에 가비지 수집기는 힙 메모리를 조회 한 다음 연결할 수없는 개체를 '표시'합니다. 그런 다음 그들을 파괴합니다.
그러나 문제는 물체의 수가 증가 할 때 발생합니다. 개체가 증가하면 가비지 수집에 걸리는 시간도 도달 할 수없는 개체를 찾을 때 증가합니다. 그러나 대부분의 개체는 수명이 짧기 때문에 큰 영향을주지 않습니다.
위의 동작은 “Generational Garbage Collection” JVM 성능을 향상시킬 예정입니다. 이 접근 방식에서 전체 힙 공간은 Young Generation, Old 또는 Tenured Generation 및 Permanent Generation으로 구분됩니다.
# 1) 젊은 세대 힙 공간 : 모든 새 개체가이 공간에 만들어집니다. 공간이 가득 차면 모든 죽은 개체가 파괴되는 Minor GC가 발생합니다. 사소한 GC 프로세스는 대부분의 개체가 죽었 기 때문에 빠르고 빠릅니다. 젊은 세대에서 살아남은 물건은 이전 세대로 이동합니다.
# 2) 구세대 힙 공간 : 이 세대는 오래 살아남는 물건을 저장합니다. 젊은 세대에 설정된 임계 연령이 충족되면 개체는 이전 세대로 이동됩니다. 구세대 공간이 채워지면 Major GC가 수행됩니다.
여기에 관련된 개체가 라이브 개체이므로 Major GC가 느립니다. 때로는 젊은 세대와 이전 세대를 포함하는 전체 힙 공간이 지워집니다. 이를 'Full GC'라고합니다.
# 3) 영구 세대 L Java 7까지는 Permanent Generation (Perm Gen)이었습니다. Perm Gen 보유 메타 데이터는 JVM에서 사용되었습니다. JVM은이 메타 데이터를 사용하여 애플리케이션에서 사용되는 클래스와 메소드를 설명했습니다. Perm Gen은 Java 8에서 제거되었습니다.
Java 8 가비지 수집 : Perm Gen 및 Metaspace
Java 7까지 존재했던 Perm Gen 공간에 대해 이미 언급했습니다. 그러나 이제 Java 8에서 JVM은 'Metaspace'라는 원시 메모리를 사용하여 클래스 메타 데이터를 나타냅니다.
Metaspace 외에도 클래스 메타 데이터에 사용되는 메모리를 제한하는 'MaxMetaspaceSize'라는 새 플래그가 있습니다. MaxMetaspaceSize에 값을 지정하지 않으면 Metaspace는 응용 프로그램 요구에 따라 런타임에 크기를 조정합니다.
클래스 메타 데이터 공간이 MaxMetaspaceSize에 도달하면 Metaspace GC가 트리거됩니다. Metaspace GC가 너무 많으면 클래스, 클래스 로더 등의 메모리 누수와 부적절한 크기 조정을 나타냅니다.
자바의 가비지 컬렉션 알고리즘
가비지 컬렉션을 수행하는 방법에는 여러 가지가 있습니다. 이 섹션에서는 Java에서 가비지 수집을위한 4 가지 방법 또는 알고리즘을 제시합니다.
직렬 GC
직렬 GC는 가장 간단한 GC 알고리즘입니다. 주로 작은 힙 크기와 단일 스레드 시스템에서 작동합니다. 작업하는 동안 직렬 GC는 모든 응용 프로그램을 중지합니다.
Serial GC를 켜기 위해 다음 JVM 옵션을 사용할 수 있습니다.
시장에서 가장 좋은 ETL 도구
java –xx:+UseSerialGC –jar Application.java
위의 명령은 명령 줄에서 제공 할 수 있습니다. 여기서 Application.java는 직렬 GC를 사용할 수있는 파일입니다.
처리량 / 병렬 GC
병렬 GC 알고리즘은 JDK 8의 기본 알고리즘입니다.이 알고리즘은 여러 스레드를 사용하여 힙 공간 및 압축을 스캔합니다. 이 알고리즘은 스레드 일시 중지를 처리하고 CPU 오버 헤드를 최적화 할 수있는 애플리케이션에 주로 적합합니다.
병렬 GC의 한 가지 단점은 마이너 또는 전체 GC를 수행하는 동안 알고리즘이 애플리케이션 스레드를 일시 중지한다는 것입니다.
CMS 수집기
CMS는 ' 동시 마크 스윕 ”. 이 알고리즘은 여러 병발 사정 힙 ( 표 ) 사용하지 않는 개체를 식별하고 재활용 ( 스위프 ) 그들. CMS 수집기에는 STW (Stop-The-World) 모드가 있습니다.
수집기는 다음 두 가지 시나리오에서이 모드로 전환됩니다.
- 정적 변수 또는 스레드 진입 점에서 이전 세대에 속한 개체에 도달 할 수있는 경우. 따라서이 모드는 초기 루트 표시를 초기화하는 동안 켜집니다.
- 알고리즘이 동시에 실행될 때 애플리케이션은 상태를 변경하고 수집기가 올바른 개체가 표시되었는지 확인하기 위해 강제로 다시 돌아가도록합니다.
그러나 CMS 수집기는 '프로모션 실패'를 겪을 수 있습니다. 그렇다면 프로모션 실패 란 무엇입니까? 젊은 세대 공간의 객체가 이전 세대로 이동되고 수집기가 이전 세대 힙 공간에서 이러한 객체를위한 충분한 공간을 확보하지 않은 경우 프로모션 실패가 발생합니다.
프로모션 실패를 방지하기 위해 수집기에 더 많은 백그라운드 스레드를 제공하거나 이전 세대에 더 많은 힙 크기를 제공 할 수 있습니다.
G1 수집가
G1 Collector는 'Garbage-First'Collector입니다. 4GB 이상의 힙 크기를 위해 설계되었습니다. 힙 크기에 따라 힙 크기를 1MB에서 32MB까지의 크기 영역으로 나눕니다.
G1 컬렉터는 힙 전체에서 개체의 생동감에 따라 개체를 표시합니다. 이 마킹 단계 후 G1은 빈 영역을 인식합니다. 따라서 이러한 영역에서 도달 할 수없는 개체를 수집하여 많은 공간을 확보합니다. 따라서 쓰레기가 포함 된 지역을 먼저 수집하므로 쓰레기 우선이라고 명명됩니다.
또한 지정된 일시 중지 시간 목표에 따라 수집 할 지역 수를 선택하여 일시 중지 예측 모델을 사용하여 사용자 정의 일시 중지 시간 목표를 충족합니다.
가비지 수집의 장점
- 가비지 콜렉션은 프로그래머의 간섭없이 힙 메모리에서 참조되지 않은 객체를 제거하므로 Java에서 메모리 관리를 효율적으로 만듭니다.
- 가비지 콜렉션은 자동이며 JVM의 일부이므로 프로그래머가 메모리를 재생하거나 오브젝트를 파괴하기 위해 추가로 노력할 필요가 없습니다.
- 프로그래머는 C / C ++에서와 같이 메모리 할당을 해제하고 개체를 삭제하기 위해 특정 코드를 작성할 필요가 없습니다.
자주 묻는 질문
Q # 1) 가비지 콜렉터의 역할은 무엇입니까?
대답: Java에서 가비지 수집기는 메모리 관리의 주요 당사자이며 도달 할 수없는 개체를 수집하고 메모리를 회수하는 작업을 수행합니다.
Q # 2) 가비지 콜렉션이란 무엇을 의미합니까?
대답: 가비지 수집은 사용하지 않는 메모리를 회수하여 메모리를 자동으로 관리하는 기술입니다. 이것은 프로그래머가 사용하지 않는 객체를 추적하고 파괴 할 필요가 없기 때문에 Java와 같은 프로그래밍 언어에 존재하는 기능입니다. Garbage Collection을 사용하여 자동으로 수행됩니다.
질문 # 3) Java에서 가비지 수집을 담당하는 사람은 누구입니까?
대답: Java의 메모리 관리는 Garbage Collection의 책임이 있습니다.
질문 # 4) Java에서 가비지 수집을 어떻게 방지 할 수 있습니까?
대답: 가비지 콜렉터는 살아있는 변수 / 객체의 메모리를 회수하지 않기 때문에 가비지 수집을 방지하는 가장 좋은 방법은 프로그램 전체에서 변수 / 객체를 계속 사용하는 것입니다.
질문 # 5) 개체가 가비지 수집되었는지 어떻게 확인할 수 있습니까?
대답: 객체에 도달 할 수없는 경우 (예 : 더 이상 객체를 참조하는 참조가없는 경우) 객체는 가비지 수집 대상입니다. 우리가 원할 때마다 가비지 컬렉터를 강제 실행할 수는 없지만 System.gc ()를 사용하여 실행하도록 요청할 수 있습니다.
결론
이 자습서에서 논의한 Java의 가비지 컬렉션은 자동이며 프로그래머는 프로그램에 할당 된 개체 또는 변수를 삭제하는 것에 대해 걱정할 필요가 없습니다.
Java의 자동 가비지 수집은 언어의 가장 중요한 기능이며 Java에서 메모리 관리의 일부입니다.
가비지 수집은 JVM에 의해 수행되고 프로그래머의 손이 닿지 않는 범위에 있지만 시스템 및 런타임 클래스의 gc () 메서드를 사용하여 항상 가비지 수집기를 실행하도록 요청할 수 있습니다.
이 자습서에서는 가비지 수집기에 의해 개체가 소멸되기 전에 수행되는 마무리 프로세스에 대해 설명했습니다. 또한 Java에서 가비지 수집 프로세스에 대해 논의했습니다. 마지막으로 가비지 콜렉터가 사용하는 다양한 알고리즘에 대해 논의했습니다.
이것으로 Java의 가비지 콜렉터에 대한 논의를 마쳤습니다.
추천 도서
- Java 기초 : Java 구문, Java 클래스 및 핵심 Java 개념
- Java의 용도 : 12 가지 실제 Java 애플리케이션
- 자바 문자열 자습서 | 예제가있는 Java 문자열 메서드
- 초보자를위한 JAVA 튜토리얼 : 100 개 이상의 실습 Java 비디오 튜토리얼
- Java 구성 요소 : Java 플랫폼, JDK, JRE 및 Java Virtual Machine
- Java 배포 : Java JAR 파일 생성 및 실행
- Java Virtual Machine : JVM이 Java 응용 프로그램을 실행하는 데 도움이되는 방법
- 예제가 포함 된 Java 리플렉션 자습서