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一定执行。

三:总结&提升


目录
相关文章
|
3天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
24天前
|
存储 安全 Java
jvm 锁的 膨胀过程?锁内存怎么变化的
【10月更文挑战第3天】在Java虚拟机(JVM)中,`synchronized`关键字用于实现同步,确保多个线程在访问共享资源时的一致性和线程安全。JVM对`synchronized`进行了优化,以适应不同的竞争场景,这种优化主要体现在锁的膨胀过程,即从偏向锁到轻量级锁,再到重量级锁的转变。下面我们将详细介绍这一过程以及锁在内存中的变化。
35 4
|
24天前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
50 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
8天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
75 9
|
6天前
|
存储 监控 Java
JVM进阶调优系列(8)如何手把手,逐行教她看懂GC日志?| IT男的专属浪漫
本文介绍了如何通过JVM参数打印GC日志,并通过示例代码展示了频繁YGC和FGC的场景。文章首先讲解了常见的GC日志参数,如`-XX:+PrintGCDetails`、`-XX:+PrintGCDateStamps`等,然后通过具体的JVM参数和代码示例,模拟了不同内存分配情况下的GC行为。最后,详细解析了GC日志的内容,帮助读者理解GC的执行过程和GC处理机制。
|
14天前
|
存储 算法 Java
聊聊jvm的内存结构, 以及各种结构的作用
【10月更文挑战第27天】JVM(Java虚拟机)的内存结构主要包括程序计数器、Java虚拟机栈、本地方法栈、Java堆、方法区和运行时常量池。各部分协同工作,为Java程序提供高效稳定的内存管理和运行环境,确保程序的正常执行、数据存储和资源利用。
39 10
|
12天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
14天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
14天前
|
Arthas 监控 数据可视化
JVM进阶调优系列(7)JVM调优监控必备命令、工具集合|实用干货
本文介绍了JVM调优监控命令及其应用,包括JDK自带工具如jps、jinfo、jstat、jstack、jmap、jhat等,以及第三方工具如Arthas、GCeasy、MAT、GCViewer等。通过这些工具,可以有效监控和优化JVM性能,解决内存泄漏、线程死锁等问题,提高系统稳定性。文章还提供了详细的命令示例和应用场景,帮助读者更好地理解和使用这些工具。
|
20天前
|
监控 架构师 Java
JVM进阶调优系列(6)一文详解JVM参数与大厂实战调优模板推荐
本文详述了JVM参数的分类及使用方法,包括标准参数、非标准参数和不稳定参数的定义及其应用场景。特别介绍了JVM调优中的关键参数,如堆内存、垃圾回收器和GC日志等配置,并提供了大厂生产环境中常用的调优模板,帮助开发者优化Java应用程序的性能。