内存泄露,内存溢出

一:内存泄漏,内存溢出

内存泄露:是指无用对象(不再使用的对象)持续占有内存或无用对象的内存得不到及时释放,从而造成的内存空间的浪费称为内存泄露。内存泄露有时不严重且不易察觉,这样开发者就不知道存在内存泄露,但有时也会很严重,会提示你Out of memory。

避免内存溢出
OOM即Out Of Memory,一般是由程序编写者对内存使用不当,如对该释放的内存资源没有释放,导致其一直不能被再次使用而使内存被耗尽的现象。根本的解决办法是对代码进行优化:在内存引用上做些处理,使用软引用,虚引用和弱引用;在内存中加载图片时直接在内存中做处理,如边界压缩等;建立动态回收内存机制;优化Dalvik虚拟机的堆内存分配,自定义堆内存大小等。

1.数据库的cursor没有关闭

2.构造adapter没有使用缓存Converview

3.调用registerReceiver后未调用unregisterReceiver

4.未关闭InputStream/OutputStream

5.Bitmap使用未调用recycle

6.Context泄漏

7.static关键字等

Java代码导致OutOfMemoryError错误的解决:

需要重点排查以下几点:

检查代码中是否有死循环或递归调用。
检查是否有大循环重复产生新对象实体。
检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询。
检查List、MAP等集合对象是否有使用完后,未清除的问题。List、MAP等集合对象会始终存有对对象的引用,使得这些对象不能被GC回收。

内存泄漏可以分为4类:

1) 常发性内存泄漏。发生内存泄漏的代码会被多次执行到,每次被执行的时候都会导致一块内存泄漏。

2) 偶发性内存泄漏。发生内存泄漏的代码只有在某些特定环境或操作过程下才会发生。常发性和偶发性是相对的。对于特定的环境,偶发性的也许就变成了常发性的。所以测试环境和测试方法对检测内存泄漏至关重要。

3) 一次性内存泄漏。发生内存泄漏的代码只会被执行一次,或者由于算法上的缺陷,导致总会有一块仅且一块内存发生泄漏。比如,在类的构造函数中分配内存,在析构函数中却没有释放该内存,所以内存泄漏只会发生一次。

事实上在Java的GC机制中如果一个对象有着具体的引用,那么是不会被GC自动回收的。
也就是说:

Object obj = new Object();//写在100个循环内等于你有100个引用对应了100个对象
所以100个对象在一段时间内都是会占用内存,直到内存不足GC主动回收

obj = new Object();//写在100个循环内等于你使用1个引用分别100次调用了100个对象
所以当后一个对象init后,前一个对象已经是“无引用状态”,会很快的被GC自动回收
(在你的循环还未结束时,可能已经进行了多次GC回收,这点很重要)

也就是说第二种方法能更好的管理内存。

二:请求超时或者响应超时:

HTTP 503 错误 – 服务不可用 (Service unavailable)
因暂时超载或临时维护,您的 Web 服务器目前无法处理 HTTP 请求。 其含义是, 这是一个暂时情况,会有一些延误, 过 后将会得到缓解。 有些服务器在这种情况下也许干脆拒绝套接字(socket) 连接,在这种情况下,可能会由于套接字建立超时而产生不同的错误信息。

ConnectException : 指的是服务器请求超时
SocketTimeoutException:指的是服务器响应超时

你可能感兴趣的:(Java运维)