对内存的优化
2016-01-03 13:56
176 查看
Java语言的内存回收机制:内存空间中的垃圾回收机制是由垃圾回收器(Garabge Collector,即GC)完成的。
核心思想:对虚拟机可用的内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,内存空间不能回收,反之如果对象不在被引用,则称其为垃圾对象,可以回收其占据的内存空间,用于在分配。
C/C++中的内存泄漏是指,用于动态存储分配的函数动态开辟的空间,在使用完毕后未释放,结果导致着一直占据着内存单元,直到程序结束。
Java中不需要手动释放分配的内存,Java中的内泄漏实际上是指,虽然程序一直持有着某个对象的引用,但从程序的逻辑的逻辑上看,这个对象在也不会被用到了。当这种情况发生时,我们就会认为这个对象发生了内存泄漏,如果这种情况偶尔发生,问题还不大。但是如果这种情况持续增加,内存泄漏就会越来越多,最终会导致内存不足,OutOfMemory异常发生。
Android没有采用Java虚拟机,而是采用Dalvik虚拟机,但是从原理上看,这个概念也是适用的。
一般来说,Android应用程序都是在自己单独的进程中进行(也可以运行在多个进程中,但是一般不会这么做)。Android系统为不同类型的进程分配了不同的内存使用上限。如果应用进程的使用的内存超过了这个上限,则会被系统视为内存泄漏,整个进程都会被杀死。一般的Android系统对于应用的内存的限制是24M(老的机型是16M)。
使用软引用和弱引用
Java从JDK1.2开始将引用分为4种级别了,从而使程序更加灵活的控制声明周期。强引用,软引用,弱引用,虚引用
软引用:如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它,如果内存的空间不足了,就会回收这些对象的内存。
弱引用:如果一个对象只具有弱引用,那么垃圾回收器线程扫描的过程中,一旦发现;了只具有弱引用的对象,不管当前的内存空间是否足够,都会回收他的内存。不过由于垃圾回收器是一个优先级很低的线程,因此不一定会发现那些只具有弱引用的的对象。弱引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收了,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
弱引用和和软引用的根本区别:只有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候通常不会被回收。
java.lang,ref SoftReference(软引用)WeakReference(弱引用)PhantomReference(虚引用)
public class MainActivity extends Activity {
private Map<String,SoftReference<Bitmap>> imageCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageCache=new HashMap<String, SoftReference<Bitmap>>();
}
/**
* 保存Bitmap的软引用到HashMap
* @param path
*/
public void addBitMapToCache(String path){
//强引用的Bitmap的对象
Bitmap bitmap=BitmapFactory.decodeFile(path);
//软引用的Bitmap对象
SoftReference<Bitmap> softBitMap=new SoftReference<Bitmap>(bitmap);
//添加对象到Map中使其缓存
imageCache.put(path, softBitMap);
}
/**
* 通过SoftReference的get方法获取得到Bitmap
* @param path
* @return
*/
public Bitmap getBitmapByPath(String path) {
//从缓存中取引用的Bitmap的对象
SoftReference<Bitmap> softBitmap=imageCache.get(path);
//判断是否存在引用
if(softBitmap==null){
return null;
}
// 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空。
Bitmap bitmap=softBitmap.get();
return bitmap;
}
}
核心思想:对虚拟机可用的内存空间,即堆空间中的对象进行识别,如果对象正在被引用,那么称其为存活对象,内存空间不能回收,反之如果对象不在被引用,则称其为垃圾对象,可以回收其占据的内存空间,用于在分配。
C/C++中的内存泄漏是指,用于动态存储分配的函数动态开辟的空间,在使用完毕后未释放,结果导致着一直占据着内存单元,直到程序结束。
Java中不需要手动释放分配的内存,Java中的内泄漏实际上是指,虽然程序一直持有着某个对象的引用,但从程序的逻辑的逻辑上看,这个对象在也不会被用到了。当这种情况发生时,我们就会认为这个对象发生了内存泄漏,如果这种情况偶尔发生,问题还不大。但是如果这种情况持续增加,内存泄漏就会越来越多,最终会导致内存不足,OutOfMemory异常发生。
Android没有采用Java虚拟机,而是采用Dalvik虚拟机,但是从原理上看,这个概念也是适用的。
一般来说,Android应用程序都是在自己单独的进程中进行(也可以运行在多个进程中,但是一般不会这么做)。Android系统为不同类型的进程分配了不同的内存使用上限。如果应用进程的使用的内存超过了这个上限,则会被系统视为内存泄漏,整个进程都会被杀死。一般的Android系统对于应用的内存的限制是24M(老的机型是16M)。
使用软引用和弱引用
Java从JDK1.2开始将引用分为4种级别了,从而使程序更加灵活的控制声明周期。强引用,软引用,弱引用,虚引用
软引用:如果一个对象只具有软引用,那么如果内存空间足够,垃圾回收器就不会回收它,如果内存的空间不足了,就会回收这些对象的内存。
弱引用:如果一个对象只具有弱引用,那么垃圾回收器线程扫描的过程中,一旦发现;了只具有弱引用的对象,不管当前的内存空间是否足够,都会回收他的内存。不过由于垃圾回收器是一个优先级很低的线程,因此不一定会发现那些只具有弱引用的的对象。弱引用也可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收了,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。
弱引用和和软引用的根本区别:只有弱引用的对象拥有更短暂的生命周期,可能随时被回收。而只具有软引用的对象只有当内存不够的时候才被回收,在内存足够的时候通常不会被回收。
java.lang,ref SoftReference(软引用)WeakReference(弱引用)PhantomReference(虚引用)
public class MainActivity extends Activity {
private Map<String,SoftReference<Bitmap>> imageCache;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageCache=new HashMap<String, SoftReference<Bitmap>>();
}
/**
* 保存Bitmap的软引用到HashMap
* @param path
*/
public void addBitMapToCache(String path){
//强引用的Bitmap的对象
Bitmap bitmap=BitmapFactory.decodeFile(path);
//软引用的Bitmap对象
SoftReference<Bitmap> softBitMap=new SoftReference<Bitmap>(bitmap);
//添加对象到Map中使其缓存
imageCache.put(path, softBitMap);
}
/**
* 通过SoftReference的get方法获取得到Bitmap
* @param path
* @return
*/
public Bitmap getBitmapByPath(String path) {
//从缓存中取引用的Bitmap的对象
SoftReference<Bitmap> softBitmap=imageCache.get(path);
//判断是否存在引用
if(softBitmap==null){
return null;
}
// 取出Bitmap对象,如果由于内存不足Bitmap被回收,将取得空。
Bitmap bitmap=softBitmap.get();
return bitmap;
}
}
相关文章推荐
- 语言对比-线程支持
- Java多线程之生产者消费者2
- MySQL的事务级别测试
- centos的软件安装方法rpm和yum
- dell N5010
- dell N5010
- android图片操作之 Matrix
- Struts2上传文件最大尺寸设置
- 正则表达
- 利用caffe生成 lmdb 格式的文件,并对网络进行FineTuning
- Centos 7网络配置
- 杭电OJ tree(并查集)
- 自定义列表li项目符号
- countUp.js 数字动画
- 搭建jekyll博客
- centos5.5配置网络连接(阿和整理)
- 误操作生成的“病毒“解决方法
- jbpm6.1.0 jbpm-console
- 做自己想做的工作,你也可以!
- Zbar library for iphone 5 (armv7s)