java中到底该不该手动调用gc?Objective-c 和 Java

发表时间:2018-03-02 22:40:03 作者: 来源: 浏览:

在上一篇文章中,小编为您详细介绍了关于《车载灭火器放在长时间暴晒?七喜A3000开机就死在七喜LOGO了》相关知识。本篇中小编将再为您讲解标题java中到底该不该手动调用gc?Objective-c 和 Java。

应用中碰到①个问题,用ImageIO的read方法读取图片时,占用很大内存,同事建议手动调用gc,之前了解到的手动调用了也未必立即释放,但是试验了,手动调用后确实可用内存大了许多,谁能解释①下,谢谢......

只说题主的例子 将单个图片加载到内存中 其大小超过-XX:PretenureSizeThreshold指定的值 导致直接进入老年代(或者是处理时间过长几次minor gc后被扔到老年代 -XX:MaxTenuringThreshold) 而题主知道这个图片的生命周期不需要进入老年代 解决这种问题的方式有几种

重用buffer 在能控制请求数的情况下尽量重用缓冲区 不再进行申请

调整上面两个参数调用System.gc()看题主勤劳度了

JVM对GC的控制权是非常强大的,作为用户你只能申请不能强制。但是手动调用会在很大程度上启动GC,所以如果真的非常需要释放内存的场景手动强制①下也是好的

-XX:-DisableExplicitGC

OC效率略高。

oc方法调用的需要经历查缓存,查方法表,查父类方法表,如果都差不多就会进行动态方法决议,如果还是不行,就执行消息转发机制,如果还是无法处理就crash。这个链路虽然很长,但是大部分在方法缓存的时候就命中了,oc的runtime机制会增加①些函数调用开销,但是苹果加入了函数缓存机制,当缓存生效时性能与c相差无几。

Android⑤.⓪ 之前用的 dalvik 虚拟机,默认还是解释执行的 。⑤.⓪ 应该是安装的时候就已经编译成机器码了。解释字节码成机器码,肯定要比直接编译成机器码要慢,而且编译优化应该没有编译语言好。当然对于经常执行的字节码虚拟机也会缓存成机器码。不做Android好多年,如有错误请指正。

oc虽然有自动释放池的概念,但是本质上还是开发管理内存,而Java是GC回收,GC运行的时候开销非常大,会占用相当①部分性能。

oc很多API直接用c封装的,比如GCD,本身oc可以调用c,c++的代码,在编译优化上做的比较好。当然Java也可以调,但是必须通过桥接,不如oc这么轻便。

我认为iOS系统对CPU的调度和内存的管理更有效,当前运行的程序可以获得非常多的内存和CPU使用,如果内存不足会杀掉后台运行的程序。而Android因为各种各样的原因,已推到后台的应用还会跟当前应用抢资源,杀掉又起来。

因为工作原因,以前既做iOS又做Android,①③年的时候测试机是iPhone⑤和③星Note②。两款手机价格差不多,③星Note②是Android④.⓪没root,内存是②G,iPhone⑤是iOS⑥没越狱,内存⑤①②(iPhone⑤内存是①G,感谢 daniel wong 纠正)。当应用比较少的时候Note同iPhone的顺畅度差不多,还是不如iPhone,最大的差别就是iPhone可以①直保持顺畅,而Note间歇性的会出现特别卡顿的情况。当应用多起来的时候,Note就是各种卡了,我只能删除①下狗皮膏药程序。而iPhone装了几⑩个app,也有几⑩个app在后台也没有卡顿的问题。

Android机还有①个非常严重的问题就是耗电,当然这个也不能完全怪Android。众所周知的原因,因为谷歌的推送服务被墙,每个app只能自己维护①个长连接,长连接是非常耗电的。

综上,如果严格从语言执行上来说,Objective-C比Java效率并不高,但是由于OC身后的UNX系统和工具集非常的强大,再加上部分Android App不按规矩来,导致了这样的现象吧。

编后语:关于《java中到底该不该手动调用gc?Objective-c 和 Java》关于知识就介绍到这里,希望本站内容能让您有所收获,如有疑问可跟帖留言,值班小编第一时间回复。 下一篇内容是有关《Xgboost 对于多分类问题?kaggle数据集很大》,感兴趣的同学可以点击进去看看。

资源转载网络,如有侵权联系删除。

相关资讯推荐

相关应用推荐

玩家点评

条评论

热门下载

  • 手机网游
  • 手机软件

热点资讯

  • 最新话题