
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
内存问题是程序员在学习java编程语言的时候需要重点关注的一个编程问题,而今天我们就一起来了解一下,内存溢出与内存泄漏的常见类型。
一、内存溢出
内存溢出的原因:程序在申请内存时,没有足够的空间。
1.栈溢出
方法死循环递归调用(StackOverflowError)、不断建立线程(OutOfMemoryError)。
2.堆溢出
不断创建对象,分配对象大于大堆的大小(OutOfMemoryError)。
3.直接内存
JVM分配的本地直接内存大小大于JVM的限制,可以通过-XX:MaxDirectMemorySize来设置(不设置的话默认与堆内存大值一样,也会出现OOM异常)。
4.方法区溢出
一个类要被垃圾收集器回收掉,判定条件是比较苛刻的,在经常动态生产大量Class的应用中,CGLIb字节码增强,动态语言,大量JSP(JSP一次运行需要编译成Java类),基于OSGi的应用(同一个类,被不同的加载器加载也会设为不同的类),都可能会导致OOM。
二、内存泄露
程序在申请内存后,无法释放已申请的内存空间,导致这一部分的原因主要是代码写的不合理,比如以下几种情况。
1.长生命周期的对象持有短生命周期对象的引用
例如将ArrayList设置为静态变量,然后不断地向ArrayList中添加对象,则ArrayList容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。
2.连接未关闭
如数据库连接、网络连接和IO连接等,只有连接被关闭后,垃圾回收器才会回收对应的对象。
3.变量作用域不合理
例如:
一个变量的定义的作用范围大于其使用范围。
如果没有及时地把对象设置为null。
4.内部类持有外部类
Java的非静态内部类的这种创建方式,会隐式地持有外部类的引用,而且默认情况下这个引用是强引用,因此,如果内部类的生命周期长于外部类的生命周期,程序很容易就产生内存泄露
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。