28个案例问题分析---20---内存长期占用导致系统慢--jvm调优

简介: 28个案例问题分析---20---内存长期占用导致系统慢--jvm调优

jvm调优

三:总结&提升

一:背景介绍

在我们系统的生产环境上。core服务发生了内存占用很高的情况。今天我们就来盘一盘,遇到这种内存飙升的情况应该如何排查解决。

二:思路&方案

2.1 为什么会内存占用高?

2.1.1 启动jar包时,分配内存过小。

-Xms JVM启动时申请的初始Heap值。默认为操作系统物理内存的1/64但是小于1G。默认如果空余堆内存大于70%的时候,JVM会减小Heap的值,到我们使用 -xms 指定的大小。可以通过 -XX:MaxHeapFreeRation 指定对应比例。

-Xmx JVM可以申请的最大Heap值。默认为物理内存的1/4但是小于1G。默认如果空余堆内存小于40%的时候,JVM增大Heap到 -Xmx指定的大小。可以通过 -XX:MinHeapFreeRation指定对应比例。

2.1.2 jvm中创建了大量对象或者创建了多个大对象。

数据库一次性查询百万级别的超大量数据。

特殊场景的死循环bug。

大量文件操作放入系统。

大量流类数据未及时关闭,释放。

2.1.3 没有及时GC的释放内存。

GC在Jvm中通常由一个或者一组进程实现。当进行GC的时候,应用程序停止。GC结束之后,应用程序继续执行。如果GC运行的时间太短,可能会造成对象回收率低的情况,导致内存居高不下。


2.1.4 内存泄露

应用程序中存在内存泄漏的情况,即已经不再使用的对象仍然被保留在内存中,导致内存占用逐渐增加。


2.1.5 第三方库或框架的问题

应用程序依赖的第三方库或框架可能存在内存管理不当的问题,导致内存占用高。


2.2 怎么排查解决内存占用高的问题

2.2.1 启动jar包,分配内存小的问题。

启动jar包的时候,选择适量的内存大小。例如将初始内存最小设置成512M,最大内存大小设置成2GB:

java -Xms512m -Xmx2g -jar yourJarFile.jar

具体的大小,大家可以根据自己的实际情况进行调整。


2.2.2 jvm分析

jvisual 介绍

JVisualVM(VisualVM)是一个功能强大的Java虚拟机(JVM)监视和性能分析工具,它是Java Development Kit(JDK)提供的一个可视化工具。它提供了一种方便的方式来监视运行在JVM上的Java应用程序的性能、内存使用情况和线程行为。


以下是JVisualVM的主要特点和功能:


监视应用程序性能:JVisualVM可以监视应用程序的CPU使用率、内存使用情况、垃圾回收情况等性能指标,并以图表和统计数据的形式进行展示。这有助于发现性能瓶颈和优化应用程序的性能。


内存分析:JVisualVM提供了内存分析功能,可以查看Java堆的使用情况、对象的数量和大小、内存泄漏等问题。它还可以生成堆转储快照(Heap Dump),以便进一步分析和调试内存问题。


线程分析:通过JVisualVM,您可以监视应用程序中的线程活动,包括线程的状态、CPU时间片分配、死锁情况等。它还提供了线程转储快照(Thread Dump)的功能,用于分析和调试线程相关的问题。


远程监视:JVisualVM支持通过Java Management Extensions(JMX)和Java Remote Method Invocation(RMI)协议远程监视和管理远程主机上运行的Java应用程序。这使您能够在不同主机之间监视和诊断分布式系统。


插件扩展:JVisualVM提供了插件扩展机制,允许开发人员编写和安装自定义插件来扩展其功能。这使得JVisualVM可以与其他工具和平台集成,以满足特定的监视和分析需求。


总之,JVisualVM是一个强大的性能分析工具,可以帮助开发人员诊断和优化Java应用程序的性能和内存使用情况。它提供了丰富的功能和直观的用户界面,使得监视和分析应用程序变得更加简单和高效。


Jvisual 使用

jv加粗样式isual分析dump文件

