2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
स्मृति-प्रहारः अल्पकाले एव बहूनां वस्तूनाम् निर्माणं विनाशं च निर्दिशति, यस्य परिणामेण बहुधा कचरा-संग्रहणं (Garbage Collection, GC) क्रियाकलापाः भवन्ति एषा नित्यं GC क्रियाकलापः बहु CPU संसाधनं गृह्णाति तथा च अनुप्रयोगविलम्बः अथवा कार्यक्षमतायाः अवनतिं जनयितुं शक्नोति ।
कार्यप्रदर्शनम् : स्मृतिवक्रं दन्तयुक्तं भवति ।
स्मृति-लीकः तदा भवति यदा कश्चन अनुप्रयोगः तेषां वस्तूनाम् सन्दर्भान् धारयति येषां आवश्यकता नास्ति, येन एतानि वस्तूनि कचरा-संग्राहकेन पुनः न प्रयुज्यन्ते, अतः स्मृतिस्थानं गृह्णाति यत् मुक्तं भवितुम् अर्हति स्म कालान्तरे स्मृतिलीकस्य परिणामः न्यूनाधिकं न्यूनतया उपलब्धं स्मृतिः भवति, यत् अन्ते अनुप्रयोगस्य दुर्घटना अथवा कार्यक्षमतायाः अवनतिं जनयितुं शक्नोति ।
स्मृति-अतिप्रवाहः तदा भवति यदा कश्चन अनुप्रयोगः अधिकं स्मृतिस्थानं आवंटयितुं प्रयतते, परन्तु प्रणाली अनुरोधं पूरयितुं असमर्था भवति यतोहि आवंटनार्थं पर्याप्तं स्मृतिस्थानं नास्ति एतेन प्रायः अनुप्रयोगः OutOfMemoryError अपवादं क्षिपति ।
जावा स्मृतिसंरचना: ढेरः, आभासीयन्त्रस्य ढेरः, विधिक्षेत्रः, कार्यक्रमगणकः, स्थानीयविधिढेरः ।
जावा स्मृतिपुनःप्रयोगस्य एल्गोरिदम् : १.
मार्क-क्लियर एल्गोरिदमस्य दोषाः : चिह्नीकरणं क्लियरिंग् च कुशलं न भवति तथा च बहूनां असंततस्मृतिखण्डानां उत्पादनं करिष्यति ।
प्रतिकृति एल्गोरिदम् : कार्यान्वयनार्थं सरलं चालयितुं च कुशलम्। हानिः - अन्तरिक्षस्य अर्धं अपव्ययितम्।
मार्क-कम्पैक्ट एल्गोरिदम् : मार्क-क्लीन इत्यस्य कारणेन स्मृतिविखण्डनं परिहरन्तु तथा च प्रतिलिपि एल्गोरिदम् इत्यस्य स्थानं अपव्ययितुं परिहरन्तु ।
एण्ड्रॉयड् मेमोरी लोचदारविनियोगः, आवंटनमूल्यं, अधिकतममूल्यं च विशिष्टयन्त्रैः प्रभावितं भवति ।
डालविक् रीसाइक्लिंग एल्गोरिदम् तथा एआरटी रीसाइक्लिंग एल्गोरिदम् इत्येतौ द्वौ अपि एण्ड्रॉयड् ऑपरेटिंग् सिस्टम् इत्यस्मिन् स्मृतिप्रबन्धनार्थं प्रयुक्तौ कचरासंग्रहणतन्त्रौ स्तः ।
डालविक पुनर्चक्रण एल्गोरिदम् : १.
कला पुनःप्रयोग एल्गोरिदम् : १.
एलएमके तन्त्रम् : १.
public class ShakeActivity extends AppCompatActivity {
private static Handler mHandler = new Handler() {
@Override
public void handleMessage(@NonNull Message msg) {
super.handleMessage(msg);
String str = "";
for (int i = 0; i < 10000000; i++) {
str += i;
}
mHandler.sendEmptyMessageDelayed(1, 30);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_shake);
}
public void startClick(View view) {
mHandler.sendEmptyMessage(1);
}
@Override
protected void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);
}
}
मेमोरी प्रोफाइलर स्मृतिविनियोगान् द्रष्टुं शक्नोति, "Record Java/Kotlin allocations" इत्यत्र क्लिक् कुर्वन्तु ।
उपर्युक्तस्य अर्थः : १.
निम्नलिखितार्थाः- १.
malloc()
वाnew
संचालकेन आवंटितानां वस्तूनाम् संख्या ।free()
वाdelete
संचालकेन विनियोगितानां वस्तूनाम् संख्या ।उपर्युक्तचित्रस्य विश्लेषणम् : १.
अस्मिन् क्षेत्रे Allocations तथा Deallocations इत्येतयोः मूल्यानि तुल्यकालिकरूपेण समानानि सन्ति, तथा च Shallow Size तुल्यकालिकरूपेण विशालः अस्ति, यत् सूचयति यत् वस्तुनि बहुधा निर्मिताः नष्टाः च भवितुम् अर्हन्ति
क्लिक् कृत्वा, भवान् call stack सूचनां द्रष्टुं शक्नोति, तथा च code इत्यनेन सह मिलित्वा, Handler मध्ये memory jitter समस्या अस्ति इति अनुमानं कर्तुं शक्नोति ।
public class CallbackManager {
public static ArrayList<Callback> sCallbacks = new ArrayList<>();
public static void addCallback(Callback callback) {
sCallbacks.add(callback);
}
public static void removeCallback(Callback callback) {
sCallbacks.remove(callback);
}
}
public class LeakActivity extends AppCompatActivity implements Callback {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_leak);
ImageView imageView = findViewById(R.id.imageView);
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.splash);
imageView.setImageBitmap(bitmap);
CallbackManager.addCallback(this);
}
@Override
public void onOperate() {
}
}
आश्रितपुस्तकालयाः योजयन्तु : १.
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.14'
स्मृतिलीकस्य अनन्तरं LeakCanary प्रासंगिकसूचनाः जनयिष्यति स्वयमेव च डम्पं करिष्यति:
यथा उपरिष्टात् चित्रात् दृश्यते: LeakActivity इत्यत्र स्मृतिलीकः अस्ति, सन्दर्भशृङ्खलासम्बन्धः च प्रदर्शितः भवति ।
अवश्यं, भवान् hprof सञ्चिकां जनयित्वा Profiler tool इत्यस्य माध्यमेन विशिष्टसूचनाः अपि द्रष्टुं शक्नोति:
यथा उपरिष्टात् चित्रात् दृश्यते: LeakActivity सहितं 10 लीक-बिन्दवः अभवन्, स्मृति-लीक-वस्तुं द्रष्टुं, सन्दर्भ-शृङ्खलायाः जाँचार्थं च LeakActivity इत्यत्र क्लिक् कुर्वन्तु ।
यदि भवान् Bitmap इत्यस्य उपयोगानन्तरं चित्रसम्पदां न मुञ्चति तर्हि तस्य कारणं सुलभम्स्मृति लीकं भवति, यस्य परिणामेण स्मृतिः अतिप्रवाहः भवति。
स्मृतिपुनःप्रयोगः : १.
Bitmap.recycle()
Bitmap पुनःप्रयोगं कुर्वन्तु।बिटमैप पिक्सेल विन्यासः १.
Config | कब्जाकृतः बाइट् आकारः (बाइट्) २. | दृष्टान्तरूपेण दर्शयतु |
---|---|---|
आल्फा_८ | 1 | एकल पारदर्शी चैनल |
आरजीबी_५६५ | 2 | सरल आरजीबी टिंट |
एआरजीबी_८८८८ | 4 | २४-बिट् सत्या वर्णः |
आरजीबीए_एफ16 | 8 | एण्ड्रॉयड् ८.० नवीनम् (HDR) २. |
Btimap द्वारा आक्रान्तस्मृतेः गणनां कुर्वन्तु:
संसाधनसञ्चिकासमस्या : १.
परीक्षणसङ्केतः : १.
private void printBitmap(Bitmap bitmap, String drawable) {
String builder = drawable +
" Bitmap占用内存:" +
bitmap.getByteCount() +
" width:" +
bitmap.getWidth() +
" height:" +
bitmap.getHeight() +
" 1像素占用大小:" +
getByteBy1px(bitmap.getConfig());
Log.e("TAG", builder);
}
private int getByteBy1px(Bitmap.Config config) {
if (Bitmap.Config.ALPHA_8.equals(config)) {
return 1;
} else if (Bitmap.Config.RGB_565.equals(config)) {
return 2;
} else if (Bitmap.Config.ARGB_8888.equals(config)) {
return 4;
}
return 1;
}
// 逻辑密度
float density = metrics.density;
// 物理密度
int densityDpi = metrics.densityDpi;
Log.e("TAG", density + "-" + densityDpi);
// 1倍图
Bitmap bitmap1 = BitmapFactory.decodeResource(getResources(), R.drawable.splash1);
printBitmap(bitmap1, "drawable-mdpi");
// 2倍图
Bitmap bitmap2 = BitmapFactory.decodeResource(getResources(), R.drawable.splash2);
printBitmap(bitmap2, "drawable-xhdpi");
// 3倍图
Bitmap bitmap3 = BitmapFactory.decodeResource(getResources(), R.drawable.splash3);
printBitmap(bitmap3, "drawable-xxhdpi");
// 4倍图
Bitmap bitmap4 = BitmapFactory.decodeResource(getResources(), R.drawable.splash4);
printBitmap(bitmap4, "drawable-xxxhdpi");
// drawable
Bitmap bitmap5 = BitmapFactory.decodeResource(getResources(), R.drawable.splash);
printBitmap(bitmap5, "drawable");
/*
3.0-480
drawable-mdpi Bitmap占用内存:37127376 width:2574 height:3606 1像素占用大小:4
drawable-xhdpi Bitmap占用内存:9281844 width:1287 height:1803 1像素占用大小:4
drawable-xxhdpi Bitmap占用内存:4125264 width:858 height:1202 1像素占用大小:4
drawable-xxxhdpi Bitmap占用内存:2323552 width:644 height:902 1像素占用大小:4
drawable Bitmap占用内存:37127376 width:2574 height:3606 1像素占用大小:4
*/
दृष्टान्तरूपेण दर्शयतु : १.
mdpi उपकरणेषु 1dpxhdpi उपकरणेषु 1px, 1dpxxhdpi उपकरणे 2px, 1dp==3px ।
अतः वर्तमानं यन्त्रं xxhdpi अस्ति, अतः xxhdpi संसाधनस्य अधः समानस्य चित्रस्य विस्तारः ८५८, mdpi संसाधनस्य अन्तर्गतं तस्य ३ गुणाः विस्तारः भविष्यति तथा च विस्तारः २५७४ अस्ति, तथा च xhdpi संसाधनस्य अधः १.५ गुणाः वर्धितः भविष्यति तथा च विस्तारः १२८७ अस्ति ।