Java内存占用过高问题分析

这篇具有很好参考价值的文章主要介绍了Java内存占用过高问题分析。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

  1. 这里我们创建一个springboot项目, 然后随便写一个contoller, 在这个controller中定义一个List集合, 然后再初始化的时候让集合中10万个字符串, 然后部署并启动项目(这里为了贴近实战, 我是在centos中启动的项目)

    Java内存占用过高问题分析

  2. 进入系统, 使用top命令显示系统中的进程信息, 然后点击H(大写), 以内存排序

    Java内存占用过高问题分析

    这时我们看到, Java程序占用了5.5%的内存

    前面VIRT列表示的是java申请了多少内存, RES表示实际使用了多少内存 这里的单位是k

    在这里主要是看一下概率情况, 同时拿到java程序的进程编号

  3. jdk为我们提供了jmap工具, 这个工具可以帮助我们扫描java进行当前的内存情况

    jmap的功能很多, 这里我们主要使用这个工具查看占用内存最多的类型是什么

    # 这里稍微解释一下, | 的作用是拼接多个命令, |后面的命令利用前面的命令的执行结果继续执行
    jmap -histo:live 2249762 | head -20
    

    Java内存占用过高问题分析

    num : 表示行号, #instances 表示jvm中总共有这个数量的实例对象 #bytes表示这些实例对象总共占用了多少内存(单位byte)

    我们看到, jvm中总共有124240个字符串对象, 显然不太合理

    到这里, 我们其实仅仅能知道jvm中出现了大量不正常的字符串对象, 至于这些字符串在什么位置, 什么原因产生的还是一无所知

  4. 接下来, 我们需要具体看看是哪些字符串占用了内存, 并且找出在引用关系, 看看是哪些对象在使用这些字符串

    jmap智能粗略的分析内存问题, 如果想要更细致的分析内存,比如说分析对象之间的引用关系, 可以使用jhat工具

    这个工具就需要们先将jvm内存详细信息导出到一个文件中,在使用jhat分析

    使用 jmap -dump:live,file=heap.bin 进程编号 命令, 将jvm内存导出到一个heap.bin文件中

    # 导出jvm结构
    jmap -dump:live,file=heap.bin 2254420
    

    Java内存占用过高问题分析

    # 使用jhat分析文件, jhat回启动一个服务器, 让我们可以在网页上查看信息, 默认端口是7000
    # 如果想要修改端口, 可以使用 -port 端口号的方式修改 jhat -port 8088 heap.bin
    jhat heap.bin
    

    Java内存占用过高问题分析

  5. 接下来我们就可以在浏览器中查看了 , 这里展示的内存中的所有对象的类型

    Java内存占用过高问题分析

    注意, 默认显示的是不包含jdk原生的类型的, 所以, String类型这里显示不出来, 需要将页面滑动到最下面

    Java内存占用过高问题分析

    All classes including platform: 显示所有的类型,包含java原生的类型

    Show all members of the rootset: 显示所有的根节点

    Show instance counts for all classes (including platform): 显示所有的类型的实例对象数量,包含jdk原生的类型

    Show instance counts for all classes (excluding platform): 显示所有的类型的实例对象数量,不包含jdk原生的类型

    Show heap histogram : 显示堆内存的统计信息, 其实这里就是上面 jmap -histo:live 命令展示的结果

    Show finalizer summary: 实现即将被回收的对象的信息

    Execute Object Query Language (OQL) query: 跳转到oql执行页面, 可以让我们使用类似于sql语句的形式查询对象.

  6. 点击 Show instance counts for all classes (including platform), 显示所有类型的对象信息

    Java内存占用过高问题分析

    这里我们看到, String类型的对象总共有128002个对象, 我们点击去就可以看到具体的字符串对象信息了. 这里我们看到有许多重复的字符串信息, 大概就是问题所在

    Java内存占用过高问题分析

    选择其中一个对象,点击进去, 着重显示的位置表示是当前对象被那个对象引用着, 这里能看到, 当前字符串被一个Object类型的数组引用着

    我们可以通过这个关系, 一层层的往上找, 知道找到们熟悉的对象

    Java内存占用过高问题分析

    我们点击之后, 可以进入到这个数组的详情页面, 这里有一个问题, 因为数组中的元素特别多, 当我们进入到数组的详情页面之后, 他的引用关系是显示在页面的最下面的, 让我们查看起来非常麻烦, 而且,如果数据量过多(>百万), 很有可能回引起页面崩溃.

    所以, 这里我们可以使用oql语句直接查询

    在主页上有进入oql语句的输入页面

    Java内存占用过高问题分析

    Java内存占用过高问题分析

    点击查询的结果, 进入到ArrayList集合中, 我们终于看到了一个熟悉的类型: MyController

    也就是说, 这个包含大量字符串对象的数组, 其实MyController中的ArrayList集合中的数据, 至此, 我么便可以结合源码, 进一步查询问题的所在了

    Java内存占用过高问题分析文章来源地址https://www.toymoban.com/news/detail-487219.html