jvisual文件是jdk1.8自带的分析工具,使用这个工具我们可以对dump文件进行内存分析。

使用命令生成dump文件,其中 pid为进程号,生成的dump文件会在当前目录下。(生产环境运行时,禁止使用)
jmap -dump:[live,]format=b,file=<filename> <pid>

进行分析

visualVm软件在我们的jdk的bin目录下自带,我们可以用它进行内存分析2.2.3 利用GC,及时进行内存释放

尽早释放无用的对象的引用。

我们在使用临时变量的时候,一般都是让引用变量在推出活动域后,自动设置为null,等待GC判定他们为不可到达对象,进行GC回收。但是对于一些复杂对象,这些对象有很多引用,比较复杂。等待GC进行回收的话,效率很低。我们可以将这些不在引用的对象赋值为null,加速GC的工作。

注意集合数据类型。(数组,图,链表,等数据结构),注意一些全局变量以及一些静态变量。这些变量一般不被回收。

可以使用System.gc,通知GC进行运行。但是Java语言规范并不保证,GC一定执行。

三:总结&提升


目录
相关文章
|
28天前
|
缓存 Prometheus 监控
Elasticsearch集群JVM调优设置合适的堆内存大小
Elasticsearch集群JVM调优设置合适的堆内存大小
232 1
|
18天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
18天前
|
存储 监控 算法
深入探索Java虚拟机(JVM)的内存管理机制
本文旨在为读者提供对Java虚拟机(JVM)内存管理机制的深入理解。通过详细解析JVM的内存结构、垃圾回收算法以及性能优化策略,本文不仅揭示了Java程序高效运行背后的原理,还为开发者提供了优化应用程序性能的实用技巧。不同于常规摘要仅概述文章大意,本文摘要将简要介绍JVM内存管理的关键点,为读者提供一个清晰的学习路线图。
|
22天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
54 7
|
27天前
|
Java
JVM内存参数
-Xmx[]:堆空间最大内存 -Xms[]:堆空间最小内存,一般设置成跟堆空间最大内存一样的 -Xmn[]:新生代的最大内存 -xx[use 垃圾回收器名称]:指定垃圾回收器 -xss:设置单个线程栈大小 一般设堆空间为最大可用物理地址的百分之80
|
25天前
|
监控 Java 编译器
Java虚拟机调优指南####
本文深入探讨了Java虚拟机(JVM)调优的精髓,从内存管理、垃圾回收到性能监控等多个维度出发,为开发者提供了一系列实用的调优策略。通过优化配置与参数调整,旨在帮助读者提升Java应用的运行效率和稳定性,确保其在高并发、大数据量场景下依然能够保持高效运作。 ####
27 1
|
28天前
|
Java
JVM运行时数据区(内存结构)
1)虚拟机栈:每次调用方法都会在虚拟机栈中产生一个栈帧,每个栈帧中都有方法的参数、局部变量、方法出口等信息,方法执行完毕后释放栈帧 (2)本地方法栈:为native修饰的本地方法提供的空间,在HotSpot中与虚拟机合二为一 (3)程序计数器:保存指令执行的地址,方便线程切回后能继续执行代码
21 3
|
27天前
|
存储 算法 Java
JVM进阶调优系列(10)敢向stop the world喊卡的G1垃圾回收器 | 有必要讲透
本文详细介绍了G1垃圾回收器的背景、核心原理及其回收过程。G1,即Garbage First,旨在通过将堆内存划分为多个Region来实现低延时的垃圾回收,每个Region可以根据其垃圾回收的价值被优先回收。文章还探讨了G1的Young GC、Mixed GC以及Full GC的具体流程,并列出了G1回收器的核心参数配置,帮助读者更好地理解和优化G1的使用。
|
28天前
|
存储 缓存 监控
Elasticsearch集群JVM调优堆外内存
Elasticsearch集群JVM调优堆外内存
45 1
|
28天前
|
监控 Java 测试技术
Elasticsearch集群JVM调优垃圾回收器的选择
Elasticsearch集群JVM调优垃圾回收器的选择
48 1