内存溢出 out of memory和内存泄露tomcat memory leakk的区别和联系

博客分类:
在做的程序老是内存溢出,在网上查了点资料先记下来
内存溢出主要由以下几种情况引起:
1.数据库的cursor没有关闭。
2.构造adapter没有使用缓存contentview。
3.调用registerReceiver后未调用unregisterReceiver()。
4.未关闭InputStream/OutputStream。
5.Bitmap使用后未调用recycle()。
6.Context泄漏。
前5种情况容易发现和解决,只要把该关的及时关闭,该调用的方法及时调用,就不会有太多问题,另外java里还有软引用帮助管理内存:
SoftReference&Bitmap&bitmap = new SoftReference&Bitmap&(pBitmap);if(bitmap != null){
if(bitmap.get() != null && !bitmap.get().isRecycled()){bitmap.get().recycle();bitmap =}}
下面着重介绍Context泄漏。
这是一个很隐晦的内存泄露的情况。先看一个Android官网提供的例子:
private static Drawable sB
protected void onCreate(Bundle state) {
super.onCreate(state);
TextView label = new TextView(this);
label.setText("Leaks are bad");
if (sBackground == null) {
sBackground = getDrawable(R.drawable.large_bitmap);
label.setBackgroundDrawable(sBackground);
setContentView(label);
这段代码效率很快,但同时又是极其错误的;在第一次屏幕方向切换时它泄露了一开始创建的Activity。当一个Drawable附加到一个View上时,View会将其作为一个callback设定到Drawable上。上述的代码片段,意味着Drawable拥有一个TextView的引用,而TextView又拥有Activity(Context类型)的引用,换句话说,Drawable拥有了更多的对象引用。即使Activity被销毁,内存仍然不会被释放。
另外,对Context的引用超过它本身的生命周期,也会导致Context泄漏。所以尽量使用Application这种Context类型。这种Context拥有和应用程序一样长的生命周期,并且不依赖Activity的生命周期。如果你打算保存一个长时间的对象,并且其需要一个Context,记得使用Application对象。你可以通过调用Context.getApplicationContext()或Activity.getApplication()轻松得到Application对象。
最近遇到一种情况引起了Context泄漏,就是在Activity销毁时,里面有其他线程没有停。
总结一下避免Context泄漏应该注意的问题:
1.使用Application这种Context类型。
2.注意对Context的引用不要超过它本身的生命周期。
3.慎重的使用“static”关键字。
4.Context里如果有线程,一定要在onDestroy()里及时停掉。
模拟器RAM比较小,只有8M内存,当我放入的大量的图片(每个100多K左右),就出现上面的原因。由于每张图片先前是压缩的情况。放入到Bitmap的时候,大小会变大,导致超出RAM内存,具体解决办法如下:
  //解决加载图片内存溢出的问题
  //Options只保存图片尺寸大小,不保存图片到内存
  BitmapFactory.Optionsopts=newBitmapFactory.Options();
  /*缩放的比例,缩放是很难按准备的比例进行缩放的,其值表明缩放的倍数,SDK中建议其值是2的指数值,值越大会导致图片不清晰*/
  opts.inSampleSize=4;
  Bitmapbmp=
  bmp=BitmapFactory.decodeResource(getResources(),mImageIds[position],opts);
  //回收
  bmp.recycle();
  还可以用到优化Dalvik虚拟机的堆内存分配 
  对于Android平台来说,其托管层使用的DalvikJavaVM从目前的表现来看还有很多地方可以优化处理,比如我们在开发一些大型游戏或耗资源的应用中可能考虑手动干涉GC处理,使用dalvik.system.VMRuntime类提供的setTargetHeapUtilization方法可以增强程序堆内存的处理效率。当然具体原理我们可以参考开源工程,这里我们仅说下使用方法:privatefinalstaticfloatTARGET_HEAP_UTILIZATION=0.75f;在程序onCreate时就可以调用VMRuntime.getRuntime().setTargetHeapUtilization(TARGET_HEAP_UTILIZATION);
  Android堆内存也可自己定义大小
  对于一些Android项目,影响性能瓶颈的主要是Android自己内存管理机制问题,除了优化Dalvik虚拟机的堆内存分配外,我们还可以强制定义自己软件的对内存大小,我们使用Dalvik提供的dalvik.system.VMRuntime类来设置最小堆内存为例:
    privatefinalstaticintCWJ_HEAP_SIZE=6*;
  VMRuntime.getRuntime().setMinimumHeapSize(CWJ_HEAP_SIZE);
  //设置最小heap内存为6MB大小。当然对于内存吃紧来说还可以通过手动干涉GC去处理
hilary3113
浏览: 211473 次
来自: 邯郸
niub,楼主真是太牛逼了
谢谢分享学习中
kondoh 写道呵呵,看参数名 paramAbsListVi ...
呵呵,看参数名 paramAbsListView,就知道是反编 ...
恩,不错哦
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'内存溢出和内存泄漏的区别_百度知道
内存溢出和内存泄漏的区别
我有更好的答案
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光。
采纳率:73%
来自团队:
为您推荐:
其他类似问题
您可能关注的内容
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。Android:内存溢出和内存泄漏的区别、产生原因以及解决方案
Android:内存溢出和内存泄漏的区别、产生原因以及解决方案
一:区别:
1)内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。
2)内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内存空间,一次内存泄露危害可以忽略,但内存泄露堆积后果很严重,无论多少内存,迟早会被占光
内存泄漏本身不会产生什么危害,作为一般的用户,根本感觉不到内存泄漏的存在。真正有危害的是内存泄漏的堆积,这会最终消耗尽系统所有的内存。从这个角度来说,一次性内存泄漏并没有什么危害,因为它不会堆积,而隐式内存泄漏危害性则非常大。导致程序crash;二:产生的原因:定义中已经给出,下面说一下内存溢出产生的地方:
1.内存中加载的数据量过于庞大,如一次从数据库取出过多数据;
2.集合类中有对对象的引用,使用完后未清空,使得JVM不能回收;
3.代码中存在死循环或循环产生过多重复的对象实体;
4.使用的第三方软件中的BUG;
5.启动参数内存值设定的过小三:解决方案:不管那种错误都会涉及到内存定位优化我们可以从一下几部来避免和解决内存泄漏和溢出的问题:1)处理一些IO流的数据传输时,尽量结束时候把IO流关掉2)处理下载照片时候,使用BitmapFactory.options。设置insameplesize()方法压缩图片减少资源的占用;图片的压缩问题下面会写一个专门专题来讲;3)还可以通过降低照片像素的方法,从而降低占用的内存4)资源的回收:Bitmap.recycle()bitmap=5)尽量使用全局的变量,少new新的对象
转自:http://m.blog.csdn.net/shanyu/article/details/ 一、概念与区别内存溢出out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申...
内存溢出 out of memory:是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak:是指程序在申请内存后,无法释放已申请的内...
Android 基础 1.oom
内存泄漏 一个程序中,已经不需要使用某个对象,但是仍然有引用指向它,垃圾回收器无法回收它,该对象占用的内存无法被回收时,就容易造成内存泄露。 一、单例造成的内存泄漏 Android的单例模式非常受开发者的喜爱,不过使用的不恰当的话也会造成...
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内...
内存溢出 out of memory,是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory;比如申请了一个integer,但给它存了long才能存下的数,那就是内存溢出。 内存泄露 memory leak,是指程序在申请内存后,无法释放已申请的内...
日,如是家人黄从刚,种种子第26天 发心:我今不是为了我个人而闻思修,而是为了六道轮回一切如母有情众生,愿一切如母有情众生能够早日离苦得乐,清净业障,福慧增长,早证菩提。 (1)捐建道明寺2元,愿道明寺早日筹款成功,更多信众以及善心人士,能够伸出援助之手,...
【01】 和简先生的感情始于一顿晚餐。 与大多数单身男女不同,我并不排斥相亲这种目的性极强的对决形式。相反,我认为这是追寻婚姻不耍流氓和不被耍流氓的最佳途径。 遗憾的是,我的父母却并不像别人的爸妈那样,成天不是催婚,就是各种安排相亲。他们对我的放养,让我很受伤。 而我所认识...博客分类:
虽然jvm可以通过GC自动回收无用的内存,但是代码不好的话仍然存在内存溢出的风险。
最近在网上搜集了一些资料,现整理如下:
——————————————————————————————————————————
一、为什么要了解内存泄露和内存溢出?
1、内存泄露一般是代码设计存在缺陷导致的,通过了解内存泄露的场景,可以避免不必要的内存溢出和提高自己的代码编写水平;
2、通过了解内存溢出的几种常见情况,可以在出现内存溢出的时候快速的定位问题的位置,缩短解决故障的时间。
二、基本概念
理解这两个概念非常重要。
内存泄露:指程序中动态分配内存给一些临时对象,但是对象不会被GC所回收,它始终占用内存。即被分配的对象可达但已无用。
内存溢出:指程序运行过程中无法申请到足够的内存而导致的一种错误。内存溢出通常发生于OLD段或Perm段垃圾回收后,仍然无内存空间容纳新的Java对象的情况。
从定义上可以看出内存泄露是内存溢出的一种诱因,不是唯一因素。
三、内存泄露的几种场景:
1、长生命周期的对象持有短生命周期对象的引用
这是内存泄露最常见的场景,也是代码设计中经常出现的问题。
例如:在全局静态map中缓存局部变量,且没有清空操作,随着时间的推移,这个map会越来越大,造成内存泄露。
2、修改hashset中对象的参数值,且参数是计算哈希值的字段
当一个对象被存储进HashSet集合中以后,就不能修改这个对象中的那些参与计算哈希值的字段,否则对象修改后的哈希值与最初存储进HashSet集合中时的哈希值就不同了,在这种情况下,即使在contains方法使用该对象的当前引用作为参数去HashSet集合中检索对象,也将返回找不到对象的结果,这也会导致无法从HashSet集合中删除当前对象,造成内存泄露。
3、机器的连接数和关闭时间设置
长时间开启非常耗费资源的连接,也会造成内存泄露。
四、内存溢出的几种情况:
1、堆内存溢出(outOfMemoryError:java heap space)
在jvm规范中,堆中的内存是用来生成对象实例和数组的。
如果细分,堆内存还可以分为年轻代和年老代,年轻代包括一个eden区和两个survivor区。
当生成新对象时,内存的申请过程如下:
a、jvm先尝试在eden区分配新建对象所需的内存;
b、如果内存大小足够,申请结束,否则下一步;
c、jvm启动youngGC,试图将eden区中不活跃的对象释放掉,释放后若Eden空间仍然不足以放入新对象,则试图将部分Eden中活跃对象放入Survivor区;
d、Survivor区被用来作为Eden及old的中间交换区域,当OLD区空间足够时,Survivor区的对象会被移到Old区,否则会被保留在Survivor区;
e、 当OLD区空间不够时,JVM会在OLD区进行full GC;
f、full GC后,若Survivor及OLD区仍然无法存放从Eden复制过来的部分对象,导致JVM无法在Eden区为新对象创建内存区域,则出现”out of memory错误”:
outOfMemoryError:java heap space
代码举例:
* 堆内存溢出
* jvm参数:-Xms5m -Xmx5m -Xmn2m -XX:NewSize=1m
public class MemoryLeak {
private String[] s = new String[1000];
public static void main(String[] args) throws InterruptedException {
Map&String,Object& m =new HashMap&String,Object&();
int j=10000;
while(true){
for(;i&j;i++){
MemoryLeak memoryLeak = new MemoryLeak();
m.put(String.valueOf(i), memoryLeak);
2、方法区内存溢出(outOfMemoryError:permgem space)
在jvm规范中,方法区主要存放的是类信息、常量、静态变量等。
所以如果程序加载的类过多,或者使用反射、gclib等这种动态代理生成类的技术,就可能导致该区发生内存溢出,一般该区发生内存溢出时的错误信息为:
outOfMemoryError:permgem space
代码举例:
jvm参数:-XX:PermSize=2m -XX:MaxPermSize=2m
将方法区的大小设置很低即可,在启动加载类库时就会出现内存不足的情况
3、线程栈溢出(java.lang.StackOverflowError)
线程栈时线程独有的一块内存结构,所以线程栈发生问题必定是某个线程运行时产生的错误。
一般线程栈溢出是由于递归太深或方法调用层级过多导致的。
发生栈溢出的错误信息为:
java.lang.StackOverflowError
代码举例:
* 线程操作栈溢出
* 参数:-Xms5m -Xmx5m -Xmn2m -XX:NewSize=1m -Xss64k
public class StackOverflowTest {
public static void main(String[] args) {
private static void digui(int i){
System.out.println(i++);
String[] s = new String[50];
五、为了避免内存泄露,在编写代码的过程中可以参考下面的建议:
1、尽早释放无用对象的引用
2、使用字符串处理,避免使用String,应大量使用StringBuffer,每一个String对象都得独立占用内存一块区域
3、尽量少用静态变量,因为静态变量存放在永久代(方法区),永久代基本不参与垃圾回收
4、避免在循环中创建对象
5、开启大型文件或从数据库一次拿了太多的数据很容易造成内存溢出,所以在这些地方要大概计算一下数据量的最大值是多少,并且设定所需最小及最大的内存空间值。
http://zhidao.baidu.com/question/.html
https://www.ibm.com/developerworks/cn/java/l-JavaMemoryLeak/
Java的内存泄漏
http://jelly-x.iteye.com/blog/1120406 JVM内存分析及导致内存溢出
http://wenku.baidu.com/view/efb0717fd5ddda.html java内存泄露和内存溢出
浏览 19558
浏览: 197908 次
来自: 杭州
& target=&_blank&quot ...
楼主写的真不错啊,很多人的博客只说客户端发一次请求就会生成ht ...
当你所有的东西都弄好之后,在项目里面启动jetty服务器后出现 ...
rc111x 写道L_Griselda 写道L_Griseld ...
L_Griselda 写道L_Griselda 写道你好,我想 ...
(window.slotbydup=window.slotbydup || []).push({
id: '4773203',
container: s,
size: '200,200',
display: 'inlay-fix'Out of memory while expanding memory stream!!! 各位达人,拜托了,偶郁闷的说
[问题点数:100分,结帖人delphiplus]
Out of memory while expanding memory stream!!! 各位达人,拜托了,偶郁闷的说
[问题点数:100分,结帖人delphiplus]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
2004年4月 总版技术专家分月排行榜第二
2006年1月 Delphi大版内专家分月排行榜第一2005年12月 Delphi大版内专家分月排行榜第一2005年11月 Delphi大版内专家分月排行榜第一2005年10月 Delphi大版内专家分月排行榜第一2005年6月 Delphi大版内专家分月排行榜第一2004年10月 Delphi大版内专家分月排行榜第一2004年9月 Delphi大版内专家分月排行榜第一2004年8月 Delphi大版内专家分月排行榜第一2004年7月 Delphi大版内专家分月排行榜第一2004年6月 Delphi大版内专家分月排行榜第一2004年5月 Delphi大版内专家分月排行榜第一2004年4月 Delphi大版内专家分月排行榜第一2004年3月 Delphi大版内专家分月排行榜第一2003年12月 Delphi大版内专家分月排行榜第一2003年11月 Delphi大版内专家分月排行榜第一
匿名用户不能发表回复!|

我要回帖

更多关于 tomcat memory leak 的文章

 

随机推荐