首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Android面试每日一题(2): 一般什么情况下会导致内存泄漏问题?

1、内存泄漏的根本原因在于生命周期长的对象持有了生命周期短的对象的引用 2、常见场景 (1)资源对象没关闭造成的内存泄漏(如: Cursor、File等) (2)全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合) (3)接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus (4)Activity 的 Context 造成的泄漏,可以使用 ApplicationContext (5)单例中的static成员间接或直接持有了activity的引用 (6)非静态内部类持有父类的引用,如非静态handler持有activity的引用 3、如何避免内存泄漏 (1)编码规范上: ①资源对象用完一定要关闭,最好加finally ②静态集合对象用完要清理 ③接收器、监听器使用时候注册和取消成对出现 ④context使用注意生命周期,如果是静态类引用直接用ApplicationContext ⑤使用静态内部类 ⑥结合业务场景,设置软引用,弱引用,确保对象可以在合适的时机回收 (2)建设内存监控体系 线下监控: ①使用ArtHook检测图片尺寸是否超出imageview自身宽高的2倍 ②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏 线上监控: ①上报app使用期间待机内存、重点模块内存、OOM率 ②上报整体及重点模块的GC次数,GC时间 ③使用LeakCannery自动化内存泄漏分析 总结: 上线前重点在于线下监控,把问题在上线前解决;上线后运营阶段重点做线上监控,结合一定的预警策略及时处理 4、真的出现低内存,设置一个兜底策略 低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了

03

MapReduce整体介绍

MapReduce框架(Map/Reduce) MapTask/ReduceTask 数据分发机制             MapTask接口实现类 : 对一行数据进行处理,map方法             ReduceTask接口实现类:对一组数据进行处理,reduce方法         MapReduce工作机制         划分输入切片: 数据切片             job.split文件         分布式数据处理         K相同的KV数据分配给同个ReduceTask         组合拳:CompareTo + Partation + Group         分区控制/分组控制         MapReduce编程模型             map task的实现                 读数据:TextInputFormat                          SequenceFileInputFormat                          DBInputFormat                 portation 分区                 调用Partitaioner 的getPartition 决定数据分区             reduce task的实现                 读数据:下载"区"数据,并且合并多个"同区"并且排序                 写数据:TextInputFormat                         SequenceFileOutputFormat                         DBOutputFormat             GroupingComparator:分组                 确定那些数据属于同一组         对倾斜数据的处理             1. 通过Combiner组件进行maptask端局部聚合数据减轻倾斜影响             2. 通过打算倾斜数据来消除倾斜的影响,通过在Key值后面添加随机值,这样就可以均衡的分布在ReduceTaks端。         MapReduce编程模型具体实现及处理流程:             MRAppMaster                 YarnChild(maptask/reducetask)                     main()                 1. MapTask:                     ->TextInputFormat                         ->LineRecordFromat                             ->Mapper                                 ->map()                                     ->context   --->  MapOutputCollector 环形缓存,存在大小限制                                                         ->spilter (80%) 分区(partation),排序(compare)                                                         ->write 溢出文件(可能包含多个文件,有序文件) 写本地磁盘                                                         ->merge 分区有序,分区索引文件                     多个maptask会生成多个merge文件                 2. Shuffle: Store && Rest                     map task 生成的数据传输给reduce task 的过程                    多个maptask会生成多个merge文件,这些文件会保存在NodeManager中,NodeManager具有Web服务,ReduceTask会通过Web服务下载merge文件,进行处理                         3. ReduceTask                     -> http下载:从多个DataManager中下载merge文件下载单个分区的KV数据,多个文件合并为一个文件

01

Android面试每日一题(4): 哪些情况下会导致oom问题?

