Java에서는 객체에 참조가 없으면 쓰레기가 됩니다. 제때에 재활용되지 않고 메모리가 해제되면 쓰레기가 점점 더 쌓여 결국 메모리가 부족해집니다! 실행이 중지됩니다.
어떤 사람들은 혼란스러워합니다. 우리는 일반적으로 코딩할 때 명시적으로 객체를 삭제하지 않습니다. 어떻게 하면 프로그램이 잘 실행될 수 있을까요?
오늘의 주인공인 jvm의 데몬 스레드 GC에 대한 내용입니다. GC는 특정 알고리즘에 따라 가비지 개체를 수시로 해제하는 동시에 메모리 조각 모음을 수행합니다. 메모리를 유지하고 프로세스의 정상적인 작동을 유지합니다.
다음 코드를 살펴보겠습니다.
public class DemoDatatype {
public static void main(String[] args) {
new DemoDatatype();
System.gc();
System.out.println("over!");
}
@Override
protected void finalize()는 Throwable {
System.out.println("가비지 수집 전에 작업하세요!");
super.finalize() ;
}
}
프로그램 출력: 끝났습니다!
"new DemoDatatype()" 개체를 생성했습니다. 참고가 없으면 금방 쓰레기가 되지만 과연 재활용이 될까요? 적어도 위의 결과는 재활용이 없다는 것을 보여줍니다. 왜냐하면 jvm에는 충분한 메모리가 있고 재활용하기 위해 열심히 노력하지 않기 때문입니다^_^.
java.lang.System 클래스 아래에 정적 메소드 gc()가 있습니다. 이를 적극적으로 호출하면 GC에 알릴 수 있습니다. 여기 쓰레기가 있습니다. 와서 도와주세요. 그것을 수집하십시오. 그러나 GC가 반드시 귀하의 요청에 즉시 응답하지 않을 수도 있으며, 중간에 교통 체증이 있을 수도 있고, 언제 도착할지 확실하지 않을 수도 있습니다. 결과를 보려면 gc()를 실행하세요.
public class DemoDatatype {
public static void main(String[] args) {
new DemoDatatype ( );
System.gc();
System.out.println("over!");
}
@Override
protected void finalize()는 Throwable을 던집니다. >}
}
프로그램 출력: 끝났습니다!
가비지 수집 전에 작업하세요!
또는: 가비지 수집 전에 작업하세요!
GC가 유휴 상태여서 작동했기 때문에 시간 내에 응답했지만 즉시 실행되지는 않았으며 우발적인 이벤트였습니다. GC는 가비지 수집 전에 finalize() 메서드를 실행합니다. GC는 new를 통해 적용된 객체만 알고 있다는 것을 알고 있습니다. 일부 메모리가 비정상적인 방법으로 열리면 GC가 혼란스러워집니다. finalize()의 기능은 "새롭지 않은" 메모리, 닫히지 않은 IO 등과 같이 gc에서 재활용할 수 없는 일부 리소스와 같은 일부 리소스를 가비지 수집 전에 해제하는 것입니다. 그러나 리소스를 해제하기 위해 finalize()에 의존하지 마십시오. GC에 도달할 수 없고 메모리 누수가 발생할 수 있습니다. 어떤 상황에서 GC가 발생하나요? 1) GC는 서비스 업계의 구성원으로서 우선순위가 가장 낮기 때문에 애플리케이션이 유휴 상태일 때만 시작됩니다. 2) 메모리가 부족하여 애플리케이션이 종료되기 직전에 GC가 진행되어 가비지를 제거하고 메모리를 해제합니다. 메모리 누수가 심각하면 jvm이 실행을 중지합니다. GC 작업에도 시스템 리소스가 소모됩니다. 불필요한 오버헤드를 방지하는 방법은 무엇입니까? 1) 가비지를 만들지 마세요: 불가피하게 임시 객체의 사용을 줄이고, 사용 후에는 비워두세요. 2) 적극적으로 GC를 요청하지 마세요: system.gc를 명시적으로 호출하지 마세요. () 3) 객체의 생명주기를 명확히 하고 적극적으로 파기 4) 수많은 문자열을 이어붙이는 등 쓸모없는 객체를 대량으로 집중 생성하는 행위는 지양한다
5) 코드가 엄격하게 작성되도록 코딩 과정 중 메모리 누수에 주의하세요.