android内存优化详解
- 格式:doc
- 大小:467.00 KB
- 文档页数:20
Android应用内存优化与性能调优技巧第一章:内存管理基础Android应用内存管理是确保应用平稳运行的重要环节,开发者需要了解内存管理的基础知识,以便进行有效的优化和调优。
在本章中,我们将介绍Android应用的内存管理原理、内存泄漏和内存溢出的区别以及常见的内存优化工具和技巧。
1.1 Android应用内存管理原理在Android应用中,每个应用都有一定的内存限制,称为最大堆(Max Heap)。
Android系统通过垃圾回收机制(GC)来回收未使用的内存,使其可供其他应用或系统使用。
内存管理器(Memory Manager)会根据应用的内存需求,动态分配和回收内存。
1.2 内存泄漏与内存溢出的区别内存泄漏(Memory Leak)和内存溢出(Memory Overflow)是常见的内存问题。
内存泄漏是指应用持有某些资源的引用,但无法释放这些资源,导致内存的持续增长。
内存溢出是指应用所需的内存超出了系统分配的内存限制,导致应用崩溃或系统变慢。
优化内存泄漏和避免内存溢出是提高应用性能的关键。
1.3 常见的内存优化工具和技巧为了帮助开发者有效地进行内存优化,Android提供了一系列的内存优化工具和技巧。
其中包括内存分析工具(如Android Profiler和MAT)、内存优化插件(如LeakCanary和MemoryMonitor)以及一些开发技巧(如使用弱引用和使用集合类的优化)。
第二章:内存优化技巧本章将介绍一些实用的内存优化技巧,帮助开发者减少内存消耗、降低应用占用内存的风险,提高应用的性能和响应速度。
2.1 减少内存消耗的技巧在开发应用时,可以采取以下技巧来减少内存消耗:- 使用资源引用(Resource References)来引用大型资源,减少内存占用;- 优化图像资源的大小和压缩方式,减少内存占用;- 使用懒加载(Lazy Loading)来延迟加载大型资源,减少应用启动时的内存占用。
Android应用性能测试从CPU到内存全方位分析在进行Android应用性能测试时,从CPU到内存的全方位分析是非常重要的。
这种分析可以帮助开发者确定应用程序的性能瓶颈,并优化其性能,以提供更好的用户体验。
本文将探讨如何进行Android应用性能测试,并针对性能测试的各个方面进行详细分析。
一、CPU性能测试1.1 硬件环境准备在进行CPU性能测试之前,需要提前准备好测试环境。
首先,确保使用一台配置较高的Android手机或使用模拟器。
其次,关闭所有后台运行的应用程序,以确保测试结果的准确性。
1.2 测试工具选择Android平台上有许多可用于测试CPU性能的工具,比如AnTuTu Benchmark、Geekbench等。
开发者可以根据实际需求选择合适的工具。
1.3 测试指标及结果分析在进行CPU性能测试时,开发者需要关注以下指标:- 单核性能:测试设备在单核处理器上的性能表现。
- 多核性能:测试设备在多核处理器上的性能表现。
- CPU温度:测试设备在高负载情况下的温度表现。
通过测试工具运行测试后,开发者可以根据得到的结果进行分析和优化。
比如,如果单核性能较低,可以考虑优化应用程序的算法或减少不必要的计算过程。
二、内存性能测试2.1 内存使用监测在进行内存性能测试之前,首先需要监测应用程序的内存使用情况。
Android平台提供了内存监测工具,如Android Profiler等。
通过监测内存使用,可以了解应用程序的内存占用情况,并找出可能存在的内存泄漏问题。
2.2 内存泄漏检测内存泄漏是Android应用开发中常见的问题之一。
为了检测内存泄漏,开发者可以使用Profiling工具来分析应用程序的堆转储文件。
通过分析堆转储文件,可以找出那些没有被垃圾回收器释放的对象,从而确定是否存在内存泄漏问题。
2.3 内存优化根据内存性能测试的结果,开发者可以进行相应的优化。
比如,可以优化应用程序的内存管理策略,减少不必要的内存占用。
Android系统的内存管理研究魏栋;谭功全;叶建平【摘要】Android系统在移动设备领域得到了越来越广泛的应用,其特有的内存管理机制是其发展的关键因素之一。
在基于Linux系统内存管理的基础上,介绍了Android系统内存管理的特点,并提出了进程优化的方法及途径。
%The Android system in mobile device field has been applied more and more, and its special memory management mechanism is one of the key factors to its development. This paper based on Linux system in the memory management is introduced on the basis of the characteristics of the Android system memory management, and puts forward the process optimization method and approach.【期刊名称】《单片机与嵌入式系统应用》【年(卷),期】2012(012)004【总页数】4页(P9-12)【关键词】Android;OOM—Killer;低内存管理;内存管理【作者】魏栋;谭功全;叶建平【作者单位】四川理工学院,自贡643000;四川理工学院,自贡643000;四川理工学院,自贡643000【正文语种】中文【中图分类】TB511 Android系统概述Android是Google(谷歌)公司开发的一款专门为移动设备打造的操作系统。
2005年谷歌公司收购Android Inc公司后,于2007年研发了基于Linux的操作系统Android。
2008年,T-Mobile与HTC公司共同研发了第一款Android手机——HTC G1。
android底层试题答案一、填空题1. Android系统的底层是基于________内核的,它是一种开源的操作系统。
答案:Linux2. 在Android中,所有的应用都是通过________运行时环境来执行的。
答案:Dalvik3. Android四大组件包括:活动(Activity)、广播接收器(BroadcastReceiver)、服务(Service)和________。
答案:内容提供者(ContentProvider)4. Android中使用________来描述用户界面的布局。
答案:XML5. 在Android应用开发中,使用________可以管理应用程序的生命周期。
答案:LifecycleOwner二、选择题1. Android中用于后台长期运行的任务应该使用哪种服务?A. 启动服务B. 绑定服务C. 系统服务D. 异步服务答案:D2. 下列哪个文件是Android工程的配置文件?A. build.gradleB. AndroidManifest.xmlC. MainActivity.javaD. strings.xml答案:B3. 在Android中,用于处理并发操作的是哪一部分?A. 主线程B. 渲染线程C. Java线程池D. JNI层答案:C4. 以下哪个是Android中用于版本控制的命令行工具?A. SDK ManagerB. AVD ManagerC. GitD. Gradle答案:C5. 在Android应用中,如何获取当前设备的屏幕宽度?A. getResources().getDisplayMetrics().widthPixelsB. getWindowManager().getDefaultDisplay().getWidth()C. View.MeasureSpec.getSize(getWidth())D. Configuration.screenWidthDp答案:B三、简答题1. 请简述Android中的沙箱机制。
Android测试如何进行内存和性能优化Android应用程序的内存和性能优化是保证应用程序正常运行和提高用户体验的重要步骤。
本文将探讨Android测试的一些方法和工具,以帮助开发人员进行内存和性能优化。
一、内存优化测试1. 内存泄漏测试内存泄漏是指应用程序在不再使用一些对象时,没有正确释放它们所占用的内存。
通过以下步骤进行内存泄漏测试:- 使用Android的内存分析工具,如Android Profiler,检测内存泄漏问题。
- 使用内存监控工具,如LeakCanary,检测对象的生命周期是否正确管理。
2. 内存占用测试测试应用程序在不同场景下的内存占用情况,以便及时发现和解决内存问题。
可以使用以下方法进行测试:- 使用Android Profiler等工具,监测应用程序的内存占用情况。
- 测试不同设备上应用程序的内存占用情况,以确保应用程序在各种设备上都能正常运行。
二、性能优化测试1. 响应时间测试测试应用程序的响应时间,以确保用户在使用应用程序时能够得到良好的体验。
以下是一些测试方法:- 使用性能测试工具,如JMeter,对应用程序进行负载测试,模拟多用户同时访问应用程序的情况,以评估应用程序的响应速度。
- 测试应用程序在不同网络条件下的响应时间,以确保应用程序在各种网络环境下都能提供良好的用户体验。
2. CPU利用率测试测试应用程序的CPU利用率,以评估应用程序的性能。
以下是一些测试方法:- 使用性能测试工具,如MonkeyRunner,对应用程序进行压力测试,模拟大量用户同时操作应用程序,以评估应用程序的CPU利用率。
- 测试应用程序在不同设备上的CPU利用率,以确保应用程序在各种设备上都能正常运行。
3. 界面渲染性能测试测试应用程序的界面渲染性能,以确保应用程序的界面能够流畅地显示。
以下是一些测试方法:- 使用UI性能测试工具,如UI Automator,对应用程序的界面进行性能测试,评估界面渲染的速度和流畅度。
•一、App启动速度优化•二、App内存优化•三、App绘制优化•四、App瘦身•五、APP电量优化App启动速度优化一、认识启动加速含义从点击图标到用户可操作的全部过程意义避免用户一安装应用就卸载分类•冷启动•热启动•温启动过程冷启动前•1、点击相应应用图标•2、App启动之后立即展示一个空白的Window(预览窗口显示)•3、创建App进程冷启动后•1、创建App对象•2、启动Main Thread•3、创建启动的Activity对象,闪屏显示•4、创建启动的MainActivity对象,主页显示•5、其它工作二、优化工具力求获取准确的数据评估1、TraceView性能损耗太大,得出的结果并不真实作用:主要做热点分析,得到两种数据•单次执行最耗时的方法•执行次数最多的方法使用:•1、代码中添加:Debug.startMethodTracing()、检测方法、Debug.stopMethodTracing()•2、打开Profile->CPU->点击Record->点击Stop->查看Profile下方Top Down/Bottom Up找出耗时的热点方法。
2、Systrace+函数插桩Systrace原理在系统的一些关键链路(如SystemServcie、虚拟机、Binder驱动)插入一些信息(Label),通过Label的开始和结束来确定某个核心过程的执行时间,然后把这些Label信息收集起来得到系统关键路径的运行时间信息,最后得到整个系统的运行性能信息。
Android Framework里面一些重要的模块都插入了label信息(Java 层通过android.os.Trace类完成, native层通过ATrace宏完成),用户App中可以添加自定义的Lable。
特性•系统版本越高,Android Framework中添加的系统可用Label就越多,能够支持和分析的系统模块也就越多。
解析Android测试中的卡顿问题在Android应用开发过程中,卡顿问题是开发者经常面临的挑战之一。
卡顿可能导致用户体验下降,应用性能受损。
因此,解决Android 测试中的卡顿问题至关重要。
本文将对Android测试中的卡顿问题进行解析,并提供一些解决方案。
一、了解卡顿问题的原因卡顿问题通常是由以下原因导致的:1. 主线程阻塞:在Android应用中,主线程用于处理用户界面相关的操作。
如果主线程被繁重的任务阻塞,如网络请求、复杂计算等,就会导致应用的界面无法及时响应用户操作,从而出现卡顿现象。
2. 内存泄漏:内存泄漏是指应用程序中已分配的内存没有被正确释放的情况。
如果应用中存在大量的内存泄漏,会导致系统资源不足,从而引发卡顿问题。
3. UI渲染问题:UI渲染过程中,如果布局复杂、嵌套层次过深或者频繁修改界面等,会导致UI渲染的性能下降,从而引发卡顿问题。
二、检测和分析卡顿问题在解决卡顿问题前,首先需要检测和分析问题所在。
以下是一些常用的工具和技术:1. TraceView:TraceView是Android SDK中提供的一种分析工具,用于跟踪和分析应用程序的性能问题。
通过TraceView,开发者可以查看方法调用的时间及其在UI线程中的占比,从而确定可能导致卡顿的方法。
2. Systrace:Systrace是Android SDK中的另一个强大的分析工具,用于跟踪应用程序的系统性能问题。
通过Systrace,开发者可以查看应用程序的系统调用情况,如CPU使用情况、内存分配状况等,从而找到可能导致卡顿的原因。
3. 布局优化工具:Android Studio提供了一系列的布局优化工具,如布局层次查看器、布局分析器等,用于帮助开发者分析布局文件的复杂度,找到可能导致卡顿的布局问题。
三、解决卡顿问题的方法针对不同的卡顿原因,可以采取不同的解决方案。
以下是几种常见的方法:1. 异步处理:将繁重的任务,如网络请求、复杂计算等,放到子线程中执行,避免阻塞主线程的执行。
优化Android应用的内存占用测试与调优移动应用在Android平台上的开发与优化是一个关键的环节,其中内存占用是开发者需要重点关注的问题之一。
本文将介绍如何进行Android应用的内存占用测试与优化,以提升应用的性能和用户体验。
一、内存占用测试的重要性在开发Android应用时,合理管理内存占用是保证应用性能和稳定性的关键。
过高的内存占用将导致应用运行缓慢、卡顿,甚至崩溃。
内存占用测试的目的是发现和解决内存泄漏、过多的对象创建等问题,以确保应用在各种设备上都能正常运行。
二、内存占用测试方法1. 使用Android Profiler进行实时监测:Android Studio提供了Android Profiler工具,可以实时监测应用的内存占用情况。
开发者可以使用该工具来查看应用的内存分配情况、堆内存的使用情况等。
通过监测内存占用的变化,可以发现潜在的内存问题并进行优化。
2. 运行内存分析工具:Android平台上有许多内存分析工具可供使用,例如MAT(Memory Analyzer Tool)、LeakCanary等。
这些工具可以帮助开发者分析应用的内存占用情况,找出内存泄漏和过多对象创建等问题。
通过分析工具提供的报告和数据,开发者可以有针对性地对应用进行调优。
三、内存占用优化的方法1. 减少对内存的依赖:开发者在设计应用时,应尽量减少对内存的依赖,避免过多的对象创建和内存占用。
可以使用一些轻量级的数据结构和算法来代替占用较大内存的对象,如使用SparseArray代替HashMap,使用ArrayList代替LinkedList等。
2. 及时释放不再使用的资源:在Android开发中,需要及时释放不再使用的资源,以避免内存泄漏。
例如,在Activity或Fragment销毁时,需要及时释放相关的资源,如取消注册的监听器、关闭数据库连接等。
此外,对于大文件的读写操作,也需要及时关闭相关的流。
3. 使用图片资源的优化:图像资源是Android应用中常见的内存消耗较大的部分。
安卓手机内存空间越来越小了怎么办在有些时候我们的安卓手机内存空间越来越小,这该怎么办呢?下面就由店铺来为你们简单的介绍安卓手机内存空间越来越小的解决方法吧!希望你们喜欢!安卓手机内存空间越来越小的解决方法:1、存储内存的清理:由于软件会缓存很多文件占用内存,卸载后的残留文件我们可以用一款叫做“猎豹清理大师”(原金山清理大师)的软件对垃圾文件进行清理。
2、运行内存的清理:可以长按Home键,调出近期任务列表,关闭不需要的程序,释放一定的内存空间。
在内存严重不足的情况下,可以尝试破解系统最高权限,卸载不需要的内置软件。
3、一般内存手机运行内存低于1G就会出现明显的卡顿,所以选购手机最好挑选2G以上的手机。
其次:ROOT手机,ROOT你的手机,ROOT后,你能够获得手机的最高权限,同时你能够管理系统内置的软件,找出这些不必要的,经常在你后台运行的软件,这样你就能省下很多运存空间。
不安装安全软件,尽量不要使用安全软件,很多人都会给自己的手机上安装一个某某安全卫士,其实这些安全软件是最占运存的,但是不用安全软件,手机不就不安全了吗?大家可以在手机上安装一个优化软件,比如安卓优化大师,这类软件占用的运存不会很大,同时这类软件会自带安全防护功能,放骚扰之类的功能还是具备的,同时它还有垃圾清理的功能。
刷机,刷机也可以让自己的手机变得很流畅,大家可以根据自己的需要,找一找自己手机的简化包进行刷机。
PS:刷机有风险,刷机需谨慎。
不做“升级狂人”,手机软件不一定要升级,很多“升级狂人”总会在软件一更新的时候就马上升级,但是有时候不一定要升级软件,有时候升级后的软件会变得非常占用运存,这点大家要注意。
还有一个小技巧,大家手机都会安装一些第三方的输入法,这些输入法其实也是最占用运存的软件之一,大家可以使用这些输入法的历史版本,也就是旧版本,这些旧版本的输入法占用运存其实不是很大。
虚拟内存,很多手机都可以开虚拟内存,但其实效果都不是很理想,同时这种方法很伤内存卡,不建议使用。
Android⾼效内存1:⼀张图⽚占⽤多少内存 在做内存优化的时候,我们发现除了解决内存泄露问题,剩下的就只有想办法减少真实的内存占⽤。
⽽在App中,⼤部分内存可能被我们图⽚占⽤了,所以减少图⽚的内存占⽤可以带来直接的效果。
本⽂就简单介绍⼀张图⽚到底占⽤多少内存,我们先假设我们有⼀张图⽚时600 * 800 的,图⽚占⽤空间⼤⼩假设是 100KB。
另外本⽂知识点也是⾯试官喜欢问的⼀个点,看看⾃⼰的回答到什么级别了。
图⽚内存⼤⼩跟占⽤空间⼤⼩有什么关系? 占⽤空间的⼤⼩不是图⽚占⽤内存的⼤⼩,⼀些初学者可能会误解⼀下。
占⽤空间是在磁盘上占⽤的空间,内存⼤⼩是加载到内存中占⽤的内存⼤⼩。
两个只是单位是⼀样的,本质不是⼀个概念。
⼀张图⽚到底占⽤多少内存呢? 1. 图⽚占⽤内存的计算公式:图⽚⾼度 * 图⽚宽度 * ⼀个像素占⽤的内存⼤⼩ 2. 所以上⾯的图⽚占⽤内存是:800 * 600 * 4 byte = 1875KB = 1.83M上⾯的计算公式中,为什么是4byte呢? 4byte是跟图⽚的编码格式有关系,更多详情请移步图⽚所在⽬录对内存的影响? 在Android中,图⽚的存放⽬录和⼿机的屏幕密度影响图⽚最终的⼤⼩,举个例⼦: 假设我们的图⽚放到xhdpi⽬录下,那么我们本⽂中的图⽚占⽤的内存⼤⼩如下: 屏幕密度为2的设备:800 * 600 * 4byte = 1.83M 屏幕密度为3的设备:800 * 1.5 * 600 * 1.5 * 4byte = 1.83 * 2.25M = 4.12M 所以,计算图⽚占⽤内存⼤⼩的时候,要考虑图⽚所在的⽬录跟设备密度,这两个因素其实影响的是图⽚的⾼宽,android会对图⽚进⾏拉升跟压缩。
总结 1. 图⽚确实很占⽤内存,内存优化先考虑图⽚内存占⽤; 2. ⼀定要避免使⽤⼤图⽚,这就是.9图很有⽤的原因之⼀; 3. 图⽚的⼤⼩对内存的影响是正⽐关系; 4. 本⽂只是简单的告知读者怎么计算图⽚的内存⼤⼩。
Android内存优化详解Android内存泄露前言不少人认为JAVA程序,因为有垃圾回收机制,应该没有内存泄露。
其实如果我们一个程序中,已经不再使用某个对象,但是因为仍然有引用指向它,垃圾回收器就无法回收它,当然该对象占用的内存就无法被使用,这就造成了内存泄露。
如果我们的java运行很久,而这种内存泄露不断的发生,最后就没内存可用了。
当然java的,内存泄漏和C/C++是不一样的。
如果java程序完全结束后,它所有的对象就都不可达了,系统就可以对他们进行垃圾回收,它的内存泄露仅仅限于它本身,而不会影响整个系统的。
C/C++的内存泄露就比较糟糕了,它的内存泄露是系统级,即使该C/C++程序退出,它的泄露的内存也无法被系统回收,永远不可用了,除非重启机器。
Android的一个应用程序的内存泄露对别的应用程序影响不大。
为了能够使得Android应用程序安全且快速的运行,Android的每个应用程序都会使用一个专有的Dalvik虚拟机实例来运行,它是由Zygote服务进程孵化出来的,也就是说每个应用程序都是在属于自己的进程中运行的。
Android为不同类型的进程分配了不同的内存使用上限,如果程序在运行过程中出现了内存泄漏的而造成应用进程使用的内存超过了这个上限,则会被系统视为内存泄漏,从而被kill掉,这使得仅仅自己的进程被kill掉,而不会影响其他进程(如果是system_process等系统进程出问题的话,则会引起系统重启)。
1,引用没释放造成的内存泄露1.1注册没取消造成的内存泄露这种Android的内存泄露比纯java的内存泄露还要严重,因为其他一些Android程序可能引用我们的Anroid程序的对象(比如注册机制)。
即使我们的Android程序已经结束了,但是别的引用程序仍然还有对我们的Android程序的某个对象的引用,泄露的内存依然不能被垃圾回收。
比如示例1:假设我们希望在锁屏界面(LockScreen)中,监听系统中的电话服务以获取一些信息(如信号强度等),则可以在LockScreen中定义一个PhoneStateListener的对象,同时将它注册到TelephonyManager服务中。
对于LockScreen对象,当需要显示锁屏界面的时候就会创建一个LockScreen对象,而当锁屏界面消失的时候LockScreen对象就会被释放掉。
但是如果在释放LockScreen对象的时候忘记取消我们之前注册的PhoneStateListener 对象,则会导致LockScreen无法被垃圾回收。
如果不断的使锁屏界面显示和消失,则最终会由于大量的LockScreen对象没有办法被回收而引起OutOfMemory,使得system_process进程挂掉。
虽然有些系统程序,它本身好像是可以自动取消注册的(当然不及时),但是我们还是应该在我们的程序中明确的取消注册,程序结束时应该把所有的注册都取消掉。
1.2集合中对象没清理造成的内存泄露我们通常把一些对象的引用加入到了集合中,当我们不需要该对象时,并没有把它的引用从集合中清理掉,这样这个集合就会越来越大。
如果这个集合是static的话,那情况就更严重了。
2,资源对象没关闭造成的内存泄露资源性对象比如(Cursor,File文件等)往往都用了一些缓冲,我们在不使用的时候,应该及时关闭它们,以便它们的缓冲及时回收内存。
它们的缓冲不仅存在于java虚拟机内,还存在于java虚拟机外。
如果我们仅仅是把它的引用设置为null,而不关闭它们,往往会造成内存泄露。
因为有些资源性对象,比如SQLiteCursor(在析构函数finalize(),如果我们没有关闭它,它自己会调close()关闭),如果我们没有关闭它,系统在回收它时也会关闭它,但是这样的效率太低了。
因此对于资源性对象在不使用的时候,应该调用它的close()函数,将其关闭掉,然后才置为null.在我们的程序退出时一定要确保我们的资源性对象已经关闭。
程序中经常会进行查询数据库的操作,但是经常会有使用完毕Cursor后没有关闭的情况。
如果我们的查询结果集比较小,对内存的消耗不容易被发现,只有在常时间大量操作的情况下才会复现内存问题,这样就会给以后的测试和问题排查带来困难和风险。
3,一些不良代码成内存压力有些代码并不造成内存泄露,但是它们,或是对没使用的内存没进行有效及时的释放,或是没有有效的利用已有的对象而是频繁的申请新内存,对内存的回收和分配造成很大影响的,容易迫使虚拟机不得不给该应用进程分配更多的内存,造成不必要的内存开支。
3.1,Bitmap没调用recycle()Bitmap对象在不使用时,我们应该先调用recycle()释放内存,然后才它设置为null.虽然recycle()从源码上看,调用它应该能立即释放Bitmap的主要内存,但是测试结果显示它并没能立即释放内存。
但是我它应该还是能大大的加速Bitmap的主要内存的释放。
3.2,构造Adapter时,没有使用缓存的 convertView以构造ListView的BaseAdapter为例,在BaseAdapter中提共了方法:public View getView(int position, View convertView, ViewGroup parent)来向ListView提供每一个item所需要的view对象。
初始时ListView会从BaseAdapter中根据当前的屏幕布局实例化一定数量的view对象,同时ListView会将这些view对象缓存起来。
当向上滚动ListView时,原先位于最上面的list item的view对象会被回收,然后被用来构造新出现的最下面的list item。
这个构造过程就是由getView()方法完成的,getView()的第二个形参 View convertView就是被缓存起来的list item的view对象(初始化时缓存中没有view对象则convertView是null)。
由此可以看出,如果我们不去使用convertView,而是每次都在getView()中重新实例化一个View对象的话,即浪费时间,也造成内存垃圾,给垃圾回收增加压力,如果垃圾回收来不及的话,虚拟机将不得不给该应用进程分配更多的内存,造成不必要的内存开支。
ListView回收list item的view对象的过程可以查看:view plaincopy to clipboardprint?1. android.widget.AbsListView.java --> void addScrapView(View scrap) 方法。
2. 示例代码:3. public View getView(int position, View convertView, ViewGroup parent) {4. View view = new Xxx(...);5. ... ...6. return view;7. }8. 修正示例代码:9. public View getView(int position, View convertView, ViewGroup parent) {10. View view = null;11. if (convertView != null) {12. view = convertView;13. populate(view, getItem(position));14. ...15. } else {16. view = new Xxx(...);17. ...18. }19. return view;20. }[java]view plaincopyprint?1. android.widget.AbsListView.java --> void addScrapView(View scrap) 方法。
2. 示例代码:3. public View getView(int position, View convertView, ViewGroup parent) {4. View view = new Xxx(...);5. ... ...6. return view;7. }8. 修正示例代码:9. public View getView(int position, View convertView, ViewGroup parent) {10. View view = null;11. if (convertView != null) {12. view = convertView;13. populate(view, getItem(position));14. ...15. } else {16. view = new Xxx(...);17. ...18. }19. return view;20. }Android内存管理概述在android的开发中,要时刻主要内存的分配和垃圾回收,因为系统为每一个dalvik虚拟机分配的内存是有限的,在google的G1中,分配的最大堆大小只有16M,后来的机器一般都为24M,实在是少的可怜。
这样就需要我们在开发过程中要时刻注意。
不要因为自己的代码问题而造成OOM错误。
JAVA的内存管理大家都知道,android应用层是由java开发的,android的davlik虚拟机与jvm也类似,只不过它是基于寄存器的。
因此要了解android的内存管理就必须得了解java的内存分配和垃圾回收机制。
在java中,是通过new关键字来为对象分配内存的,而内存的释放是由垃圾收集器(GC)来回收的,工程师在开发的过程中,不需要显式的去管理内存。
但是这样有可能在不知不觉中就会浪费了很多内存,最终导致java虚拟机花费很多时间去进行垃圾回收,更严重的是造成JVM的OOM。
因此,java工程师还是有必要了解JAVA的内存分配和垃圾回收机制。
1. 内存结构上面这张图是JVM的结构图,它主要四个部分组成:Class Loader子系统和执行引擎,运行时方法区和本地方法区,我们主要来看下RUNTIME DATA AREA区,也就是我们常说的JVM内存。
从图中可以看出,RUNTIME DATA AREA区主要由5个部分组成:∙M ethod Area:被装载的class的元信息存储在Method Area中,它是线程共享的∙Heap(堆):一个java虚拟机实例中只存在一个堆空间,存放一些对象信息,它是线程共享的∙Java栈:java虚拟机直接对java栈进行两种操作,以帧为单位的压栈和出栈(非线程共享)∙程序计数器(非线程共享)∙本地方法栈(非线程共享)2. JVM的垃圾回收(GC)JVM的垃圾原理是这样的,它把对象分为年轻代(Young)、年老代(Tenured)、持久代(Perm),对不同生命周期的对象使用不同的垃圾回收算法。