常用调优命令及各种 OOM 的应对策略【JVM调优】

news2024/11/24 7:21:50

文章目录

    • 1. 常见的调优命令
    • 2. 常见的性能调优
    • 3. 常用的调优工具
    • 4. 各种 OOM 的应对策略
    • 5. 配置垃圾收集器
    • 6. CPU 占用过高

1. 常见的调优命令

① jps:显示所有虚拟机进程;
② jstack:生成当前线程快照;
③ jmap:生成 dump 堆转储文件;
④ jhat:与 jmap 搭配使用,生成 dump 的分析结果;
⑤ jstat:监控虚拟机运行时的状态信息;
⑥ jinfo:实时查看和调整虚拟机运行参数。

2. 常见的性能调优

① -Xmx:设置堆内存的最大限制;
② -XX:NewSize:设置新生代的大小;
③ -XX:NewRatio:设置新生代和老年代的占比;
④ 设定垃圾回收器,新生代用 -XX:+UseParNewGC,年老代用 -XX:+UseConcMarkSweepGC。

在这里插入图片描述

3. 常用的调优工具

① jconsole:是JDK中自带的java监控和管理控制台,用于对JVM中内存、线程和类等的监控;
② jvisualvm,jdk自带全能工具,可以分析内存快照、线程快照、监控内存变化、GC变化等;
③ MAT,它是一个基于Eclipse的内存分析工具,是快速、功能丰富的Java heap分析工具,它可以帮助我们查找内存泄漏和减少内存消耗;
④ GChisto,一款专业分析gc日志的工具。

4. 各种 OOM 的应对策略

(1)堆内存溢出

什么情况呢?就是我们不断地创建对象,并且 GC Roots 到对象之间有可达路径,所以垃圾回收器并不会回收这些对象,当堆中对象的数量超过最大堆容量限制后,发生内存溢出。

出现这种异常,我们需要把堆快照文件 dump 下来进行单独分析。然后判断内存中的对象是否有存在的必要,也就是说这是内存泄漏还是内存溢出?

如果是内存泄漏,可通过工具查看它的引用链,分析是什么原因导致无用对象长期被引用着,然后修改业务代码;如果是内存溢出,考虑重新设置虚拟机参数(-Xms、-Xmx)。

(2)栈溢出

当应用程序递归太深时容易发生栈溢出。

栈溢出的原因:递归太深、大量循环、死循环或全局变量过多等。

(3)运行时常量池溢出

由于常量池分配在方法区内,我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 限制方法区的大小,从而间接限制其中常量池的容量。

(4)方法区溢出

检查一下某些类是不是没有做缓存,导致频繁地加载生成,修改业务代码改进。如果类加载正常,那我们可以通过 -XX:PermSize 和 -XX:MaxPermSize 来限制方法区的大小。

5. 配置垃圾收集器

① 首先是内存大小的问题,给每一个内存区域都设置一个上限,比如堆空间会设置成操作系统的 2/3;
② 接下来进行初步优化,根据情况,合理设置新生代和老年代的比例;
③ 专项优化,优化依据是系统容量、吞吐量、访问延迟等,由于是高并发环境下,所以 STW 的时间应该被高度重视;
④ 借用日志分析工具,快速定位到具体的问题。

6. CPU 占用过高

首先使用 top -Hp 命令,可查看是哪个线程占用的 CPU 最高,然后使用 jstack 命令找到具体的线程。
如果是业务线程,就去找是哪个方法导致 CPU 高占用的;如果是 GC 线程,那么一定是频繁的 GC 造成 CPU 高涨,这时候就要去读日志找原因了,可以使用日志分析工具 GChisto。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/995270.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于SSM的在线云音乐系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:采用JSP技术开发 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目&#x…

Linux内核分析与应用3-进程管理

本系列是对 陈莉君 老师 Linux 内核分析与应用[1] 的学习与记录。讲的非常之好,推荐观看 留此记录,蜻蜓点水,可作抛砖引玉 3.1 进程概述 一个程序通过编译器将其编译成汇编程序,经过汇编器将其汇编成目标代码,通过链接器形成可执行文件a.out或者elf格式,…

Kali2022.3虚拟机编译AOSP(从Kali安装到完成Aosp编译详细记录)

一.前言 测试的硬件环境(轻薄本):cpu:Amd r5 4600u,内存:16g,外接固态硬盘盒子。测试(下载和编译Android10)结果:下载时长为0.5-1h,编译时长接近5h;虚拟机环境:VMware Workstation …

Stream流用法详解

文章目录 🐒个人主页🏅JavaSE系列专栏📖前言:🎀什么是Stream流?🧸流的概念 🐕如何获取流🐕流的操作🏅中间操作(返回类型都是流)filter…

【strcat函数和strncat函数的对比与模拟实现】

strcat函数和strncat函数的对比与模拟实现 1.strcat函数的介绍 资源来源于cplusplus网站 它的作用是: 将源字符串的副本追加到目标字符串。目标中的结束空字符被源的第一个字符覆盖,并且在由目标中的两个字符串串联形成的新字符串的末尾包含一个空字符…

数据结构之单链表(c++(c语言)通用版)

