在日常开发中,我们不免会使用到Bitmap,而bitmap确实实在在的是内存使用的 “大户”,如何更好的使用 bitmap,减少其对 App内存的使用,是我们开发中不可回避的问题。 例如:一张 1024—1024像素的图片,采用ARG8888 格式存储,那么内存大小1024x1024x4=4m.如果 inSampleSize=2,即采样后图片内存大小为 512x512X4=1m 注意:官方文档中指出,inSampleSize的取值应该总是2的指数,如1,2,4,8等。 如果外界传入的 inSampleSize的值不为2的指数,那么系统会向下取整并选择成立一个最接近2的指数来代替。比如3,系统会选择2来代替。 简书-Android-Bitmap内存优化。
在每次minor gc之后,会按照年龄大小进行排序,从年龄小的开始累加内存空间,如果累加到年龄为10的对象的时候,内存空间已经超过了s区的50%,这个时候就会把大于年龄10的存活对象全部移动老年代中; 这个方法实现简单,效率高,但是目前主流的虚拟机中并没有选择这个算法来管 理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题 可达性分析算法 这个算法的基本思想就是通过一系列的称为 “GC Roots
1 优化思路梳理 2 线程池优化 编辑 Tomcat 配置文件 3 Tomcat 内存优化
Android 优化目录 ---- 优化的意义 减少 OOM,提高应用稳定性。 减少卡顿,提高应用流畅度。 减少内存占用,提高应用后台运行时的存活率。 减少异常发生,减少代码逻辑隐患。 refWatcher.watch(activity); } }); return refWatcher; } } } 内存优化 @IntDef,@StringDef 代替枚举 zipalign 优化 apk 节制使用 Service 如果需要使用 Service 来执行后台任务,一定要任务正在执行的时候才启动 Service options.outHeight; int width = options.outWidth; String imageType = options.outMimeType; options.inSampleSize = 2; 最好的方案是结合这两个方法,首先使用 inSampleSize 处理图片,转换为接近目标的 2 次幂,然后用 inDensity 和 inTargetdensy 生成最终想要的准确大小,因为 inSamplesize
二、redis 内存使用 redis的内存使用分布:自身内存,键值对象占用、缓冲区内存占用及内存碎片占用。 redis 空进程自身消耗非常的少,可以忽略不计,优化内存可以不考虑此处的因素。 2、缓冲内存 缓冲内存包括三部分:客户端缓存、复制积压缓存及AOF缓冲区。 1)客户端缓存:接入redis服务器的TCP连接输入输出缓冲内存占用,TCP输入缓冲占用是不受控制的,最大允许空间为1G。 2、关于linux的透明大页机制THP(Transparent Huge Page): THP机制会降低fork子进程的速度;写时复制内存页由4KB增大至2M。 2、内存回收 回收时机:键过期、内存占用达到上限 1)过期键删除: redis 键过期时间保存在内部的过期字典中,redis采用惰性删除机制+定时任务删除机制。 2)内存溢出控制 当内存达到maxmemory,会触发内存回收策略,具体策略依据maxmemory-policy来执行。
Java基于垃圾回收的内存机制 Java的内存管理机制会自动回收无用对象所占用的内存,减轻手工管理内存的负担 1、C/C++: 从申请、使用、释放都需要手工管理 2、Java:无用的对象的内存会被自动回收 Java程序中的内存泄漏 对象的内存在分配之后无法通过程序的执行逻辑释放对该对象的引用,不能被回收该对象所占内存 内存泄漏的危害 1、 引起OutOfMemoryError 2、 内存占用高时JVM 虚拟机会频繁触发GC, 影响程序响应速度 3、内存占用大的程序容易被各种清理优化程序中止,用户也更倾向于卸载这些程序 Android应用的开发语言为Java,每个应用最大可使用的堆内存受到Android 系统的限制 Android每一个应用的堆内存大小有限 1、 通常的情况为16M-48M 2、 通过ActivityManager的getMemoryClass()来查询可用堆内存限制 2、View持有其创建所在Context对象的引用,如果将View对象传递给其它生存周期比View所在Context更长的强引用,就可能会引起内存泄漏。
1、用ARC管理内存undefined 2、在正确的地方使用 reuseIdentifierundefined 3、尽量把views设置为透明undefined 4、避免过于庞大的XIBundefined 容易被忽略的内存优化如下: 1.View的渲染是很吃CPU性能和内存的,所以更多的View渲染是特别容易消化内存和cpu,特别是我们再使用UIScrollView时,多个Subview 时 我们可以适当的 2.懒加载,也称延迟加载,说的通俗一点,就是在开发中,当程序中需要利用的资源时。 在程序启动的时候不加载资源,只有在运行当中需要一些资源时,再去加载这些资源,即在需要的时候才加载(效率低,占用内存小),所谓懒加载,写的是其get方法undefined 3.缓存的使用 比如,服务器的不经常变化的资源 在View释放后,1中的color不会跟着释放,而是一直存在内存中;2中的color会跟着释放掉,当然再次生成color时就会再次申请内存.在UIView上再添加一个UIImageView显示图片作为UIView
Android的应用被限制为最多占用16m的内存,至少在T-Mobile G1上是这样的(当然现在已经有几百兆的内存可以用了——译者注)。它包括电话本身占用的和开发者可以使用的两部分。 即使你没有占用全部内存的打算,你也应该尽量少的使用内存,以免别的应用在运行的时候关闭你的应用。Android能在内存中保持的应用越多,用户在切换应用的时候就越快。 因此,如果你“泄露”了上下文(Context)(这里“泄露”的意思是你保持了一个引用并且组织GC收集它),你将造成大量的内存泄露。 它们可以让你飞快的用光所有的内存。 有两种简单的方法可以避免与context相关的内存泄露。最明显的一个就是避免在context的自身的范围外使用它。 垃圾回收器对于内存泄露来说并不是百分百保险的。
类与类之间尽量不要互相引用 类与类之间尽量不要互相引用,如果相互引用了要手动设置里面的引用为空,不然 会导致内存泄漏 Class1 class1 =new Class1(); Class2 class2 = new Class2(); class1.Class2 = class2; class2.Class1 = class1; 清除引用: class2.Class1 = null; class2 = 优化内存占用的方式 使用依赖属性 我们通过依赖属性和普通的CLR属性相比为什么会节约内存? 其实依赖属性的声明,在这里或者用注册来形容更贴切,只是一个入口点。也就是我们平常常说的单例模式。 <DrawingGroup x:Key="Diagonal_50px"> <DrawingGroup.Children> <GeometryDrawing Brush="#FF<em>2</em>A<em>2</em>A<em>2</em>A 程序运行到一定时间后或程序将要被闲置时,可以使用该命令来交换占用的<em>内存</em>到虚拟<em>内存</em>。 注意 这种方式为缓兵之计,物理<em>内存</em>中的数据转移到了虚拟<em>内存</em>中,当<em>内存</em>达到一定额度后还是会崩溃。
最近,因为项目时间不紧的原因,就对项目的某些页面进行了内存观察,发现了两处优化点.特意记录下来 1.单例引发的内存泄漏 我在项目中涉及到的一个单例是这样的 object LiveCenter { ...... } LiveCenter 注册了一个监听.这个 Function1 是在 Fragment 中 new 了一个实例.这个时候 LiveCenter 就持有了 Fragment 的引用导致内存泄漏 .所以需要写一个 release 方法,在 release 方法中使 function = null 这个和常说的 Context 引发内存泄漏其实差不多.这个可以通过 Android Studio 自带的 Android Profiler.具体用法自己搜吧 2.Fragment 作为 Listener 引发的内存泄漏 有的时候为了方便我们会这么写 public class Instance { FragmentA 对应的 Activity 是 SingleTask 模式.也就是说 FragmentA 可能会多次整个刷新,导致了每次都 new Instance.每次 new 就多了一个引用导致内存泄漏
简单来说,是可以的,这种优化可以针对任何CPU亲和性要求比较高的服务,但是在此处,有一点我们也应该特别注意:我们在 www.baishenjzc.cn 中介绍内存时,曾经提到过子进程内存消耗,也就是redis 2、内存不在内存了 www.lecaixuanzc.cn 开篇就讲过,redis最重要的东西,内存。 内存稳定性是redis提供稳定,低延迟服务的最基本的要求。 4)系统优化: 另外,在最初的基础服务操作系统安装部署时,也需要做一些必要的前置优化,如关闭swap或配置系统尽量避免使用。 3、网络问题 网络问题,是一个普遍的影响因素。 4)禁止线上大数据量操作 2、redis 服务运行状况 查看redis服务运行状况:redis-cli -h {host} -p {port} --stat keys:当前key总数;mem:内存使用 2)AOF刷盘阻塞 AOF持久化开启,后台每秒进行AOF文件刷盘操作,系统fsync操作将AOF文件同步到硬盘,如果主线程发现距离上一次成功fsync超过2s,则会阻塞后台线程等待fsync完成以保障数据安全性
垃圾收集总是由高内存流量引起的:分配的内存越多,需要收集的内存就越多。众所周知,内存流量优化应该在内存分析器的帮助下完成。它允许你确定对象是如何分配和收集的,以及这些分配背后保留了哪些方法。 本文讨论的一切都是微观优化,定期进行内存分析是良好的习惯 例如,交换a和b,从第一直觉上我们会编写出以下代码: int a = 5; int b = 10; var temp = a; a = b; stfld string Fake.EventBus.RabbitMQ.RabbitMqEventBus/'<ProcessingEventAsync>d__19'::'<str>5__2' 不要过早优化!!! 不要过早优化!!! 不要过早优化!!!
redis 空进程自身消耗非常的少,可以忽略不计,优化内存可以不考虑此处的因素。 1、对象内存 对象内存,也即真实存储的数据所占用的内存。 2、缓冲内存 缓冲内存包括三部分:客户端缓存、复制积压缓存及AOF缓冲区。 1)客户端缓存:接入redis服务器的TCP连接输入输出缓冲内存占用,TCP输入缓冲占用是不受控制的,最大允许空间为1G。 2、关于linux的透明大页机制THP(Transparent Huge Page): THP机制会降低fork子进程的速度;写时复制内存页由4KB增大至2M。 2、内存回收 回收时机:键过期、内存占用达到上限 1)过期键删除: redis 键过期时间保存在内部的过期字典中,redis采用惰性删除机制+定时任务删除机制。 2)内存溢出控制 当内存达到maxmemory,会触发内存回收策略,具体策略依据maxmemory-policy来执行。
:Android系统的进程(APP级别)有最大的内存限制,超过这个限制系统就会抛出)OOM错误 图片OOM问题产生的几种情况 1.一个页面一次加载过多的图片 2.加载大图片没有进行压缩 3.Android 如何计算:图片宽图片高一个像素占的内存大小 所以由上可见,图片储存优化的方式如下 1.尺寸优化:通过减小宽高来实现 2.质量压缩:改变一个像素占用的内存(优化解码率) 3.内存重用:需要用到inBitmap 为第一张图的Bitmap 然后小提一下Bitmap的内存管理 在3.0前,对于像素数据的支持保存在本地内存中, 在3.0后,像素数据和位图都储存在Dalvik堆中 以上为图片的储存优化,接下来介绍图片加载优化 1.异步优化:图片放在后台请求(不占用主UI的资源) 2.图片缓存:对于列表中的图片进行缓存(本地文件中的缓存) 3.网络请求:使用OkHttp进行图片请求(优点很多) 4.懒加载:当图片呈现到可视区域再进行加载 Fresco让你没有这些烦恼,它处理好每一帧并管理好你的内存。 以上就是大概的内容了,由于博主时间问题,会于以后写关于框架的使用及关于图片优化的小案例
Tips:本篇是《深入探索Android内存优化》的基础篇,如果没有掌握Android内存优化的同学建议系统学习一遍。 众所周知,内存优化可以说是性能优化中最重要的优化点之一,可以说,如果你没有掌握系统的内存优化方案,就不能说你对Android的性能优化有过多的研究与探索。 二、优化内存的意义 ========= 优化内存的意义不言而喻,总的来说可以归结为如下四点: 1、减少OOM,提高应用稳定性。 2、减少卡顿,提高应用流畅度。 2、使用MAT来查找内存泄漏 MAT工具可以帮助开发者定位导致内存泄漏的对象,以及发现大的内存对象,然后解决内存泄漏并通过优化内存对象,以达到减少内存消耗的目的。 11、其它的内存优化注意事项 除了上面的一些内存优化点之外,这里还有一些内存优化的点我们需要注意,如下所示: 尽使用static final 优化成员变量。 使用增强型for循环语法。
Redis的内存优化主要包括配置合理的内存上限、选择合适的回收策略以及使用内存优化工具。 设置最大内存:通过maxmemory指令设置Redis的最大内存使用量,当内存达到此设置值时,会根据配置的淘汰策略来处理新的写入请求。 # 设置最大内存为2GBredis-cli config set maxmemory 2gb选择合适的淘汰策略:noeviction: 不进行淘汰,当内存不足时,新写入会报错。 设置淘汰策略:# 设置淘汰策略为allkeys-lruredis-cli config set maxmemory-policy allkeys-lru使用内存优化工具:redis-cli --in-memory-optimize 示例:# 优化指定键的内存使用redis-cli --in-memory-optimize监控和调整:使用INFO memory命令来监控内存使用情况。根据实际情况调整上述参数以达到最优性能。
凑巧最近一段时间小编就一直在协助开发同学去进行app内存优化。这里小编整理了一份关于内存优化的心得分享给大家。 ? 目的 首先我们先要明确我们的目的,在保证程序运行流畅的前提下尽可能的优化使用内存。 [self executeBlock2:^{ self.index = 1; }]; } - (void)executeBlock2:(dispatch_block_t)block 而iOS的低内存机制就是给你一个阈值,只要你的APP超过这个数值,哪怕只是一瞬间也会直接崩溃。因此我们就需要对这种瞬间的高增幅去进行优化。 还有就是在iOS开发时不要用xib来拖拉控件,很多的xib会特别大的增加App的内存,在优化内存的时候,不妨把xib文件删除选择全代码来开发。也可以节省很多内存。 ? 总结 内存的优化方式除了上面说的几种还有更多有待发现,我们虽然作为测试同学,但是在这种优化时刻还是需要积极参与,毕竟优化重构这种改动总是会引起很多毁灭性BUG,只有我们脑中存在这些知识才能更好的判读改动范围
作者:shwenzhang Android 内存优化是我们性能优化工作中比较重要的一环,这里其实主要包括两方面的工作: 优化RAM,即降低运行时内存。 对于bitmap内存占用,想说的有以下几点: 防止bitmap占用资源多大导致OOM Android 2.x 系统 BitmapFactory.Options 里面隐藏的的inNativeAlloc反射打开后 当前微信内存监控体系中也存在一些不尽人意的地方,在未来的日子里也同样需要努力去优化。 参考文章 [1].Android内存管理 [2].leakcanary [3].AndroidExcludedRefs [4].fresco [5].优化安卓应用内存的神秘方法以及背后的原理 [6].Android 性能优化之内存篇 本文来源于:WeMobileDev 微信公众号
为Innodb加速优化首要参数。 该参数分配内存的原则:这个参数默认分配只有8M,可以说是非常小的一个值。 set (0.00 sec) 如果发现Sort_merge_passes的值比较大,你可以考虑增加sort_buffer_size 来加速ORDER BY 或者GROUP BY 操作,不能通过查询或者索引优化的 如果join语句不是很少的话,个人建议可以适当增大join_buffer_size到1MB左右,如果内存充足可以设置为2MB。 sort_buffer_size=262144; set @@read_buffer_size=131072; set global key_buffer_size=8388608; 引用 记一次Mysql占用内存过高的优化过程 mysql 优化技巧心得一(key_buffer_size设置) mysql内存计算 mysql计算器 mariadb官网
, 则相应的 Sample高度 = 原图高度 * 1,1/2, 1/4, 1/8; Sample宽度 = 原图宽度 * 1,1/2, 1/4, 1/8; 2、(BitmapFactory 中 decodeResource 则跳过这步) 新图的高度 = Sample高度 * (设备的 dpi / 目录对应的 dpi ) 新图的宽度 = Sample宽度 * (设备的 dpi / 目录对应的 dpi ) 3、 bitmap内存 options.inSampleSize = 4; options.inBitmap = mLastBitmap; //bitmap内存复用 bitmap.getAllocationByteCount() :使用options.inBitmap时,bitmap实际使用的内存。 内存优化: 1、设置inSampleSize 2、不影响用户体验的情况下:Bitmap.Config.ARGB_4444 举例: 1、 2、