解决项目中java heap space的问题[通俗易懂]

解决项目中java heap space的问题[通俗易懂]起因 17年的一个项目出了OOM(javaheapspace)问题,眼下有个问题:法院项目,不能外网,一连接外网高院会直接定位到计算机,发出警报(档案的机密性啊)不能远程,那只能视频教他们怎么做了,全程和一个文员说代码,真的很累==! 过程 这个过程对一个不太了解内存的问题的开发无疑是艰难的,搜了一下,知道了是内存溢出导致的,于是着手解决 网上大多数都说调整运行…

大家好,又见面了,我是你们的朋友全栈君。

 

  1. 起因

    1. 17年的一个项目出了OOM(java heap space)问题,眼下有个问题:法院项目,不能外网,一连接外网高院会直接定位到计算机,发出警报(档案的机密性啊)不能远程,那只能视频教他们怎么做了,全程和一个文员说代码,真的很累==!
  2. 过程

    1. 这个过程对一个不太了解内存的问题的开发无疑是艰难的,搜了一下,知道了是内存溢出导致的,于是着手解决
    2. 网上大多数都说调整运行内存,我也跟这个试了,但是不见效果,具体操作过程如下
      1. 设置-Xms256m  -Xmx512m -XX:PermSize=64M -XX:MaxPermSize=256M 出现异常,然后调大参数-Xms512m -Xmx1024m 没有解决,最后调整到2G 还没有解决  以上均在GUI界面修改java options参数,因为那边安装的服务,至于网上说修改注册表和catalina.bat或者catalina.sh的自行搜索

        解决项目中java heap space的问题[通俗易懂]

    3. 既然这样,那就只能通过代码优化了,开启项目,监听堆和内存运行情况,操作如下
      1. 先打开jdk下的内存监听程序(jdk/bin/jvisualvm.exe),这是jdk自带的,如果你项目已经打开的情况下,工具里面会显示tomcat运行的情况解决项目中java heap space的问题[通俗易懂]
      2. 只需要监听CPU和内存这两个部分,CPU会显示CPU运行情况和GC处理频率;内存会显示运行时堆内数据的变化,如对象实例等。
      3. 给出现内存溢出的模块发一个请求,如果有异常的情况下你就可以监测出来,我的就是一次性加载数据太多,实例化对象太多导致的堆中年轻代和老年代数据占用完,
      4. 我复现了一下,堆中出现了一个很高的点,那就是在加载树结构,然后忽然下落,是因为JVM 98% 的时间都用在了GC上,出现了java heap space ,CPU也能直观的看到,垃圾回收活动出现了一个较高的峰值

        解决项目中java heap space的问题[通俗易懂]

      5. 我们来看一下堆峰值时的数据,创建了300万的ArrayList和TreeVO对象

        解决项目中java heap space的问题[通俗易懂]

      6. 根据这些,知道了代码中出现的问题,代码中有一块调用了这样的代码,我们来看一下,这里创建了ArrayList和TreeVO ,而且ArrayList和TreeVO之间是强引用关系,GC不能清除,所以就导致了OOM

        解决项目中java heap space的问题[通俗易懂]

      7. 知道了问题,那就可以修改了,一步一步追溯到上面的方法,是因为查询条件的限制,像当于直接把所有文件查询出来,又因为数据有上万条,所以就各创建300W的对象,数据库删除排序条件,问题解决了 != 。=!
      8. 这里还不够理想,TreeVO应该放在循环外面,循环内把对象实例化,最后释放对象和集合
  3. 总结

    1. 问题总算解决了,这也是一次难得的真实上手内存的问题,可歌可泣啊
    2. 现在的开发人员可以说是上手就能写代码,往往忽视了最重要的基础
    3. 看书是必不可少的(因为我最近在看《深入理解java虚拟机》,不然怎么知道jvisualvm查看内存啊)
    4. 网上很多讲解内存的,但是不够全面,想要系统的了解还是看书吧

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/156892.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 文本相似度计算python lda_python文本相似度计算

    文本相似度计算python lda_python文本相似度计算原标题 python 文本相似度计算数据挖掘入门与实战公众号 datadw 步骤分词 去停用词词袋模型向量化文本 TF IDF 模型向量化文本 LSI 模型向量化文本计算相似度理论知识两篇中文文本 如何计算相似度 相似度是数学上的概念 自然语言肯定无法完成 所有要把文本转化为向量 两个向量计算相似度就很简单了 欧式距离 余弦相似度等等各种方法 只需要中学水平的数学知识 那么如何将文本表示成向量呢 词袋模型

    2025年11月26日
    2
  • Chrome您的连接不是私密连接解决办法–一个比较实用的技巧分享[通俗易懂]

    Chrome您的连接不是私密连接解决办法–一个比较实用的技巧分享[通俗易懂]问题:运行项目在Chrome中打开出现以下问题您的连接不是私密连接攻击者可能会试图从x.x.x.x窃取您的信息(例如:密码、通讯内容或信用卡信息)。了解详情NET::ERR_CERT_INVALID将您访问的部分网页的网址、有限的系统信息以及部分网页内容发送给Google,以帮助我们提升Chrome的安全性。隐私权政策x.x.x.x通常会使用加密技术来保护您的信息。GoogleChrome此次尝试连接到x.x.x.x时,此网站发回了异常的错误凭据。这可能是因为有攻击者在试图

    2022年5月2日
    168
  • python闭包详解_python闭包的使用场景

    python闭包详解_python闭包的使用场景闭包首先了解一下:如果在一个函数的内部定义了另一个函数,外部的我们叫他外函数,内部的我们叫他内函数。在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用

    2022年7月28日
    20
  • [Linux]Ubuntu 20.04换阿里源

    [Linux]Ubuntu 20.04换阿里源注意,这篇文章其实不是简单的教你怎么换成20.04的源,而是教你一种基于20.04的**方法**来换源。笔者在写这篇文章的时候,20.04还没有release出来正式版,但是已经可以在仓库里看到有源存在了,故写下这篇文章。

    2022年5月14日
    63
  • 苹果p12证书转换[通俗易懂]

    苹果p12证书转换[通俗易懂]先生成本地的keyopensslgenrsa-outaps_development.key2048#将key转换导出csr证书opensslreq-new-sha256-keyaps_development.key-outaps_development.csr拿着aps_development.csr在苹果开发者网站去得到cer然后解析ceropensslx509-informDER-outformPEM-inaps_development.

    2022年6月15日
    48
  • python安装cpickle_python中cPickle

    python安装cpickle_python中cPickle在python中,一般可以使用pickle类来进行python对象的序列化,而cPickle提供了一个更快速简单的接口,如python文档所说的:“cPickle–Afasterpickle”。cPickle可以对任意一种类型的python对象进行序列化操作,比如list,dict,甚至是一个类的对象等。而所谓的序列化,我的粗浅的理解就是为了能够完整的保存并能够完全可逆的恢复。在cPic…

    2022年6月15日
    52

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号