内存溢出解决方案

内存溢出解决方案

1.内存溢出(OOM)是指应用系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于虚拟机能提供的最大内存。为了解决Java中内存溢出问题,

我们首先必须了解Java是如何管理内存的。Java的内存管理就 是对象的分配和释放问题。在Java中,内存的分配是由程序完成的,而内存的释放是由垃圾收集器(GarbageCollection,GC)完成的,

程 序员不需要通过调用GC函数来释放内存,因为不同的JVM实现者可能使用不同的算法管理GC,有的是内存使用到达一定程度时,GC才开始工作,也有定时执 行的,有的是中断式执行GC。

但GC只能回收无用并且不再被其它对象引用的那些对象所占用的空间。Java的内存垃圾回收机制是从程序的主要运行对象开始检查引用链,当遍历一遍后发现没有被引用的孤立对象就作为垃圾回收。

引起内存溢出的原因有很多种,常见的有以下几种:

? 内存中加载的数据量过于庞大,如一次从数据库取出过多数据;

? 集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;

? 代码中存在死循环或循环产生过多重复的对象实体;

? 使用的第三方软件中的BUG

? 启动参数设定的过小;

2.内存溢出解决方案
- Android默认给每个app只分配16M的内存
 方法1:等比例缩小图片        

 1 /**
 2      *
 3      * 下载图片
 4      * @return
 5      */
 6     private Bitmap downloadBitmap(String url){
 7         HttpURLConnection conn=null;
 8         try {
 9             conn=(HttpURLConnection) new URL(url)
10             .openConnection();
11
12             conn.setConnectTimeout(5000);
13             conn.setReadTimeout(5000);
14             conn.setRequestMethod("GET");
15             conn.connect();
16
17             int responseCode = conn.getResponseCode();//响应码
18
19             if(responseCode==200){//表示成功连接
20                 InputStream inputStream = conn.getInputStream();
21
22                 //图片的压缩设置
23                 BitmapFactory.Options option=new Options();
24                 option.inSampleSize=2;//表示将图片压缩原来的二分之一,需要根据图片的大小来计算出压缩值的大小
25                 option.inPreferredConfig=Bitmap.Config.RGB_565;//通过设置图片的格式即像素大小来进行图片的压缩
26
27                 Bitmap bitmap = BitmapFactory.decodeStream(inputStream,null,option);
28                 return bitmap;
29             }
30
31         } catch (IOException e) {
32
33             e.printStackTrace();
34         }
35         finally{
36             conn.disconnect();
37         }
38         return null;
39
40     }

方法2. java中的引用,对图片采用软引用,及时地进行recyle()操作
    - 强引用 垃圾回收器不会回收, java默认引用都是强引用
    - 软引用 SoftReference   在内存不够时,垃圾回收器会考虑回收
    - 弱引用 WeakReference  在内存不够时,垃圾回收器会优先回收
    - 虚引用 PhantomReference  在内存不够时,垃圾回收器最优先回收

注意: Android2.3+, 系统会优先将SoftReference的对象提前回收掉, 即使内存够用

 1 /**
 2  *
 3  * 内存缓存
 4  * @author admin
 5  *
 6  */
 7 public class MemoryCacheUtils {
 8
 9     private HashMap<String, SoftReference<Bitmap>> hashlist=new HashMap<String, SoftReference<Bitmap>>();
10
11
12     /**
13      *
14      * 从内存中读
15      * @param url
16      * @return
17      */
18     public  Bitmap getBitmapFrommemory(String url){
19         SoftReference<Bitmap> soft= hashlist.get(url);
20         if(soft!=null){
21             Bitmap bitmap = soft.get();
22             return bitmap;
23         }
24         return null;
25
26
27     }
28
29
30     /**
31      *
32      * 写入内存
33      * @param url
34      * @param bitmap
35      */
36     public  void setBitmapTomemory(String url,Bitmap bitmap){
37         SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(bitmap);
38         if(softReference!=null){
39             hashlist.put(url, softReference);
40     }
41     }
42 }

方法3.LruCache
## LruCache ##
    least recentlly use 最少最近使用算法
    会将内存控制在一定的大小内, 超出最大值时会自动回收, 这个最大值开发者自己定

 1 /**
 2  *
 3  * 内存缓存
 4  * @author admin
 5  *
 6  */
 7 public class MemoryCacheUtils {
 8
 9 //    private HashMap<String, SoftReference<Bitmap>> hashlist=new HashMap<String, SoftReference<Bitmap>>();
10
11     private LruCache<String, Bitmap> lrucache;
12     public MemoryCacheUtils() {
13         long maxMemory = Runtime.getRuntime().maxMemory()/8;//设置允许占用最大内存
14         lrucache=new LruCache<String, Bitmap>((int) maxMemory){
15             @Override
16             protected int sizeOf(String key, Bitmap value) {
17                 int bytecount=value.getRowBytes() * value.getHeight();
18                 return bytecount;
19             }
20
21         };
22     }
23     /**
24      *
25      * 从内存中读
26      * @param url
27      * @return
28      */
29     public  Bitmap getBitmapFrommemory(String url){
30 //        SoftReference<Bitmap> soft= hashlist.get(url);
31 //        if(soft!=null){
32 //            Bitmap bitmap = soft.get();
33 //            return bitmap;
34 //        }
35         Bitmap bitmap = lrucache.get(url);
36         return bitmap;
37
38
39     }
40
41
42     /**
43      *
44      * 写入内存
45      * @param url
46      * @param bitmap
47      */
48     public  void setBitmapTomemory(String url,Bitmap bitmap){
49 //        SoftReference<Bitmap> softReference = new SoftReference<Bitmap>(bitmap);
50 //        if(softReference!=null){
51 //            hashlist.put(url, softReference);
52 //        }
53         lrucache.put(url, bitmap);
54     }
55 }
时间: 2024-08-07 00:13:07

