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

三:总结&提升


目录
相关文章
|
12天前
|
Web App开发 监控 JavaScript
监控和分析 JavaScript 内存使用情况
【10月更文挑战第30天】通过使用上述的浏览器开发者工具、性能分析工具和内存泄漏检测工具,可以有效地监控和分析JavaScript内存使用情况,及时发现和解决内存泄漏、过度内存消耗等问题,从而提高JavaScript应用程序的性能和稳定性。在实际开发中,可以根据具体的需求和场景选择合适的工具和方法来进行内存监控和分析。
|
1月前
|
编译器 C语言
动态内存分配与管理详解(附加笔试题分析)(上)
动态内存分配与管理详解(附加笔试题分析)
49 1
|
6天前
|
Arthas 监控 Java
JVM进阶调优系列(9)大厂面试官:内存溢出几种?能否现场演示一下?| 面试就那点事
本文介绍了JVM内存溢出(OOM)的四种类型:堆内存、栈内存、元数据区和直接内存溢出。每种类型通过示例代码演示了如何触发OOM,并分析了其原因。文章还提供了如何使用JVM命令工具(如jmap、jhat、GCeasy、Arthas等)分析和定位内存溢出问题的方法。最后,强调了合理设置JVM参数和及时回收内存的重要性。
|
8天前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
29 6
|
7天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
1月前
|
缓存 算法 Java
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
这篇文章详细介绍了Java虚拟机(JVM)中的垃圾回收机制,包括垃圾的定义、垃圾回收算法、堆内存的逻辑分区、对象的内存分配和回收过程,以及不同垃圾回收器的工作原理和参数设置。
60 4
JVM知识体系学习六:JVM垃圾是什么、GC常用垃圾清除算法、堆内存逻辑分区、栈上分配、对象何时进入老年代、有关老年代新生代的两个问题、常见的垃圾回收器、CMS
|
17天前
|
Web App开发 JavaScript 前端开发
使用 Chrome 浏览器的内存分析工具来检测 JavaScript 中的内存泄漏
【10月更文挑战第25天】利用 Chrome 浏览器的内存分析工具,可以较为准确地检测 JavaScript 中的内存泄漏问题,并帮助我们找出潜在的泄漏点,以便采取相应的解决措施。
116 9
|
21天前
|
并行计算 算法 IDE
【灵码助力Cuda算法分析】分析共享内存的矩阵乘法优化
本文介绍了如何利用通义灵码在Visual Studio 2022中对基于CUDA的共享内存矩阵乘法优化代码进行深入分析。文章从整体程序结构入手,逐步深入到线程调度、矩阵分块、循环展开等关键细节,最后通过带入具体值的方式进一步解析复杂循环逻辑,展示了通义灵码在辅助理解和优化CUDA编程中的强大功能。
|
22天前
|
存储 算法 Java
Java虚拟机(JVM)的内存管理与性能优化
本文深入探讨了Java虚拟机(JVM)的内存管理机制,包括堆、栈、方法区等关键区域的功能与作用。通过分析垃圾回收算法和调优策略,旨在帮助开发者理解如何有效提升Java应用的性能。文章采用通俗易懂的语言,结合具体实例,使读者能够轻松掌握复杂的内存管理概念,并应用于实际开发中。
|
1月前
|
Java 应用服务中间件 程序员
JVM知识体系学习八:OOM的案例(承接上篇博文,可以作为面试中的案例)
这篇文章通过多个案例深入探讨了Java虚拟机(JVM)中的内存溢出问题,涵盖了堆内存、方法区、直接内存和栈内存溢出的原因、诊断方法和解决方案,并讨论了不同JDK版本垃圾回收器的变化。
29 4