코드부터 시작해 보겠습니다. 내 목표는 데이터를 완전히 없애는 것입니다
으아악저는 Java의 가비지 수집 메커니즘을 알고 있습니다. 위 코드는 여전히 10을 정상적으로 출력할 수 있습니다.
하지만 System.out .println(new1)을 만드는 방법을 알고 싶습니다. .num);
는 null
예외를 발생시킵니다. 이는 그러한 데이터가 전혀 없다는 것을 의미합니다System.out.println(new1.num);
抛出null
异常,即彻底没有这个数据
不要说让new1=null
단순히 new1=null
이 괜찮다고 말하지 마세요
당신은 "나는 Java의 가비지 수집 메커니즘을 알고 있습니다. 무언가가 그것을 참조하고 있는 한 사라지지 않을 것입니다."라고 직접 말씀하셨습니다. "new1" 변수는 여전히 힙에서 "new Data()"를 참조하고 있습니다. 우리가 작성하는 모든 코드가 널 포인터 예외가 되지 않도록 메모리 조각을 어떻게 재활용할 수 있습니까? 강력한 참조 대신 WeakReference를 사용할 수 있습니다.
으아아아으아아아
JVM에서 gc를 수행하는 것이 권장되며 이는 완전히 거부될 수 있습니다. GC 자체는 주기적으로 자동으로 실행되며 JVM은 실행 타이밍을 결정합니다. 또한 현재 버전에는 선택할 수 있는 다양한 스마트 모드가 있으며 실행 중인 시스템에 따라 자동으로 선택합니다. 실제로 성능이 향상되었습니다. 필요한 경우 이 명령을 사용하여 성능을 최적화하는 대신 GC 작동 메커니즘도 미세 조정해야 합니다.
개체 참조가 있고 곧 삭제될 개체는 여전히 null로 설정될 수 있습니다
으아아아JMM의 원리를 이해하기 전에 절대로 System.gc()를 무차별적으로 사용하지 마세요. 객체가 모두 소모되면 obj=null;만 사용하세요.
답은 '아니오'입니다. 이는 JVM 사양에서 정의되지 않은 동작입니다. 개발자는 가상 머신이 객체를 재활용하도록 수동으로 시도해서는 안 됩니다. Sun의 JDK라면 안전하지 않은 패키지가 있는 것 같은데 저는 사용해본 적이 없고 그런 API가 있는지도 모르겠습니다.