《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)

简介: 《JVM由浅入深学习九】 2024-01-15》JVM由简入深学习提升分(生产项目内存飙升分析)

开头语

大家好,欢迎来到本文!在Java生产项目中,内存飙升问题是一项需要高度关注的挑战。本文将深入分析Java项目内存飙升的原因,并通过实际案例进行详细分析,帮助我们更好地理解和解决内存问题。让我们一同探讨如何优化Java应用,确保其稳定高效运行!

下面是我的一个项目案例展示,让我们一起来探索内存飙高的奥秘

内存飙升问题分析与案例

问题背景:我华为云的一个服务器运行我的一个项目“csdn-automatic-triplet-0.0.1-SNAPSHOT.jar”,由于只是用来测试的服务器,只有2G,所以分配给堆的内存1024M

java -Xmx1024m -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/www/java_project/gc.log -XX:+UseG1GC -jar csdn-automatic-triplet-0.0.1-SNAPSHOT.jar

查询内存使用(top指令,再shift+M排序)

解决方式

  1. 查询java进程(这里分享三种方式,建议jps -l,别问为什么,不想多敲指令)
jps -l   或者  ps -ef|grep java
或者精确查找    ps -ef|grep csdn-automatic-triplet-0.0.1-SNAPSHOT.jar

  1. 根据上面查询的进程号(2067224)输出项目内具体内存使用情况(jmap)
jmap -histo 2067224 
jmap -histo 2067224 > jvm.txt // 输出到jvm.txt

  1. 将文件下载到本地分析(我这里用的事xshell,所以用xftp传输到本地)
    推荐一个文本工具NotePad++(好处就不多说了,做编程的很多伙伴都用这个)

  2. 在文件里面Ctrl+F搜索自己项目里面的目录

    结合具体情况,发现有占用内存比较多的对象,就可以去项目里找对应代码分析一下,是不是哪里有大量创建该对象,过多引用或者为什么没有被回收。
  3. 继续分析,打印堆信息(jmap)
jmap -heap 2067224 

主要看下面这些信息

  1. 继续打印对战信息(jmap)
    注意:改文件有点大,在生产服务器谨慎操作,最好导出到其他比较空闲的节点服务器
jmap -dump:format=b,file=heap.hprof 2067224

按照之前的方式下载到本地查看

这里推荐一个工具Memoryanalyzer,下载地址如下

https://eclipse.dev/mat/previousReleases.php

可以按照该博主的步骤安装

https://blog.csdn.net/zhou920786312/article/details/131857718

打开文件,默认选择Leak Suspect分析溢出

可以点击这些按钮查看对象使用内存情况及比例,当然,我这里没有泄露

泄露案例:

内存优化建议:

  • 合理使用缓存: 缓存是提高性能的有效手段,但需要谨慎使用,确保及时清理和更新缓存。
  • 定期分析Heap Dump: 定期生成Heap Dump文件,通过工具进行分析,及时发现和解决潜在的内存问题。
  • GC调优: 根据实际情况调整GC策略和参数,确保及时回收无用对象,降低内存压力。

结语

在Java生产项目中,内存飙升是一个复杂而常见的问题,需要我们深入分析和解决。通过本文的案例分析,我们希望能够帮助大家更好地理解和应对Java项目中的内存问题。**感谢阅读,让我们共同努力构建高效稳定的Java应用!**如果您有任何问题或想分享更多经验,请在评论区留言。

相关文章
|
2月前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
505 1
|
13天前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
76 20
|
1月前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
1月前
|
开发框架 .NET PHP
网站应用项目如何选择阿里云服务器实例规格+内存+CPU+带宽+操作系统等配置
对于使用阿里云服务器的搭建网站的用户来说,面对众多可选的实例规格和配置选项,我们应该如何做出最佳选择,以最大化业务效益并控制成本,成为大家比较关注的问题,如果实例、内存、CPU、带宽等配置选择不合适,可能会影响到自己业务在云服务器上的计算性能及后期运营状况,本文将详细解析企业在搭建网站应用项目时选购阿里云服务器应考虑的一些因素,以供参考。
|
2月前
|
监控 算法 Java
jvm-48-java 变更导致压测应用性能下降,如何分析定位原因?
【11月更文挑战第17天】当JVM相关变更导致压测应用性能下降时,可通过检查变更内容(如JVM参数、Java版本、代码变更)、收集性能监控数据(使用JVM监控工具、应用性能监控工具、系统资源监控)、分析垃圾回收情况(GC日志分析、内存泄漏检查)、分析线程和锁(线程状态分析、锁竞争分析)及分析代码执行路径(使用代码性能分析工具、代码审查)等步骤来定位和解决问题。
|
2月前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
2月前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
29 3
|
2月前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
61 1
|
3月前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
51 4
|
26天前
|
存储 Java 程序员
【JVM】——JVM运行机制、类加载机制、内存划分
JVM运行机制,堆栈,程序计数器,元数据区,JVM加载机制,双亲委派模型