자바 대상 이 사용 하지 않 을 때 값 을 부여 하 는 null 의 의미 에 대한 자세 한 설명

코드 먼저 보기

public class TestDemo1 {
  public static void main(String[] args) {
    if (true) {
      byte[] placeHolder = new byte[64 * 1024 * 1024];
      System.out.println(placeHolder.length / 1024);
    }
    System.gc();
  }
}
아이디어 설정 gc 로그 인쇄

위의 코드 를 실행 하고 그림 gc 로 그 를 불 러 옵 니 다.

지금 우 리 는 위의 테스트 코드 를 수정 하여 place Holder 를 null 로 설정 합 니 다.

public class TestDemo1 {
  public static void main(String[] args) {
    if (true) {
      byte[] placeHolder = new byte[64 * 1024 * 1024];
      System.out.println(placeHolder.length / 1024);
      placeHolder = null;
    }
    System.gc();
  }
}
프로그램 을 다시 실행 하여 gc 로 그 를 봅 니 다.

위 에 실 린 그림 로그 에서 두 가지 차 이 를 뚜렷하게 볼 수 있 기 때문에 대상 을 null 로 설정 하지 않 아 도 의미 가 있 습 니 다.
왜 이들 의 차 이 를 만 들 었 을 까?
이것 은 jvm 에서 쓰레기 를 인정 하 는 메커니즘 인 접근 성 분석 부터 시작 해 야 한다.
이 접근 성 을 말하자면 먼저 뿌리 를 말 해 야 하 는데'로 컬 변수 표'는 바로 뿌리 라 고 볼 수 있다.
위의 두 단락 코드 로 컬 변수 표 는 다르다.
첫 번 째 코드 를 먼저 보면 place Holder 에 null 의'로 컬 변수 표'가 설치 되 어 있 지 않 습 니 다.
javap-v TestDemo1.class 사용 하기

place Holder 가 로 컬 변수 표 에 있 고 slot 슬롯 1 번 위 치 를 차지 하기 때문에 jvm 은 살아 있다 고 생각 합 니 다.
그 다음 에 우 리 는 place Holder=null 이 코드 의'로 컬 변수 표'의 상황 을 다시 보 았 습 니 다.사실은 위 와 마찬가지 로 차이 가 보이 지 않 습 니 다.
그런데 만약 에 저희 가 place Holder 뒤에 변 수 를 하나 더 설명 하면...

public class TestDemo1 {
  public static void main(String[] args) {
    if (true) {
      byte[] placeHolder = new byte[64 * 1024 * 1024];
      System.out.println(placeHolder.length / 1024);
    }
    String name = "admin";
    System.gc();
  }
}

name 이라는 변수 이름 이 slot 슬롯 1 번 위 치 를 차지 하 는 것 을 볼 수 있 습 니 다.place Holder 가 소 용이 없다 는 것 을 설명 할 수 있 습 니까?
그리고 이 코드 는 place Holder=null 의 gc 로그 와 똑 같 습 니 다.그러면 우리 가 설명 한 이 String name="admin"은 스 택 에 있 는 place Holder 와 인 스 턴 스 간 의 관 계 를 끊 었 습 니 다.
place Holder=null 에 도 이런 기능 이 있 을 것 이다.
요약:코드 가 변수 역할 영역 에서 벗 어 날 때 더미 와 의 관 계 를 자동 으로 차단 하지 않 습 니 다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기