解决项目中java heap space的问题[通俗易懂]
2023-06-13 09:12:12 时间
大家好,又见面了,我是你们的朋友全栈君。
- 起因
- 17年的一个项目出了OOM(java heap space)问题,眼下有个问题:法院项目,不能外网,一连接外网高院会直接定位到计算机,发出警报(档案的机密性啊)不能远程,那只能视频教他们怎么做了,全程和一个文员说代码,真的很累==!
- 过程
- 这个过程对一个不太了解内存的问题的开发无疑是艰难的,搜了一下,知道了是内存溢出导致的,于是着手解决
- 网上大多数都说调整运行内存,我也跟这个试了,但是不见效果,具体操作过程如下
- 设置-Xms256m -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M 出现异常,然后调大参数-Xms512m -Xmx1024m 没有解决,最后调整到2G 还没有解决 以上均在GUI界面修改java options参数,因为那边安装的服务,至于网上说修改注册表和catalina.bat或者catalina.sh的自行搜索
- 既然这样,那就只能通过代码优化了,开启项目,监听堆和内存运行情况,操作如下
- 先打开jdk下的内存监听程序(jdk/bin/jvisualvm.exe),这是jdk自带的,如果你项目已经打开的情况下,工具里面会显示tomcat运行的情况
- 只需要监听CPU和内存这两个部分,CPU会显示CPU运行情况和GC处理频率;内存会显示运行时堆内数据的变化,如对象实例等。
- 给出现内存溢出的模块发一个请求,如果有异常的情况下你就可以监测出来,我的就是一次性加载数据太多,实例化对象太多导致的堆中年轻代和老年代数据占用完,
- 我复现了一下,堆中出现了一个很高的点,那就是在加载树结构,然后忽然下落,是因为JVM 98% 的时间都用在了GC上,出现了java heap space ,CPU也能直观的看到,垃圾回收活动出现了一个较高的峰值
- 我们来看一下堆峰值时的数据,创建了300万的ArrayList和TreeVO对象
- 根据这些,知道了代码中出现的问题,代码中有一块调用了这样的代码,我们来看一下,这里创建了ArrayList和TreeVO ,而且ArrayList和TreeVO之间是强引用关系,GC不能清除,所以就导致了OOM
- 知道了问题,那就可以修改了,一步一步追溯到上面的方法,是因为查询条件的限制,像当于直接把所有文件查询出来,又因为数据有上万条,所以就各创建300W的对象,数据库删除排序条件,问题解决了 != 。=!
- 这里还不够理想,TreeVO应该放在循环外面,循环内把对象实例化,最后释放对象和集合
- 总结
- 问题总算解决了,这也是一次难得的真实上手内存的问题,可歌可泣啊
- 现在的开发人员可以说是上手就能写代码,往往忽视了最重要的基础
- 看书是必不可少的(因为我最近在看《深入理解java虚拟机》,不然怎么知道jvisualvm查看内存啊)
- 网上很多讲解内存的,但是不够全面,想要系统的了解还是看书吧
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/156892.html原文链接:https://javaforall.cn
相关文章
- Java项目毕业设计:基于springboot+vue的电影视频网站系统「建议收藏」
- 并发编程篇:java 高并发面试题
- java数组反转,Java数组反转
- java指定长度数组长度_Java声明数组时不能指定其长度[通俗易懂]
- java backoff_Java BackOff类代码示例
- eclipse怎么导入java文件_Eclipse如何导入JAVA工程?如何将项目导入Eclipse中?
- java 汉字乱码_Java中文乱码问题
- n皇后问题 回溯法java_Java解决N皇后问题
- Java list foreach_java的foreach
- java 设置400错误_Java项目报400错误的原因与解决方法
- java实现http协议_java用http协议本地文件
- Java-基础项目HelloServlet
- JProfiler 13 for Mac(Java开发分析工具)
- java并发编程(1):Java多线程-基本线程类-基础知识复习笔记
- 如何使用gradle将java项目推送至maven中央仓库
- java上传图片文件和回显详解编程语言
- Linux下Java编程之旅(linux执行java)
- Linux下部署Java项目实践(linux部署java项目)
- Linux下配置Java开发环境的指南(linux配置java环境)
- 数据处理实现Java环境下的Redis过期数据管理(redisjava过期)
- 管理Linux下Java版本管理:轻松实现多版本切换(linux下java版本)
- 在Java中利用Oracle数据库进行应用开发(java中oracle)
- 项目Java项目中展现Redis新型性能优势(redis运用在java)