热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

如何解决项目中javaheapspace的问题

这篇文章主要介绍了如何解决项目中javaheapspace的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

起因

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查看内存啊)
  • 网上很多讲解内存的,但是不够全面,想要系统的了解还是看书吧

到此这篇关于如何解决项目中java heap space的问题的文章就介绍到这了,更多相关java heap space问题内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!


推荐阅读
  • 作为一名新手,您可能会在初次尝试使用Eclipse进行Struts开发时遇到一些挑战。本文将为您提供详细的指导和解决方案,帮助您克服常见的配置和操作难题。 ... [详细]
  • 网络运维工程师负责确保企业IT基础设施的稳定运行,保障业务连续性和数据安全。他们需要具备多种技能,包括搭建和维护网络环境、监控系统性能、处理突发事件等。本文将探讨网络运维工程师的职业前景及其平均薪酬水平。 ... [详细]
  • PHP插件机制的实现方案解析
    本文深入探讨了PHP中插件机制的设计与实现,旨在分享一种可行的实现方式,并邀请读者共同讨论和优化。该方案不仅涵盖了插件机制的基本概念,还详细描述了如何在实际项目中应用。 ... [详细]
  • 本文深入探讨了HTTP请求和响应对象的使用,详细介绍了如何通过响应对象向客户端发送数据、处理中文乱码问题以及常见的HTTP状态码。此外,还涵盖了文件下载、请求重定向、请求转发等高级功能。 ... [详细]
  • 本文介绍如何将自定义项目设置为Tomcat的默认访问项目,使得通过IP地址访问时直接展示该自定义项目。提供了三种配置方法:修改项目路径、调整配置文件以及使用WAR包部署。 ... [详细]
  • 云计算的优势与应用场景
    本文详细探讨了云计算为企业和个人带来的多种优势,包括成本节约、安全性提升、灵活性增强等。同时介绍了云计算的五大核心特点,并结合实际案例进行分析。 ... [详细]
  • JavaScript 中创建对象的多种方法
    本文详细介绍了 JavaScript 中创建对象的几种常见方式,包括对象字面量、构造函数和 Object.create 方法,并提供了示例代码和属性描述符的解释。 ... [详细]
  • 简化报表生成:EasyReport工具的全面解析
    本文详细介绍了EasyReport,一个易于使用的开源Web报表工具。该工具支持Hadoop、HBase及多种关系型数据库,能够将SQL查询结果转换为HTML表格,并提供Excel导出、图表显示和表头冻结等功能。 ... [详细]
  • 在PHP后端开发中遇到一个难题:通过第三方类文件发送短信功能返回的JSON字符串无法解析。本文将探讨可能的原因并提供解决方案。 ... [详细]
  • 本文详细介绍了如何在云服务器上配置Nginx、Tomcat、JDK和MySQL。涵盖从下载、安装到配置的完整步骤,帮助读者快速搭建Java Web开发环境。 ... [详细]
  • 使用JS、HTML5和C3创建自定义弹出窗口
    本文介绍如何结合JavaScript、HTML5和C3.js来实现一个功能丰富的自定义弹出窗口。通过具体的代码示例,详细讲解了实现过程中的关键步骤和技术要点。 ... [详细]
  • 推荐几款高效测量图片像素的工具
    本文介绍了几款适用于Web前端开发的工具,这些工具可以帮助用户在图片上绘制线条并精确测量其像素长度。对于需要进行图像处理或设计工作的开发者来说非常实用。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • Java 中重写与重载的区别
    本文详细解析了 Java 编程语言中重写(Override)和重载(Overload)的概念及其主要区别,帮助开发者更好地理解和应用这两种多态性机制。 ... [详细]
  • 本文探讨了如何通过一系列技术手段提升Spring Boot项目的并发处理能力,解决生产环境中因慢请求导致的系统性能下降问题。 ... [详细]
author-avatar
_Rongrise
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有