如何解决项目中java heap space的问题

 更新时间:2020年07月16日 14:12:16   作者:smh0310  
这篇文章主要介绍了如何解决项目中java heap space的问题,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

起因

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问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java超详细大文件分片上传代码

    Java超详细大文件分片上传代码

    文件上传是一个很常见的功能。在项目开发过程中,我们通常都会使用一些成熟的上传组件来实现对应的功能,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
    2022-06-06
  • scala 读取txt文件的方法示例

    scala 读取txt文件的方法示例

    这篇文章主要介绍了scala 读取txt文件的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • Java实现多线程中的静态代理模式

    Java实现多线程中的静态代理模式

    静态代理属于设计模式中的代理模式。这篇文章主要介绍了Java实现多线程中的静态代理模式,详细的介绍了静态代理的使用,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • JDK动态代理详细解析

    JDK动态代理详细解析

    这篇文章主要介绍了JDK动态代理详细解析,在Java的动态代理机制中,有两个重要的类和接口,一个是InvoInvocationHandler(接口)、Proxy(类),这一个类和接口是我们动态代理所必须用到的,需要的朋友可以参考下
    2023-11-11
  • dubbo服务引用之创建Invoker流程详解

    dubbo服务引用之创建Invoker流程详解

    这篇文章主要为大家介绍了dubbo服务引用二之创建Invoker流程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 如何在SpringBoot项目中使用Oracle11g数据库

    如何在SpringBoot项目中使用Oracle11g数据库

    这篇文章主要介绍了在SpringBoot项目中使用Oracle11g数据库的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • 注入jar包里的对象,用@autowired的实例

    注入jar包里的对象,用@autowired的实例

    这篇文章主要介绍了注入jar包里的对象,用@autowired的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 浅谈spring的重试机制无效@Retryable@EnableRetry

    浅谈spring的重试机制无效@Retryable@EnableRetry

    这篇文章主要介绍了浅谈spring的重试机制无效@Retryable@EnableRetry,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 详解Java并发编程之volatile关键字

    详解Java并发编程之volatile关键字

    这篇文章主要为大家介绍了Java并发编程之volatile关键字,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2021-11-11
  • vscode搭建java开发环境的实现步骤

    vscode搭建java开发环境的实现步骤

    本文主要介绍了vscode搭建java开发环境,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03

最新评论