内存溢出
内存溢出的原因:程序在申请内存时,没有足够的内存空间。
内存溢出的几种方式:
1,栈溢出:方法死循环递归(StackOverflowError),不断创立线程(OutOfMemoryError)
2,堆溢出:不断创建对象,分配对象大于最大堆的大小(OutOfMemoryError)
3,直接内存:分配的本地内存大小大于JVM的限制。
4,方法区溢出:在经常动态生产大量Class的应用中,CGLib字节码增强,动态语言,大量JSP文件,大量基于OSGi的应用
内存泄漏
程序在申请内存后,无法释放已申请的内存空间。
内存泄漏的集中原因:
1,长生命周期的对象持有短生命周期对象的引用:例如将ArrayList设置为静态常量,则容器中的对象在程序结束之前是不能被释放的,从而造成内存泄漏。
2,链接未关闭:如数据库连接池、网络链接和IO链接等,只有链接被关闭后,才会回收对应的对象
3,变量作用域不合理:例如 1.一个变量的定义的作用范围大于其使用范围。2.没有及时把对象设置为null
4,内部类持有外部类:内部类的生命周期长于外部类,程序很容易产生内存泄漏。解决办法,使用软引用或弱引用,通过构造方法传递
5,Hash值得变化:在集合中,如果修改参与计算哈希值字段,会导致无法从集合中单独删除当前对象,造成内存泄漏
内存溢出和内存泄漏的区别
内存溢出:实实在在的内存空间不足导致
内存溢出:该释放的对象没有释放,多见于自己使用容易保存元素的请款下
如何避免
内存溢出:检查代码以及设置足够的堆空间大小
内存泄漏:一定是代码有问题
往往很多请款下,内存溢出旺旺是内存泄漏造成的。
监控工具:
1,MAT
2,JDK自带工具:jps、jstat、jinfo、jmap、jhat、jstack、
3,可视化工具:Jconsole、visualvm
来源:51CTO
作者:974297362
链接:https://blog.51cto.com/6324115/2475197