应用中碰到①个问题,用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好多年,如有错