자바 의 인용 유형 및 사용 장면 을 자세히 설명 합 니 다.
1.강 인용(강 참조)
강 한 인용 유형 은 우리 가 가장 자주 말 하 는 유형 입 니 다.우 리 는 먼저 예 를 보 겠 습 니 다.
package cn.bridgeli.demo.reference;
 
/**
 * @author BridgeLi
 * @date 2021/2/26 10:02
 */
public class User {
 
    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("finalize");
    }
 
}
 
package cn.bridgeli.demo.reference;
 
import org.junit.Test;
 
/**
 * @author BridgeLi
 * @date 2021/2/26 10:03
 */
public class StrongReferenceTest {
 
    @Test
    public void testStrongReference() {
        User user = new User();
        user = null;
        System.gc();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}2.소프트 인용(소프트 참조)
제 가 자바 를 처음 배 웠 을 때 소프트 인용 을 어떻게 사용 하 는 지 몰 랐 습 니 다.그 때 는 강 한 인용 만 알 고 있 었 습 니 다.사실은 자바.lang.ref.SoftReference 류 를 통 해 소프트 인용 을 사 용 했 습 니 다.소프트 인용 을 설명 하기 위해 서 우 리 는 먼저 예 를 보 겠 습 니 다.
package cn.bridgeli.demo.reference;
 
import org.junit.Test;
 
import java.lang.ref.SoftReference;
 
/**
 * @author BridgeLi
 * @date 2021/2/26 10:21
 */
public class SoftReferenceTest {
 
    @Test
    public void testSoftReference() {
        SoftReference<byte[]> softReference = new SoftReference<>(new byte[1024 * 1024 * 10]);
        System.out.println(softReference.get());
 
        System.gc();
 
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        System.out.println(softReference.get());
 
        byte[] bytes = new byte[1024 * 1024 * 12];
 
        System.out.println(softReference.get());
    }
}
-Xms20m -Xmx20m소프트 인용의 특징 을 보면 우 리 는 소프트 인용의 사용 장면 인 캐 시 를 쉽게 생각 할 수 있다.처음 일 할 때 한 동료 가 나 에 게 안 드 로 이 드 를 하고 그림 을 불 러 오 는 애플 리 케 이 션 이 있 었 다 고 말 했다.특히 번 거 로 웠 고 OOM 을 할 수 있 었 다.사실은 소프트 인용 을 사용 하면 이 문 제 를 쉽게 해결 할 수 있 을 것 이다.
3.약 인용(Weak Reference)
약 한 인용 은 자바.lang.ref.Weak Reference 류 를 통 해 이 루어 집 니 다.마찬가지 로 우리 도 먼저 예 를 보 겠 습 니 다.
package cn.bridgeli.demo.reference;
 
import org.junit.Test;
 
import java.lang.ref.WeakReference;
 
/**
 * @author BridgeLi
 * @date 2021/2/26 10:30
 */
public class WeakReferenceTest {
 
    @Test
    public void testWeakReference() {
        WeakReference<User> weakReference = new WeakReference<>(new User());
        System.out.println(weakReference.get());
 
        System.gc();
 
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
 
        System.out.println(weakReference.get());
    }
}또한 ThreadLocal 류 를 제외 하고 한 가지 더 말 할 만 한 것 이 있 습 니 다.그것 이 바로 자바 util.Weak HashMap 류 입 니 다.유명한 의 미 를 보면 우 리 는 이러한 특징 을 짐작 할 수 있 습 니 다.마찬가지 로 하나의 예 를 통 해 설명 한다.
package cn.bridgeli.demo.reference;
 
import org.junit.Test;
 
import java.util.Map;
import java.util.WeakHashMap;
 
/**
 * @author BridgeLi
 * @date 2021/2/26 10:38
 */
public class WeakHashMapTest {
 
    @Test
    public void testWeakHashMap() {
        Map map = new WeakHashMap<String, Object>();
        for (int i = 0; i < 10000; i++) {
            map.put("key" + i, new byte[i]);
        }
 
//        Map map = new HashMap<String, Object>();
//        for (int i = 0; i < 10000; i++) {
//            map.put("key" + i, new byte[i]);
//        }
    }
}4.거짓 인용(Phantom Reference)
앞의 예 를 통 해 우 리 는 인용 강도 가 점점 약해 지 는 것 을 볼 수 있 습 니 다.그래서 가상 인용 은 가장 약 한 인용 유형 입 니 다.도대체 얼마나 약 한 지 알 수 있 습 니 다.우 리 는 같은 예 를 통 해 알 수 있 듯 이 가상 인용 은 자바.lang.ref.Phantom Reference 류 를 통 해 이 루어 진 것 입 니 다.
package cn.bridgeli.demo.reference;
 
import org.junit.Test;
 
import java.lang.ref.PhantomReference;
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.util.ArrayList;
import java.util.List;
 
/**
 * @author BridgeLi
 * @date 2021/2/26 11:05
 */
public class PhantomReferenceTest {
 
    ReferenceQueue referenceQueue = new ReferenceQueue();
    List<Object> list = new ArrayList<>();
 
    @Test
    public void testPhantomReference() {
        PhantomReference<Object> phantomReference = new PhantomReference<>(new Object(), referenceQueue);
        System.out.println(phantomReference.get());
 
        new Thread(() -> {
            while (true) {
                Reference reference = referenceQueue.poll();
                if (null != reference) {
                    System.out.println("============ " + reference.hashCode() + " ============");
                }
            }
        }).start();
 
        new Thread(() -> {
            while (true) {
                list.add(new byte[1024 * 1024 * 10]);
            }
        }).start();
 
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}이상 은 자바 의 인용 유형 과 사용 장면 에 대한 상세 한 내용 입 니 다.자바 인용 유형 과 사용 장면 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.