为什么用Block反而下载东西内存占用上升升了

评论已经自动封存,请勿再发言论
声明: 下面的评论属于其发表者所有,不代表本站的观点和立场,我们不负责他们说什么。
(得分:0) 日 17时14分 星期三
和uBlock比呢(得分:1 )
uBlock自称性能要好来着?
(得分:0) 日 21时00分 星期三
(得分:0) 日 20时54分 星期三
(得分:0) 日 14时24分 星期六
(得分:0) 日 14时31分 星期六  在完成项目期间,不可避免的会使用到block,因为block有着比delegate和notification可读性更高,而且看起来代码也会很简洁。于是在目前的项目中大量的使用block。  之前给大家介绍了一下在开发的过程中使用到了代理以及block,并详细的介绍了一下delegate和block的相似之处。(如有兴趣可以去看我之前的文章 & & & & 链接:&http://www.cnblogs.com/MasterPeng/p/5210263.html)  主要是因为在开发的时候,有时候由于疏忽大意或者一些其他的原因,导致了使用block时造成了循环引用从而导致了内存泄露。block 循环引用的主要原因:在block中引用了外部变量。  下面为大家举一个简单的例子,像下面这段代码:  brush.getCardInfo=^(NSDictionary&*info){  [self test];  };  像上面这段代码,self其实是一个本地变量而不是block内部变量,如果声明为assign,代码执行到block内部就会出错。  但是这又带来另一个问题,就是self的引用计数+1。这意味着很可能会导致循环引用。self持有brush,brush持有block,block持有self。结果就是内存泄漏。解决方法:  __weak&CurrentViewController *blockSelf&=&&  brush.getCardInfo=^(NSDictionary&*info){  [blockSelf test];  };  通过__weak修饰变量这个方式,告诉block这个变量的引用计数不要+1。从而避免循环引用的问题。声明block的时候都是用copy来修饰  使用copy修饰的原因:  block本身是像对象一样可以retain,和release。但是,block在创建的时候,它的内存是分配在栈(stack)上,而不是在堆(heap)上。他本身的作于域是属于创建时候的作用域,一旦在创建时候的作用域外面调用block将导致程序崩溃。&&  使用retain也可以,但是block的retain行为默认是用copy的行为实现的,因为block变量默认是声明为栈变量的,为了能够在block的声明域外使用,所以要把block拷贝(copy)到堆,所以说为了block属性声明和实际的操作一致,最好声明为copy。关于block更多的应用或者实现,大家可以参考巧神的一篇讲解block的博客 & & &链接:http://blog.devtang.com//a-look-inside-blocks/
阅读(...) 评论()博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)iOS 如何正确使用block才不会造成内存泄漏_百度知道
iOS 如何正确使用block才不会造成内存泄漏
我有更好的答案
换句话说,Block不仅 实现函数的功能,还能携带函数的执行环境。Block的类型NSGlobalBlock:类似函数;,定义一个self的替身并用ruo指针引用着。需要注意的是由于Objective-C在iOS中不支持GC机制,并不是高新技术,和其他语言的闭包或lambda表达式是一回事。作用Block可以访问函数以外、词法作用域以内的外部变量的值;typeof(self) selfVc =&self:__weak&nbspBlock定义Block作为C语言的扩展,位于text段。使self 不能被销毁,使用Block必须自己管理内存,而内存管理正是使用Block坑最多的地方,错误的内存管理 NSStackBlock:位于栈内存,函数返回后Block将无效;NSMallocBlock:位于堆内存;内存泄漏问题block 里面引用 self ,而self又强指针指着block。解决方法
为您推荐:
其他类似问题
内存泄漏的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。sponsored links
每隔一段时间,hbase 的读就会停顿10s的原因及解决办法
产生的原因:前段时间由于设置region server 的heapsize 为16g,使得block cache 的大小变为16g*0.4=3.2g,查看日志发现了jvm 隔一段时间会出现如下日志:
2015-03-24 16:09:27,405 WARN org.apache.hadoop.hbase.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 15959ms
GC pool 'ParNew' had collection(s): count=1 time=213ms
GC pool 'ConcurrentMarkSweep' had collection(s): count=1 time=16158ms
2015-03-24 16:28:42,048 WARN org.apache.hadoop.hbase.util.JvmPauseMonitor: Detected pause in JVM or host machine (eg GC): pause of approximately 20125ms
GC pool 'ParNew' had collection(s): count=1 time=337ms
GC pool 'ConcurrentMarkSweep' had collection(s): count=2 time=20206ms
由此可以断定block cache 发生了CMS GC,长达10s,甚至20s,
目前使用的BlockCache,使用一个HashMap维护Block Key到Block的映射,采用严格的LRU算法来淘汰Block,初始化时会指定容量大小,当使用量达到85%的时候开始淘汰block至75%的比例。
优点:直接采用jvm提供的HashMap来管理Cache,简单可依赖;内存用多少占多少,JVM会帮你回收淘汰的BlOCK占用的内存
1.一个Block从被缓存至被淘汰,基本就伴随着Heap中的位置从New区晋升到Old区
2.晋升在Old区的Block被淘汰后,最终由CMS进行垃圾回收,随之带来的是Heap碎片 ,old 区域变大导致cms 时间过长。
3.因为碎片问题,随之而来的是GC时晋升失败的FullGC,我们的线上系统根据不同的业务特点,因为这个而发生FullGC的频率,有1天的,1周的,1月半年的都有。对于高频率的,
在运维上可以通过在半夜手工触发FullGC来缓解
4.如果缓存的速度比淘汰的速度快,很不幸,现在的代码有OOM的风险(这个可以修改下代码避免)
解决方案:
hbase-0.94以后提供了BucketCache, 一方面降低region server heap size 的大小为8gb,降低cms发生的几率和减少时间,另一方面可以利用BucketCache增加二级缓存。二级缓可以利用off heap cache,也可也利用ssd 做二级缓存。
CDH5.3.0 的配置如下:在region server 上添加
XX:MaxDirectMemorySize=16G
在region server hbase-site 配置BucketCache size:
&property&
&name&hbase.bucketcache.ioengine&/name&
&value&offheap&/value&
&/property&
&property&
&name&hbase.bucketcache.percentage.in.combinedcache&/name&
&value&0.8&/value&
&/property&
&property&
&name&hbase.bucketcache.size&/name&
&value&16384&/value&
&/property&
由于增加了读缓存:已缓存的块增加了一倍,总的命中率增加了60%多
参考文档:
http://www.slideshare.net/bijugs/h-base-performance
http://zh.hortonworks.com/blog/hbase-blockcache-101/
http://zjushch.iteye.com/blog/1751387
http://blog.csdn.net/bluishglc/article/details/
http://punishzhou.iteye.com/blog/1277141
经测试有的机器还是按如下办法无法解决问题,
可以尝试这个方法:
1. 2. 下载文档
如题,诊断为网卡在一段时间不用后自动休眠造成,解决方案右键我的电脑,管理,如图所示修改为不休眠 xp中的配置界面如下:
IOS在后台每隔一段时间执行一下 步骤: 1.在info.plist里加入UIBackgroundModes键,其值为数组,数组之一为voip字符串: &key&UIBackgroundModes&/key&&array&&string&voip&/string&&/array& 2.在 ...
可以每隔一段时间自动运行的一个批处理 zidong.bat代码 @echo off :Begin Start &d:\print.bat& rem 下面这行是延时代码,300是秒做单位的,300秒就是5分钟,需要多长时间自改一下 @Ping 127.0.0.1 -n 300 Goto Begin 执行后有个问题是每次关不掉print.ba ...
如果在SQL Server 里需要定时或者每隔一段时间执行某个存储过程或3200字符以内的SQL语句时, 可以用管理-&SQL Server代理-&作业来实现. 1.管理-&SQL Server代理-&作业(按鼠标右键)-&新建作业-& 2.新建作业属性(常规)-&名称[自定义本次作业的名称]-&启用的方框内是 ...
总结以下三种方法,实现c#每隔一段时间执行代码: 方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间: 方法二:使用System.Timers.Timer类: 方法三:使用System.Threading.Timer: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ...

我要回帖

更多关于 内存占用过高 的文章

 

随机推荐