到了这里,关于Java内存占用过高问题分析的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Java进程内存占用过高,排查解决方法

    Java进程内存占用过高,排查解决方法 在Java应用程序开发过程中,我们经常会遇到Java进程占用内存过高的问题。这可能会导致系统性能下降、应用程序崩溃甚至无法启动。本文将介绍一些常见的排查和解决方法,帮助您解决Java进程内存占用过高的问题。 检查内存泄漏 内存泄

    2024年02月07日
    浏览(43)
  • Docker Desktop Vmmem内存占用过高问题解决方案

    内存占用过高原因 主要原因是docker desktop的实现及基于wsl(Windows子系统),相当于在Windows上同时开了一个虚拟机,如果不对wsl的资源进行限制,它将会极大的获取系统资源.所以我们只需要对wsl的最大资源进行限制即可 解决方案 修改wsl配置文件 官方地址 具体配置: 在用户目录创建

    2024年02月05日
    浏览(44)
  • Java应用CPU占用过高问题排查

    测试环境CPU突然升高,日志查询无异常,可以通过使用jvm的调试工具定位问题。 1.定位java服务进程 2.定位java线程 3.定位代码块 1.定位进程 获取cpu占用高的进程pid 2.定位线程 转16进制 3.定位代码 目的:将当前堆栈信息保存为文件,通过16进制的TID查找问题所在的代码块;

    2024年02月12日
    浏览(44)
  • 解决mysql启动占用运行内存过高

    方法1(选取于网络,针对自己的服务器没起作用) 修改my.cnf参数: 重启mysql服务。我这里遇到的没解决,不知道其他人能够解决问题,物理 内存300M以及虚拟内存1G依旧,没改善。 方法2:(解决了当前自己遇到的问题) 要关闭 Performance Schema ,5.6默认开启的,该参数主要用

    2024年02月07日
    浏览(50)
  • SpringBoot 项目启动内存占用过高优化以及内存查看

    在使用SpringBoot 开发过程中,发现不管是本地还是测试环境只要一启动,动不动就占用1G内存,然而本地和测试环境的访问量却并没有多少,导致资源浪费; 2.1、启动命令示例(具体配置可根实际情况调整) nohup java -jar -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -Xms128m -Xmx128m -Xmn

    2024年02月03日
    浏览(43)
  • Linux中buff/cache内存占用过高,手动释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图:(可以看到总内存就251G,buff/cache占用了174G) 什么是buff buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。 什么是cache cache(Page

    2024年02月12日
    浏览(45)
  • docker占用内存过高的解决方案

    环境:系统macOS13,芯片M1Pro,内存16GB 在mac环境中运行docker,则会出现内存占用过高的情况,如下图:   具体原因如下所介绍:   也就是说,docker是无法直接运行在macOS中的,虽然它们都是类unix的。故而我猜测在每次运行一个container容器时,可能都会创建一个虚拟的Linux环境

    2024年02月12日
    浏览(43)
  • linux下的buff/cache内存占用过高-手动清除释放内存

    buff/cache内存占用太高 我们在使用free -h或者(top命令)查看系统内存的时候,有时间会发现buff/cache很高,如下图: 可以看到占用了377M的内存 什么是buff buff(Buffer Cache)是一种I/O缓存,用于内存和硬盘的缓冲,是io设备的读写缓冲区。 什么是cache cache(Page Cache)是一种高速缓

    2024年02月07日
    浏览(97)
  • linux缓冲区(buff/cache)内存占用过高解决办法

    1.查看当前内存剩余 2.发现free剩余很少,buff/cache占用很高 3.安装hcache查看谁在占用 3.发现是journal这个东西,这是linux系统日志,出现这种情况,一般是日志没有配置好 查看配置文件 将Storage=persistent 重启日志服务 手动清理缓存区 再次free -m 查看

    2024年01月18日
    浏览(46)
  • Vmmem进程(WSL)占用CPU或内存资源过高的解决办法

            有没有一瞬间,在开启docker或打开虚拟机时,内存瞬间飚增,进行查看进程消耗是一个Vmmem的进程在作祟,那么Vmmem是什么呢,又如何进行限制呢!         Vmmem: 是一个系统合成的虚拟进程,用于表示虚拟机小航的内存和CPU资源。换句话说,您看到的Vmmem消耗

    2024年02月13日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包