内存溢出/内存泄漏/八大基本数据类型

内存溢出/内存泄漏

1.什么是内存溢出
通俗理解就是内存不够,通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,或者程序在申请内存时,系统没有足够的内存空间供其所使用.也就是程序运行所需要的内存超过了系统剩余的内存.此时就会抛出OutOfMemoryError,这就是内存溢出。
2.内存溢出原因和解决办法
原因:
(1)内存中加载的数据量过于庞大,比如一次性从数据库中取出过多的数据
(2)数组,List,Map中存放的是对象的引用而不是对象,因为这些引用会导致对应的对象不能被释放,使得JVM不能回收,会大量存储在内存中
(3)代码中存在大量循环或死循环
(4)使用了大量的递归无无限递归
(4)引用变量过多的使用了static修饰(如:public static User u;)
(4)启动参数的内存值设定的过小
解决方法:
(1)修改JVM启动参数,直接增加内存
(2)对代码进行走查和分析,找出可能发生内存溢出的位置(比如:检查代码中是否有死循环或递归调用)
(3)检查对数据库查询中,是否有一次获得全部数据的查询。一般来说,如果一次取十万条记录到内存,就可能引起内存溢出。这个问题比较隐蔽,在上线前,数据库中 数据较少,不容易出问题,上线后,数据库中数据多了,一次查询就有可能引起内存溢出。因此对于数据库查询尽量采用分页的方式查询
3.什么是内存泄漏
是指程序中己动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果
4.哪些情况会导致内存泄漏且如何解决
当在堆中创建了对象,后来没有使用这个对象了,又没有把这个对象的引用设置为null,垃圾收集器就会认为这个对象是需要的,就不会清理这部分内存,然后就会导致这部分内存不可用

(1)集合类泄漏
集合如果只有添加元素的方法,没有相应的删除机制,就会到之后内存被占用。
如果这个集合是全局的变量,没有相应的删除机制,就会导致集合占用的内存只增加不减。
(2)单例造成的内存泄漏
单列的静态特性的生命周期和应用的生命周期一样长,如果使用不恰当,就会造成内存泄露。
(3)匿名内部类/非静态内部类和异步线程
非静态内部类创建静态实例造成的内存泄漏
(4)匿名内部类
Android 开发经常会继承继承实现activity、fragment、view,如果使用了匿名类,就异步线程持有,没有任何措施就会内存泄漏。
(5)Handler 造成的内存泄漏
handler、message和messageQueue都是相互关联在一起的,万一handler发送的message没有被处理,
message和发送的handler对象被线程messagequeue一直持有。handler属于tls变量,生命周期和view,activity是不一致的,导致无法正常释放。
(6)尽量避免使用 static 成员变量
如果你的app进程设计上是长驻内存的,那即使app切到后台,这部分内存也不会被释放。按照现在手机app内存管理机制,
占内存较大的后台进程将优先回收,yi’wei如果此app做过进程互保保活,那会造成app在后台频繁重启。
当手机安装了你参与开发的app以后一夜时间手机被消耗空了电量、流量,你的app不得不被用户卸载或者静默。
(7)避免 override finalize()
(8)资源未关闭造成的内存泄漏
对于使用了BraodcastReceiver,ContentObserver,File,游标 Cursor,Stream,Bitmap等资源的使用,
应该在Activity销毁时及时关闭或者注销,否则这些资源将不会被回收,造成内存泄漏。
5.如何检测内存泄漏
因为内存泄漏是在堆内存中,所以对我们来说并不是可见的。通常我们可以借助MAT、LeakCanary等工具来检测应用程序是否存在内存泄漏。
6.java中的8大基本数据类型
byte:8位,最大存储数据量是255,存放的数据范围是-128~127之间。
short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。
int:32位,最大数据存储容量是2的32次方减1,数据范围是负的2的31次方到正的2的31次方减1。
long:64位,最大数据存储容量是2的64次方减1,数据范围为负的2的63次方到正的2的63次方减1。
float:32位,数据范围在3.4e-45~1.4e38,直接赋值时必须在数字后加上f或F。
double:64位,数据范围在4.9e-324~1.8e308,赋值时可以加d或D也可以不加。
boolean:只有true和false两个取值。
char:16位,存储Unicode码,用单引号赋值。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值