内存溢出解决方案的相关文章

应用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space)

http://www.educity.cn/wenda/351088.html 使用jacob组件造成的内存溢出解决方案(java.lang.OutOfMemoryError: Java heap space) 都说内存泄漏是C++的通病,内存溢出是Java的硬伤,这个头疼的问题算是让我给碰到了.我在做的这个功能涉及到修改word文档,因为微软没有公开word源代码,所以直接用java流来读取word的后果是读出来的会是乱码,经过查资料得知可以使用poi和jacob来操作word,jacob使用

PHP内存溢出解决方案

一.内存溢出解决方案 在做数据统计分析时,经常会遇到大数组,可能会发生内存溢出,这里分享一下我的解决方案.还是用例子来说明这个问题,如下: 假定日志中存放的记录数为500000条,那么解决方案如下: ini_set(‘memory_limit’,’64M’); //重置php可以使用的内存大小为64M,一般在远程主机上是不能修改php.ini文件的,只能通过程序设置.注:在safe_mode(安全模式)下,ini_set失效 set_time_limit(600);//设置超时限制为6分钟 $f

Linux配置内存依旧报内存溢出--解决方案

在linux环境下,tomcat7,部署war包.启动项目时报java.lang.OutOfMemoryError: PermGen space异常 PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期

JVM内存监视手段和内存溢出解决方案

引言 本文仅关注一些常见的虚拟机内存监视手段,以及JVM运行时数据区各个部分内存溢出的发生和对应的解决方案,总体来说属于概括性总结,涉及相对不是很深入,目的是让自己和其它初学者有一个框架性.概念性的了解,当遇到问题时有迹可循.不至于不知所措. 一.虚拟机内存监视手段 虚拟机常出现的问题包括:内存泄露.内存溢出.频繁GC导致性能下降等,导致这些问题的原因可以通过下面虚拟机内存监视手段来进行分析,具体实施时可能需要灵活选择,同时借助两种甚至更多的手段来共同分析. 比如GC日志可以分析出哪些GC较为频

eclipse Kepler tomcat内存溢出解决方案

使用eclipse开发ssh项目,本机8G内存,但是在打开一个表格后再打开一个页面,马上就内存溢出,网上搜到以下解决方案,未解决: 1.修改eclipse.ini参数 -vmargs -Xms1024m -Xmx2048m -XX:PermSize=1024M -XX:MaxPermSize=2048M 无效 2.修改tomcat catalina.bat 里面增加设置: set JAVA_OPTS= -Xms1024m -Xmx2048m 无效 3.修改jre的参数: 无效 最终解决方案 打开

vue2打包时内存溢出解决方案

vue项目完成时,若项目过大,就会出现内存溢出的问题,导致vue打包不成功 错误截图 解决方案 在依赖package.json中修改build为 "build":"node --max_old_space_size=4096 build/build.js" 截图如下:

Android 内存溢出解决方案(OOM)

众所周知,每个Android应用程序在运行时都有一定的内存限制,限制大小一般为16MB或24MB(视平台而定).因此在开发应用时需要特别关注自身的内存使用量,而一般最耗内存量的资源,一般是图片.音频文件.视频文件等多媒体资源:由于Android系统对音频.视频等资源做了边解析便播放的处理,使用时并不会把整个文件加载到内存中,一般不会出现内存溢出(以下简称OOM)的错误,因此它们的内存消耗问题暂不在本文的讨论范围.本文重点讨论的是图片的内存消耗问题,如果你要开发的是一款图片浏览器应用,例如像And

Android 内存溢出解决方案(OOM) 整理总结

标签:Android加载大 Android 移动开发 在最近做的工程中发现加载的图片太多或图片过大时经常出现OOM问题,找网上资料也提供了很多方法,但自己感觉有点乱,特此,今天在不同型号的三款安卓手机上做了测试,因为有效果也有结果,今天小马就做个详细的总结,以供朋友们共同交流学习,也供自己以后在解决OOM问题上有所提高,提前讲下,片幅有点长,涉及的东西太多,大家耐心看,肯定有收获的,里面的很多东西小马也是学习参考网络资料使用的,先来简单讲下下: 一般我们大家在遇到内存问题的时候常用的方式网上也有

jenkins 构建部署时tomcat7 内存溢出解决方案

在使用jenkins构建部署时一直出现tomcat7内存溢出 WARNING: Unexpected node monitoring termination: Clock Difference java.lang.OutOfMemoryError: PermGen space 修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh) “echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: se