我们创建一个长度为n的链表时,可以采取头插法创建或者尾插法创建,本篇博客我们采取头插法来创建,(作者只学了头插,尾插等以后来补qwq,补上喽)。 头插原理 我们先来画图来看看头插的创建形式把&#xff0c…

《python趣味工具》——酷炫二维码(2):批量定制合适的二维码

今天,我们将学习如何从Excel中提取相应的内容然后批量生成相应的二维码。 文章目录 一、Excel的基本操作:1. Excel的基本结构:2. 安装xlrd模块:3. 读取指定工作表:4. 读取指定内容:Tip:切片读取&#xff1a…

线性代数的学习和整理19,特征值,特征向量,以及引入的正交化矩阵概念(草稿)

目录 1 什么是特征值和特征向量? 1.1 特征值和特征向量这2个概念先放后 1.2 直观定义 1.3 严格定义 2 如何求特征值和特征向量 2.1 方法1:结合图形看,直观方法求 2.1.1 单位矩阵的特征值和特征向量 2.1.2 旋转矩阵 2.2 根据严格定义…

buuctf crypto 【RSA2】解题记录

1.打开文件 2.写脚本 3.16进制转字符串

Ardupilot — AP_OpticalFlow代码梳理

文章目录 前言 1 Copter.cpp 1.1 void Copter::setup() 2 system.cpp 2.1 void Copter::init_ardupilot() 3 sensors.cpp 3.1 void Copter::init_optflow() 3.2 对象optflow说明 4 OpticalFlow.cpp 4.1 void OpticalFlow::init(uint32_t log_bit) 5 AP_OpticalFlow_…

十三、函数式编程(1)

本章概要 新旧对比Lambda 表达式 递归 函数式编程语言操纵代码片段就像操作数据一样容易。 虽然 Java 不是函数式语言,但 Java 8 Lambda 表达式和方法引用 (Method References) 允许你以函数式编程。 在计算机时代早期,内存是稀缺和昂贵的。几乎每个人…

手写Spring:第20章-事务处理

文章目录 一、目标:事务处理二、设计:事务处理2.1 事务单元测试2.2 事务设计 三、实现:事务处理3.1 工程结构3.2 事务管理的核心类图3.3 定义事务注解3.3.1 定义事务注解3.3.2 定义事务接口3.3.3 默认事务定义实现类3.3.4 委托事务定义实现类…

Java 多线程系列Ⅵ(并发编程的六大组件)

JUC 组件 前言一、Callable二、ReentrantLock三、Atomic 原子类四、线程池五、Semaphore六、CountDownLatch 前言 JUC(Java.util.concurrent)是 Java 标准库中的一个包,它提供了一组并发编程工具,本篇文章就介绍几组常见的 JUC 组…

win10自带wifi共享功能

1、按下【wini】组合键打开windows设置,点击【网络和internet】; 2、按照下图,打开个移动热点,设置名称、密码。

Blender--》页面布局及基本操作讲解

接下来我会在three.js专栏中分享关于3D建模知识的文章,如果学习three朋友并且想了解和学习3D建模,欢迎关注本专栏,关于这款3D建模软件blender的安装,我在前面的文章已经讲解过了,如果不了解的朋友可以去考考古&#xf…

DeepinV20安装MSJDK17

装什么版本的JDK https://learn.microsoft.com/zh-cn/java/openjdk/download#openjdk-17 通常来讲,选择最适应自己应用程序的版本,例如最新开发的程序基本需要运行在jdk17了,又或者前几年的java程序基本都是jdk11,再旧一点的jdk8。尽可能选…

【C++深入浅出】类和对象中篇(六种默认成员函数、运算符重载)

目录 一. 前言 二. 默认成员函数 三. 构造函数 3.1 概念 3.2 特性 四. 析构函数 4.1 概念 4.2 特性 五. 拷贝构造函数 5.1 概念 5.2 特性 六. 运算符重载 6.1 引入 6.2 概念 6.3 注意事项 6.4 重载示例 6.5 赋值运算符重载 6.6 前置和后置运算符重载 七. c…

【Rust日报】2023-09-07 Servo 项目将加入欧洲 Linux 基金会

Servo 项目将加入欧洲 Linux 基金会 Servo 项目由 Mozilla Research 于 2012 年创建,是除编译器本身之外的首个主要 Rust 代码库,自此成为实验性网络引擎设计的标志。Servo 的主要组件已被集成到 Firefox 网络浏览器中,其若干解析器和其他底层…

渗透测试基础之永恒之蓝漏洞复现

渗透测试MS17-010(永恒之蓝)的漏洞复现 目录 渗透测试MS17-010(永恒之蓝)的漏洞复现 目录 前言 思维导图 1,渗透测试 1,1,什么是渗透测试? 1.2,渗透测试的分类: 1.3,渗透测试的流程 1.3.1,前期交互 1.3.2,情报收集 1.3.3,威胁建模 1.3.4,漏洞分析 1.3.5,漏洞验…

软件设计模式(五):代理模式

前言 代理模式是软件设计模式的重中之重,代理模式在实际应用比较多,比如Spring框架中的AOP。在这篇文章中荔枝将会梳理有关静态代理、动态代理的区别以及两种实现动态代理模式的方式。希望能对有需要的小伙伴有帮助~~~ 文章目录 前言 一、静态代理 二…