์ฐ๋ฆฌ ์์ฉ ํ๋ก๊ทธ๋จ์์ ์ฒ๋ฆฌํ๋ ๋ชจ๋ Bitmaps์ ๋ํด gradle( 1.1.0
)์ ํตํด fresco lib๋ฅผ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ ์ ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฌ์ฉํ ํ ์์ฃผ OOM์ ๋ฐ์์ํค๊ณ , ์ฐ๋ฆฌ ์์ฉ ํ๋ก๊ทธ๋จ์ ํ ๋ฒ์ ๋ง์ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํฉ๋๋ค. 8- 10๊ฐ์ ์ด๋ฏธ์ง(๋ชจ๋ ๊ฐ์ ํฌ๊ธฐ๋ ์๋๋ฉฐ ์ผ๋ถ๋ ํ๋ฉด์ ์ ๋ฐ์ ๋ฎ๊ณ ์ผ๋ถ๋ 50-70dp์ ํฌ๊ธฐ๋ง ์ฐจ์งํจ)๊ฐ ๋จ์ผ ํ๋ฉด์ ํ์๋๊ณ ๋ชจ๋ ํ๋ ์ค์ฝ๋ฅผ ์ฌ์ฉํ์ฌ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ก๋๋๋ฉฐ,
์ฌ์ฉ๋๋ ๋๋ถ๋ถ์ ์ด๋ฏธ์ง๋ ListView, GridView, RecyclerView์ ๊ฐ์ ์คํฌ๋กค ๊ฐ๋ฅํ ๊ตฌ์ฑ ์์์ ํจ๊ป ์ฌ์ฉ๋๋ ๋ฐ๋ฉด ์ผ๋ถ ์ด๋ฏธ์ง๋ ์์ฒด ๋ก์ง์ ํตํด ์ฌํ์ฉ๋๋ฉฐ ์๋๋ ๋์ผํ ๊ตฌํ์ ๋๋ค.
๋ฉ๋ชจ:
setDownsampleEnabled
์ฌ์ฉํ์ฌ ์ด๊ธฐํ๋ฉ๋๋ค.resized
์ด์ง๋ง ์ผ๋ถ ์ด๋ฏธ์ง๋ .png
์ ํ์ด์ง๋ง ๋๋ถ๋ถ์ jpeg
ํ์์
๋๋ค.์ถฉ๋ ๋ก๊ทธ
03-15 22:21:21.199 7035-7203/com.xyz E/AndroidRuntime: FATAL EXCEPTION: Thread-442
Process: com.xyz, PID: 7035
java.lang.OutOfMemoryError: Failed to allocate a 1638412 byte allocation with 589552 free bytes and 575KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:831)
at android.graphics.Bitmap.createBitmap(Bitmap.java:808)
at android.graphics.Bitmap.createBitmap(Bitmap.java:775)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java:55)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java:30)
at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:259)
at com.facebook.imagepipeline.platform.ArtDecoder.decodeStaticImageFromStream(ArtDecoder.java:137)
at com.facebook.imagepipeline.platform.ArtDecoder.decodeJPEGFromEncodedImage(ArtDecoder.java:120)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decodeJpeg(DefaultImageDecoder.java:183)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder$1.decode(DefaultImageDecoder.java:63)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decode(DefaultImageDecoder.java:123)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.doDecode(DecodeProducer.java:239)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.access$200(DecodeProducer.java:111)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder$1.run(DecodeProducer.java:144)
at com.facebook.imagepipeline.producers.JobScheduler.doJob(JobScheduler.java:207)
at com.facebook.imagepipeline.producers.JobScheduler.access$000(JobScheduler.java:27)
at com.facebook.imagepipeline.producers.JobScheduler$1.run(JobScheduler.java:78)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
at java.lang.Thread.run(Thread.java:818)
03-15 22:44:53.849 8055-8055/com.xyz E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.xyz, PID: 8055
android.view.InflateException: Binary XML file line #2: Binary XML file line #2: Error inflating class <unknown>
at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
at com.xyz.view.newswipe.view.FbLikesGridView$FbLikesAdapter.onCreateViewHolder(FbLikesGridView.java:195)
at com.xyz.view.newswipe.view.FbLikesGridView$FbLikesAdapter.onCreateViewHolder(FbLikesGridView.java:160)
at android.support.v7.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:6319)
at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5507)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5392)
at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5388)
at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2149)
at android.support.v7.widget.GridLayoutManager.layoutChunk(GridLayoutManager.java:556)
at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1496)
at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:593)
at android.support.v7.widget.GridLayoutManager.onLayoutChildren(GridLayoutManager.java:170)
at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3535)
at android.support.v7.widget.RecyclerView.onMeasure(RecyclerView.java:2979)
at android.view.View.measure(View.java:18788)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
at android.view.View.measure(View.java:18788)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1112)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:632)
at android.view.View.measure(View.java:18788)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
at android.view.View.measure(View.java:18788)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1112)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:632)
at android.view.View.measure(View.java:18788)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
at android.view.View.measure(View.java:18788)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
at android.view.View.measure(View.java:18788)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:18788)
at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:715)
at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:461)
at android.view.View.measure(View.java:18788)
at android.view.ViewGroup.measureChildWithMargins(ViewG
[FILL THIS OUT: ์ด๋ป๊ฒ ๋ฒ๊ทธ๋ฅผ ์ฌํํ ์ ์์ต๋๊น? ๊ฐ๋ฅํ๋ฉด ๊ด๋ จ ์ด๋ฏธ์ง ๋๋ ์ํ ํ๋ก์ ํธ์ ๋ํ URL์ ์ ๊ณตํ์ญ์์ค.]
[์ ํ ์ฌํญ: ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฌด์์ ํด์ผ ํ๋์ง ์๊ณ ์์ต๋๊น? ์ด์์ ์ผ๋ก๋ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ํ ๋ฆฌํ์คํธ๋ฅผ ์ ๊ณตํ์ธ์.]
์ด๊ฒ์ด ์ฐ๋ฆฌ๊ฐ ํ๋ ์ค์ฝ๋ฅผ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ImagePipelineConfig imagePipelineConfig = ImagePipelineConfig
.newBuilder(getApplicationContext())
.setDownsampleEnabled(true)
.setBitmapMemoryCacheParamsSupplier(new FrescoCacheParams(activityManager))
.build();
Fresco.initialize(getApplicationContext(), imagePipelineConfig);
์ด๊ฒ์ด FrescoCacheParams
ํด๋์ค๊ฐ ์ ์๋๋ ๋ฐฉ์์
๋๋ค.
public class FrescoCacheParams implements Supplier<MemoryCacheParams> {
private ActivityManager activityManager;
public FrescoCacheParams(ActivityManager activityManager) {
this.activityManager = activityManager;
}
<strong i="17">@Override</strong>
public MemoryCacheParams get() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
int cacheSize = getMaxCacheSize();
Log.d("####","fresco cache size = " + cacheSize);
return new MemoryCacheParams(cacheSize, 1, 1, 1, 1);
} else {
return new MemoryCacheParams(
getMaxCacheSize(),
256,
Integer.MAX_VALUE,
Integer.MAX_VALUE,
Integer.MAX_VALUE);
}
}
private int getMaxCacheSize() {
final int maxMemory = Math.min(activityManager.getMemoryClass()
* ByteConstants.MB, Integer.MAX_VALUE);
if (maxMemory < 32 * ByteConstants.MB) {
return 4 * ByteConstants.MB;
} else if (maxMemory < 64 * ByteConstants.MB) {
return 6 * ByteConstants.MB;
} else {
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD) {
return 8 * ByteConstants.MB;
} else {
return maxMemory / 6;
}
}
}
}
์ด๊ฒ์ด ๋ชจ๋ ์ด๋ฏธ์ง๊ฐ ๋ก๋๋๋ ๋ฐฉ์์
๋๋ค. ์ฌ๊ธฐ์ width
๋ฐ height
๋ ๋ก๋๋ ์ด๋ฏธ์ง๋ฅผ ํ์ํ ๋ทฐ์ ์ค์ ํฌ๊ธฐ์
๋๋ค.
ImageRequest request = ImageRequestBuilder.newBuilderWithSource(uri)
.setResizeOptions(new ResizeOptions(width, height))
.build();
DraweeController controller = Fresco.newDraweeControllerBuilder()
.setOldController(getController())
.setImageRequest(request)
.build();
setController(controller);
์๋๋ AdapterView
์ ์ฌ์ฉ์ ์ ์ ๊ตฌํ์ด ์์ผ๋ฏ๋ก ์ฌํ์ฉ ๋ก์ง์ ์ค๋ํซ์
๋๋ค. ๋ฆฌ์์ค ํด์ ๋ฅผ ์ฒ๋ฆฌํ๊ณ ์์ต๋๋ค.
// calling on each Drawee, once it moves out of visible area
if (getController() != null) {
getController().onDetach();
}
````
// once a image moves out of display area, we are evicting it out of pipeline as well.
ImagePipeline imagePipeline = Fresco.getImagePipeline();
Uri uri = Uri.parse(url);
imagePipeline.evictFromMemoryCache(uri);
```
์ฐ๋ฆฌ๋ ๋ชจ๋์ ์์ ์ฝ๋๋ฅผ ํธ์ถํ๋ Drawee's
๊ทธ๋ค์ด ์ฐ๋ฆฌ์ ๋ณผ ์์๋ ์์ญ ๋ฐ์ผ๋ก ์ด๋ํ๋ฉด, ์นด๋์์ ๋ด ์ด๋ฏธ์ง๋ฅผ ํ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ AdapterView
์๋ ํ์ธ์ @nucleartip , ๋ฒ๊ทธ ๋ณด๊ณ ์๋ฅผ ์ ์ถํด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค!
OOM์ด ๋ฐ์ํ๊ธฐ ์ ์ ๋ฉ๋ชจ๋ฆฌ ๋คํ๋ฅผ ์บก์ฒํ์ฌ ๋ฌด์์ด ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํด๋ณด์ จ์ต๋๊น?
๊ทธ๊ฑด ๊ทธ๋ ๊ณ , Lollipop ์ด์์ ๊ฒฝ์ฐ maxCacheEntrySize=1์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค. ์ด๊ฒ์ ๋ฉ๋ชจ๋ฆฌ ์บ์๋ฅผ ์์ ํ ๋นํ์ฑํํ๋ ค๋ ์๋์ ๋๊น ์๋๋ฉด ๋จ์ผ ํญ๋ชฉ์ผ๋ก ์ ํํ๋ ค๋ ์๋์ ๋๊น?
@erikandre ํฐ ๋๊ธฐ์ด ํฌ๊ธฐ๋ก
๋คํ๋ฅผ ์ ๊ณตํ๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด OOM์ด Samsung S7, ์ต์ Nexus ์๋ฆฌ์ฆ ์ ํ ๋ฑ๊ณผ ๊ฐ์ ์ต์ ์ธ๋ ์ฅ์น์์ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ๊ฒฝ์ฐ์๋ ์ด์ ๋ํ ๋ช ๊ฐ์ง ํด๊ฒฐ ๋ฐฉ๋ฒ์ ์ ์ํ ์ ์์ต๋๋ค.
@erikandre ๋ OOM์ผ๋ก ์ธํด ์ฑ์ด ์ถฉ๋ํ๊ธฐ ์ง์ ์ ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ๋คํ์ ์ค๋ ์ท์ ๋๋ค.
@nucleartip , ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๋คํ๋ฅผ ๋์ ๊ณต์ ํ ์ ์์ต๋๊น?
@erikandre ํ ๋คํ ํฌ๊ธฐ๋ ์ฝ
@nucleartip ๋ ์ค ํ๋๊ฐ ์ ์๋ํฉ๋๋ค :)
์์ง ํด๊ฒฐ๋์ง ์์๋์? ๊ฐ์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
Eclipse Memory Analyzer๋ก ๋ฉ๋ชจ๋ฆฌ ๋คํ๋ฅผ ํ์ธํ์ต๋๋ค.
์ ๋ byte[]๋ฅผ ๋๋ฌด ๋ง์ด ๋ดค์ต๋๋ค.
๊ทธ๋ฌ๋ GC ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ ๋ ์ฐธ์กฐ๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค.
๊ทธ๊ฒ๋ค์ NativePooledByteBuffer ๋๋ NativeMemoryChunk์ ๊ฐ์ ๋ค์ดํฐ๋ธ์์ ์ฐธ์กฐ๋๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋๋ ๊ทธ๊ฒ๋ค์ด com.facebook.common.references.SharedReference.sLiveObjects์ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ฆ๊ฑฐ๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ ์ถ์๊ฐ ์๋๋์ง ๋ชจ๋ฅด๊ฒ ๋ค์...
์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
๋ํ ๋์ผํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค. ๋ค์์ ์์ธ ์ ๋ณด์ ๋๋ค.
E/AndroidRuntime: FATAL EXCEPTION: Thread-5458 Process:
package-name, PID: 4877
java.lang.OutOfMemoryError: Failed to allocate a 2560012 byte allocation with 1782384 free bytes and 1740KB until OOM
at dalvik.system.VMRuntime.newNonMovableArray(Native Method)
at android.graphics.Bitmap.nativeCreate(Native Method)
at android.graphics.Bitmap.createBitmap(Bitmap.java:843)
at android.graphics.Bitmap.createBitmap(Bitmap.java:820)
at android.graphics.Bitmap.createBitmap(Bitmap.java:787)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java:55)
at com.facebook.imagepipeline.memory.BitmapPool.alloc(BitmapPool.java:30)
at com.facebook.imagepipeline.memory.BasePool.get(BasePool.java:260)
at com.facebook.imagepipeline.platform.ArtDecoder.decodeStaticImageFromStream(ArtDecoder.java:137)
at com.facebook.imagepipeline.platform.ArtDecoder.decodeJPEGFromEncodedImage(ArtDecoder.java:120)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decodeJpeg(DefaultImageDecoder.java:186)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder$1.decode(DefaultImageDecoder.java:63)
at com.facebook.imagepipeline.decoder.DefaultImageDecoder.decode(DefaultImageDecoder.java:126)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.doDecode(DecodeProducer.java:240)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder.access$200(DecodeProducer.java:112)
at com.facebook.imagepipeline.producers.DecodeProducer$ProgressiveDecoder$1.run(DecodeProducer.java:145)
at com.facebook.imagepipeline.producers.JobScheduler.doJob(JobScheduler.java:207)
at com.facebook.imagepipeline.producers.JobScheduler.access$000(JobScheduler.java:27)
at com.facebook.imagepipeline.producers.JobScheduler$1.run(JobScheduler.java:78)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
at com.facebook.imagepipeline.core.PriorityThreadFactory$1.run(PriorityThreadFactory.java:43)
at java.lang.Thread.run(Thread.java:818)
์ด๊ฒ์ OOM์ด ๋ฐ์ํ๊ธฐ ์ ์ ๋ชจ๋ GC ์ ๋ณด์ ๋๋ค.
I/art: Starting a blocking GC Alloc
I/art: Starting a blocking GC Alloc
I/art: Alloc sticky concurrent mark sweep GC freed 92215(9MB) AllocSpace objects, 36(660KB) LOS objects, 8% free, 117MB/128MB, paused 1.228ms total 37.123ms
I/art: Starting a blocking GC Alloc
I/art: Starting a blocking GC Alloc
I/art: Waiting for a blocking GC Alloc
I/art: Clamp target GC heap from 188MB to 128MB
I/art: Alloc partial concurrent mark sweep GC freed 45395(2MB) AllocSpace objects, 43(860KB) LOS objects, 3% free, 124MB/128MB, paused 727us total 59.648ms
I/art: WaitForGcToComplete blocked for 25.090ms for cause Alloc
I/art: Starting a blocking GC Alloc
I/art: Starting a blocking GC Alloc
I/art: Starting a blocking GC Alloc
W/art: Suspending all threads took: 5.155ms
I/art: Waiting for a blocking GC Alloc
I/art: Alloc sticky concurrent mark sweep GC freed 2803(277KB) AllocSpace objects, 2(40KB) LOS objects, 0% free, 126MB/128MB, paused 579us total 19.249ms
I/art: Starting a blocking GC Alloc
I/art: Waiting for a blocking GC Alloc
I/art: Alloc sticky concurrent mark sweep GC freed 822(87KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 126MB/128MB, paused 547us total 12.316ms
I/art: WaitForGcToComplete blocked for 11.410ms for cause Alloc
I/art: Starting a blocking GC Alloc
I/art: Waiting for a blocking GC Alloc
I/art: Clamp target GC heap from 190MB to 128MB
I/art: Alloc partial concurrent mark sweep GC freed 4725(241KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 126MB/128MB, paused 658us total 46.759ms
I/art: WaitForGcToComplete blocked for 46.699ms for cause Alloc
I/art: Starting a blocking GC Alloc
I/art: Waiting for a blocking GC Alloc
I/art: Clamp target GC heap from 190MB to 128MB
I/art: Alloc concurrent mark sweep GC freed 801(78KB) AllocSpace objects, 0(0B) LOS objects, 0% free, 126MB/128MB, paused 796us total 40.098ms
I/art: WaitForGcToComplete blocked for 35.773ms for cause Alloc
I/art: Starting a blocking GC Alloc
I/art: Forcing collection of SoftReferences for 2MB allocation
I/art: Waiting for a blocking GC Alloc
I/art: Waiting for a blocking GC Alloc
I/art: Clamp target GC heap from 191MB to 128MB
I/art: Alloc concurrent mark sweep GC freed 3661(366KB) AllocSpace objects, 1(20KB) LOS objects, 0% free, 127MB/128MB, paused 634us total 61.758ms
I/art: WaitForGcToComplete blocked for 60.363ms for cause Alloc
I/art: Starting a blocking GC Alloc
I/art: Waiting for a blocking GC Alloc
W/art: Suspending all threads took: 38.816ms
/I/art: Forcing collection of SoftReferences for 2MB allocation
/I/art: Waiting for a blocking GC Alloc
/I/art: Clamp target GC heap from 190MB to 128MB
/I/art: Alloc concurrent mark sweep GC freed 214(8KB) AllocSpace objects, 1(416KB) LOS objects, 0% free, 126MB/128MB, paused 876us total 42.655ms
/I/art: WaitForGcToComplete blocked for 82.057ms for cause Alloc
/I/art: Starting a blocking GC Alloc
/I/art: Starting a blocking GC Alloc
/W/art: Throwing OutOfMemoryError "Failed to allocate a 2560012 byte allocation with 1643888 free bytes and 1605KB until OOM"
/I/art: Waiting for a blocking GC Alloc
/I/art: Clamp target GC heap from 190MB to 128MB
/I/art: Alloc concurrent mark sweep GC freed 12633(1496KB) AllocSpace objects, 0(0B) LOS objects, 1% free, 126MB/128MB, paused 684us total 43.271ms
/I/art: WaitForGcToComplete blocked for 136.549ms for cause Alloc
/I/art: Starting a blocking GC Alloc
/I/art: Waiting for a blocking GC Alloc
/I/art: Waiting for a blocking GC Alloc
/I/art: Forcing collection of SoftReferences for 2MB allocation
/I/art: Waiting for a blocking GC Alloc
/I/art: Clamp target GC heap from 190MB to 128MB
/I/art: Alloc concurrent mark sweep GC freed 2239(265KB) AllocSpace objects, 0(0B) LOS objects, 1% free, 126MB/128MB, paused 1.282ms total 40.182ms
/I/art: WaitForGcToComplete blocked for 120.837ms for cause Alloc
/I/art: Starting a blocking GC Alloc
/I/art: Waiting for a blocking GC Alloc
/I/art: Waiting for a blocking GC Alloc
/I/art: Forcing collection of SoftReferences for 2MB allocation
/I/art: Waiting for a blocking GC Alloc
/W/art: Suspending all threads took: 30.572ms
/I/art: Clamp target GC heap from 190MB to 128MB
/I/art: Alloc concurrent mark sweep GC freed 7(1264B) AllocSpace objects, 0(0B) LOS objects, 1% free, 126MB/128MB, paused 2.697ms total 43.668ms
/I/art: WaitForGcToComplete blocked for 129.040ms for cause Alloc
/I/art: Starting a blocking GC Alloc
/I/art: WaitForGcToComplete blocked for 83.495ms for cause Alloc
/I/art: Starting a blocking GC Alloc
/I/art: Waiting for a blocking GC Alloc
/W/art: Throwing OutOfMemoryError "Failed to allocate a 2560012 byte allocation with 1782384 free bytes and 1740KB until OOM"
/I/art: Waiting for a blocking GC Alloc
/I/art: Waiting for a blocking GC Alloc
1 ์ถฉ๋ํ๊ธฐ ์ ์ ์ฒซ ๋ฒ์งธ ํ์ด์ง์์ Viewpager + RecyclerView ํ์ด์ง๋ฅผ ์ฝ๋๋ค.
์ฝ 20์ฅ์ ์ฌ์ง์ด ์์ต๋๋ค.
2 ์ถฉ๋ํ๊ธฐ ์ ์ ์ฒ์ ๋ ํ์ด์ง์์ Viewpager + RecyclerView ํ์ด์ง๋ฅผ ์ฝ๋๋ค.
์ฝ 40์ฅ์ ์ฌ์ง์ด ์์ผ๋ฉฐ, ํธ์ถ๊ธฐ์ ์์ชฝ์ ์๋ Viewpager์๋ ๊ฐ๊ฐ 30์ฅ์ ์ฌ์ง์ด ์์ต๋๋ค.
3 ์ถฉ๋ ํ:
ํนํ ์ฌ์ฉ ๊ฐ๋ฅํ RAM์ด ๋ ๋ง์ ์ต์ ์ฅ์น์์ ์ด๋ฌํ ํ์์ด ์ ์ ๋ ์์ฃผ ๋ํ๋ฉ๋๋ค. ๋ ๋ง์ RAM Fresco๊ฐ OOM์ ๋ ์์ฃผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค.
๋ด ๊ตฌ์ฑ์ ๊ธฐ๋ณธ ๊ตฌ์ฑ์ด์ง๋ง(์์ง ๊ณต๊ธ์ ์ฒด๋ฅผ ๊ตฌํํ๋ ค๊ณ ์๋ํ์ง ์์) ์ด๊ฒ์ด ๋ง์ ๋์์ด ๋ ๊ฒ์ธ์ง ์ฌ๊ฐํ๊ฒ ์์ฌ๋ฉ๋๋ค(์ต๋ ์บ์ ํญ๋ชฉ์ 0์ผ๋ก ์ค์ ํ์ฌ ์บ์๋ฅผ ์์ ํ ๋นํ์ฑํํ์ง ์๋ ํ).
์ฐ๋ฆฌ๊ฐ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ์๊ณ ์์ต๋๊น?
@mradzinski ๊ฒฐ๊ตญ Glide
๋ก ์์ ํ ํฌํ
ํ์ฌ OOM์์ ๋ฌด๋ฃ๋ก ์ฑ์ ์ ์ธํ์ต๋๋ค.
@nucleartip ์ฌ๋ฏธ์๋ ์ฌ์ค์ OOM์ Glide๊ฐ ์ ๊ณตํ๋ ์์ฒญ๋ ์์ ๊ฐ์ํ ๋ Glide์์ Fresco๋ก ๋ชจ๋ ๊ฒ์ ํฌํ ํ๋ฉด์ ์๋ค๋ ๊ฒ์ ๋๋ค...
์กฐ์ฌ๋ฅผ ๊ณ์ํ๊ธฐ์๋ ์ ๋ณด๊ฐ ์ถฉ๋ถํ์ง ์์ผ๋ฏ๋ก ๋ซ์ต๋๋ค.
๊ธฐํ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ๋ฌธ์ ์ ๊ฒฝ์ฐ ์ ์์
์ ๋ง๋ค๊ณ ๊ฐ๊ธ์ ์ด๋ฉด HPROF ๋ฉ๋ชจ๋ฆฌ ๋คํ๋ฅผ ํฌํจํ์ญ์์ค.
@erikandre
OOM ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ์ ์ ๋ณด๊ฐ ์ถฉ๋ถํ์ง ์๋ค๋ ๊ฒ์ ์๊ณ ์์ต๋๋ค. OOM ์ค๋ฅ๋ฅผ ๋์ง๋ ๋์ ์ฝ๋ฐฑ์ผ๋ก ์ค๋ฅ ์ด๋ฒคํธ๋ฅผ ๊ฒ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค. OOM ์ด๋ฒคํธ๋ฅผ ์ง์ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
@AlexCJW OOM๊ณผ ๊ฐ์ ์์คํ ์์ ๋ฐ์ํ ์์ธ๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋ํ ํด๋น ์ฝ๋ฐฑ ์ดํ OOM์ ์์ ํ ํ ์ฑ์ด ์ฝ๋ฐฑ์ ์๋ตํ ์ ์๋ ์๋๋ฆฌ์ค๋ฅผ ์๊ฐํ ์ ์์ต๋๋ค. ๊ฒฐ๊ตญ ์ฌ์ฉํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ๋ ์๋นํด์ผ ํฉ๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
@nucleartip ์ฌ๋ฏธ์๋ ์ฌ์ค์ OOM์ Glide๊ฐ ์ ๊ณตํ๋ ์์ฒญ๋ ์์ ๊ฐ์ํ ๋ Glide์์ Fresco๋ก ๋ชจ๋ ๊ฒ์ ํฌํ ํ๋ฉด์ ์๋ค๋ ๊ฒ์ ๋๋ค...