JVM性能优化

给你一囗甜甜゛ 提交于 2020-03-03 16:46:59

内存溢出

内存溢出的原因:程序在申请内存时,没有足够的内存空间。
内存溢出的几种方式
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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!