약한 참조 이점
누군가 C #에서 다양한 유형의 참조의 주요 이점을 설명 할 수 있습니까?
- 약한 참조
- 소프트 참조
- 팬텀 참조
- 강력한 참조.
우리는 많은 메모리를 소비하는 응용 프로그램이 있으며 이것이 집중해야 할 영역인지 확인하려고합니다.
소프트 및 팬텀 참조는 Java에서 나온다고 생각합니다. 긴 weak 참조 (C #의 WeakReference 생성자에 true 전달)는 Java의 PhantomReference와 유사한 것으로 간주 될 수 있습니다. C #에 SoftReference에 대한 아날로그가 있다면 그것이 무엇인지 모르겠습니다.
약한 참조는 개체의 수명을 연장하지 않으므로 모든 강력한 참조가 범위를 벗어나면 가비지 수집 될 수 있습니다. 초기화하는 데 비용이 많이 드는 대형 객체를 보유하는 데 유용 할 수 있지만 실제로 사용하지 않는 경우 가비지 수집에 사용할 수 있어야합니다.
이것이 응용 프로그램의 메모리 소비를 줄이는 데 유용할지 여부는 응용 프로그램의 세부 사항에 따라 완전히 다릅니다. 예를 들어, 나중에 재사용되거나 재사용되지 않을 수있는 캐시 된 객체가 적당히 많이있는 경우 약한 참조는 캐시의 메모리 소비를 개선하는 데 도움이 될 수 있습니다. 그러나 앱이 매우 많은 수의 작은 개체를 사용하는 경우 참조 개체가 더 많은 메모리를 차지하므로 약한 참조는 문제를 더 악화시킵니다.
MSDN에는 약한 참조에 대한 좋은 설명이 있습니다. 주요 인용문은 다음과 같이 하단에 있습니다.
메모리 관리 문제에 대한 자동 솔루션으로 약한 참조를 사용하지 마십시오 . 대신 애플리케이션의 개체를 처리하기위한 효과적인 캐싱 정책을 개발하십시오.
WeakReference를 야생에서 볼 때마다 메모리 관리 문제에 대한 자동 솔루션으로 사용되었습니다. 응용 프로그램의 문제에 대한 더 나은 솔루션이있을 수 있습니다.
WeakReference를 사용한 멋진 실제 예제는 Android 개발 자습서에 설명되어 있습니다 .
뷰 (ImageView)에는 이미지 (Bitmap)와 이미지 컨테이너가 있습니다. 이미지가 메모리에서로드되지 않고 (예 : 디스크, 넷에서)로드되는 경우 UI 스레드와 화면을 잠글 수 있습니다. 이를 방지하기 위해 비동기 작업을 사용할 수 있습니다.
비동기 작업이 완료되면 문제가 발생합니다. 이미지 컨테이너는 그 당시에는 전혀 유용하지 않을 수 있습니다 (화면이 변경되거나 Android가 스크롤 후 보이지 않는 뷰 부분을 언로드). WeakReference는 여기에서 도움이 될 수 있으며 ImageView는 가비지 수집됩니다.
class BitmapWorkerTask extends AsyncTask<Integer, Void, Bitmap> {
private final WeakReference<ImageView> imageViewReference;
public BitmapWorkerTask(ImageView imageView) {
imageViewReference = new WeakReference<ImageView>(imageView);
}
// Method for getting bitmap is removed for code clearness
// Once complete, see if ImageView is still around and set bitmap.
@Override
protected void onPostExecute(Bitmap bitmap) {
if (imageViewReference != null && bitmap != null) {
final ImageView imageView = imageViewReference.get();
if (imageView != null) {
imageView.setImageBitmap(bitmap);
}
}
}
}
PS 예제는 Java로되어 있지만 C # 개발자가 이해할 수 있습니다.
출처 : http://developersdev.blogspot.ru/2014/01/weakreference-example.html
참고 URL : https://stackoverflow.com/questions/310685/weak-reference-benefits
'Development Tip' 카테고리의 다른 글
사람들은 왜 Java의 내장 JCE 공급자 대신 bouncycastle을 사용합니까? (0) | 2020.10.24 |
---|---|
JSON 스키마 파일 확장명 (0) | 2020.10.24 |
Django 1.3 이하의 Django Admin에서 사용자 지정 필터 (0) | 2020.10.24 |
git에서 하위 디렉토리를 어떻게 병합합니까? (0) | 2020.10.24 |
SQL Server에서 날짜 + 시간에서 날짜를 얻는 가장 효율적인 방법은 무엇입니까? (0) | 2020.10.23 |