1、根据java的内存模型会出现内存溢出的内存有堆内存、方法区内存、虚拟机栈内存、native方法区内存; 2、一般说的OOM基本都是针对堆内存; 3、对于堆内存溢出主的根本原因有两种 (1)app进程内存达到上限 (2)手机可用内存不足,这种情况并不是我们app消耗了很多内存,而是整个手机内存不足 4、而我们需要解决的主要是app的内存达到上限 5、对于app内存达到上限只有两种情况 (1)申请内存的速度超出gc释放内存的速度 (2)内存出现泄漏,gc无法回收泄漏的内存,导致可用内存越来越少 6、对于申请内存速度超出gc释放内存的速度主要有2种情况 (1)往内存中加载超大文件 (2)循环创建大量对象 7、一般申请内存的速度超出gc释放内存基本不会出现,内存泄漏才是出现问题的关键所在 8、内存泄漏常见场景 (1)资源对象没关闭造成的内存泄漏(如: Cursor、File等) (2)全局集合类强引用没清理造成的内存泄漏(特别是 static 修饰的集合) (3)接收器、监听器注册没取消造成的内存泄漏,如广播,eventsbus (4)Activity 的 Context 造成的泄漏,可以使用 ApplicationContext (5)单例中的static成员间接或直接持有了activity的引用 (6)非静态内部类持有父类的引用,如非静态handler持有activity的引用 9、怎么对内存进行优化呢 三个方向 (1)为应用申请更大内存,把manifest上的largdgeheap设置为true (2)减少内存的使用 ①使用优化后的集合对象,比如SpaseArray; ②使用微信的mmkv替代sharedpreference; ③对于经常打log的地方使用StringBuilder来组拼,替代String拼接 ④统一带有缓存的基础库,特别是图片库,如果用了两套不一样的图片加载库就会出现2个图片各自维护一套图片缓存 ⑤给ImageView设置合适尺寸的图片,列表页显示缩略图,查看大图显示原图 ⑥优化业务架构设计,比如省市区数据分批加载,需要加载省就加载省,需要加载市就加载失去,避免一下子加载所有数据 (3)避免内存泄漏 编码规范上: ①资源对象用完一定要关闭,最好加finally ②静态集合对象用完要清理 ③接收器、监听器使用时候注册和取消成对出现 ④context使用注意生命周期,如果是静态类引用直接用ApplicationContext ⑤使用静态内部类 ⑥结合业务场景,设置软引用,弱引用,确保对象可以在合适的时机回收 建设内存监控体系: 线下监控: ①使用ArtHook检测图片尺寸是否超出imageview自身宽高的2倍 ②编码阶段Memery Profile看app的内存使用情况,是否存在内存抖动,内存泄漏,结合Mat分析内存泄漏 线上监控: ①上报app使用期间待机内存、重点模块内存、OOM率 ②上报整体及重点模块的GC次数,GC时间 ③使用LeakCannery自动化内存泄漏分析 10、真的出现低内存,设置一个兜底策略 低内存状态回调,根据不同的内存等级做一些事情,比如在最严重的等级清空所有的bitmap,关掉所有界面,直接强制把app跳转到主界面,相当于app重新启动了一次一样,这样就避免了系统Kill应用进程,与其让系统kill进程还不如浪费一些用户体验,自己主动回收内存

04

Flume 整体介绍

Flume 数据采集         概述:             Flume 是一个数据采集工具,主要可以理解为对日志数据或者其他数据的采集。可以对例如日志数据进行采集传输到我们想要传输的地方,比如从本地文件系统采集数据到HDFS的HIVE目录下获取HDFS的其他目录,提供HIVE进行数据分析。             Flume运行方式为Agent Flume,如果有多个数据源,并且文件系统,则需要启动多个Agent Flume 进行数据采集。         组成:             Flume有三大组件:Source,Channel,Sink,             Source:指定采集数据源,类型:spooldir(本地系统),MySql,                 Source 不仅仅可以定义数据源信息,还可以定义检索文件类型,或者自定义文件获取方式             Channel:通道,通过Channel连接Source和Sink,中间作缓冲,提供适配,类型:Memery,File,JDBC                 Channel 还可以指定文件缓存大小             Sink:指定数据输出目标系统,类型:HDFS,Hive,HBase                 如果Sink输出为HDFS,Hive,则还可以指定文件大小,文件前后缀,文件读写周期等。         安装:             1. 解压Flume安装包             2. 配置系统配置文件 flume-site.xml(FADOOP_HOME,HDFS_HOME,ZooKeeper_HOME),之所以分开是因为Flume是Cloudra提供的,他把HDFS与MapReduce分开了,他提供了整合了的HADDOOP 大数据平台运行框架,更加方便部署。也有可能需要指定HBASE,HIVE等。             3. 配置数据采集业务配置文件  ***.xml             4. 启动Flume         运行机制:Flume通过Agent 方式运行数据采集,可以部署在多台机器,主要根据数据源存储形态来具体决定,如果数据源为多个文件系统,则需要运行多套Agent来采集,如果数据源为Mysql,则一个Agent就够了。Flume通过配置文件定义数据的采集-Source阶段,数据缓存-Channel阶段,及数据发送-Sink阶段。首先Source读取数据文件到Channel,Channel缓存起来,达到触发条件(触发条件自己定义或者默认)则会发动到Sink端进行保存,Sink端对发送的数据也定义定,包括存储文件大小,名称,前后缀等。         重点:             业务配置文件 ***.xml : 一个xml文件里面可以定制多套 FCS流程,即在定义时可以同时存在几套FCS流程在XML文件中,我们在启动Flume时需要指定FCS流程的名称来区分             多级Agent:我们可以指定多个Agent进行关联操作,即一个Agent的Sink输出为另一个Agent的Source输入。             比如Agent1为Agent2 提供输入,则Agent1 输出类型为:Avro Source,Qgent1的输入类型可以为任何允许的输出,Agent2的 输入类型为 :Avro SinK,Agent2的输出类型为允许的任何输出。             Flume是基于事务的,可以保证数据的传输时发送与接受的一致性。         Sample:

01
领券