JVM虚拟机-JVM调优、内存泄漏排查、CPU飙高排查

一、JVM调优的参数在哪里设置

项目开发过程中有以下两种部署项目的方式:
- 项目部署在tomcat中,是一个war包;
- 项目部署在SpringBoot中,是一个jar包。
(1)war包

catalina文件在Linux系统下的tomcat是以sh结尾,在windows系统下则是以bat结尾。
"Xms512m"指的是堆的初始化大小是512兆,"Xmx1024m"指的是堆的最大大小是1024兆。
(2)jar包

加上这两个参数的作用:假设我们使用最简单的java -jar方式来启动一个单体项目,并且加上这两个项目,就可以让它在后台运行。
(3)总结

二、JVM调优的参数有哪些

(1)设置堆空间大小

(2)虚拟机栈的设置

因为每个线程都会分配一个虚拟机栈,若将线程的默认内存增大,那么就会减少总共能生成的线程的数量;若将线程的默认内存减小,而某一个方法中的参数过多,就有可能会出现栈内存溢出。所以一般建议设置256k或512k即可。
(3)Eden区与两个Survivor区的大小比例

“-XXSurvivorRatio=8"代表Eden区占了总年轻代中的八份空间;“survivor:eden"代表两个Survivor区共用两份空间,Eden区占了八份空间。
当设置”-XXSurvivorRatio=3”,幸存者区参数不变时,"survivor:eden"就等于2:3。
(4)年轻代晋升老年代的阈值

这个"阈值"指的是年轻代当中某对象被挪动的次数,当挪动次数超过这个阈值,该对象就会从年轻代晋升到老年代。
(5)设置垃圾回收器

因为我们当前使用的是JDK8,在JDK8默认的垃圾回收器是Parallel GC(并行GC)。当然也可以使用G1垃圾回收器,只要使用"-XX:+Use"参数来指定想要使用的垃圾回收器即可。
(6)总结

三、JVM调优的工具

(1)命令工具
- jps

jps
- jstack

jstack [option] <pid>
pid指的就是刚刚使用jps命令查询到的进程id。
在控制台中就会展示出当前线程的详细信息。假如产生了死锁,就可以使用jstack来查看线程运行的情况。
3. jmap

//显示堆信息
jmap -heap pid
//生成指定进程的dump文件并指定保存的地址
jmap -dump:format=b,file=heap.hprof pid
jmap -heap pid


jmap -dump:format=b,file=heap.hprof pid

4. jstat

//总结垃圾回收统计
jstat -gcutil pid
//垃圾回收统计
jstat -gc pid
①总结垃圾回收统计
S0、S1、E、O、M、CCS下的数字代表他们当前在内存中使用的比例,YGC、YGCT、FGC、FGCT、GCT代表年轻代与老年代进行垃圾回收的次数或消耗时间。
②垃圾回收统计
用于查看垃圾回收的情况
(2)可视化工具
- jconsole

在该工具内就可以查看当前的内存使用情况了

- VisualVM

但是该工具目前仅有JDK8可以直接在bin目录下启动,高版本JDK必须到官网自行下载使用。
监控程序运行情况:

查看运行中的dump:

查看当前正在运行的线程的情况:

(3)总结

四、Java内存泄露的排查思路
(1)出现内存泄漏的区域
内存泄露指的是丢失了数据的地址,没法引用也没法删除。
可能会产生内存泄露的区域:运行时数据区中的三块内存-虚拟机栈、方法区、堆空间。
虚拟机栈发生内存泄漏的报错信息- StackOverFlowError ,指递归造成的问题;
方法区内存不足的报错信息- OutOfMemoryError:MetaSpace ,指动态加载的类太多导致元空间内存不足;
堆空间内存泄露的报错信息- OutOfMemoryError:java heap space ,是最常见的报错情况,也是我们需要最主要关注的,一般出现在一些大对象一直存活,一直没有被垃圾回收器回收的情况。

(2)服务器排查
而我们的项目通常是部署在服务器上的,且拆分成了很多的微服务,每个微服务也都是一个独立的项目,都有可能会出现内存溢出导致服务宕机,这时候要想进行内存排查就需要采用以下方式:

①获取快照dump文件

- 因为要想使用jmap命令就必须将项目启动起来,并根据其线程id来查询,但是当服务宕机时是无法获取到线程id的,此时也就不能使用jmap命令。
- 而使用vm参数则可以直接在命令中指定jvm虚拟机参数来指定需要查看的线程情况。
HeapDumpPath用于指定dump文件存储到的地址。
使用方法:
配置vm参数,并指定dump文件存储到的路径地址

运行程序,发现dump文件已经成功存储,且出现 OutOfMemoryError

生成文件

②使用VisualVM分析dump文件

③查看堆信息,找到报错原因

(3)总结

五、CPU飙高的排查方案及思路
什么是CPU飙高:我们的项目运行在服务器上且占用的CPU较高。
(1)CPU占用情况排查

在linux系统上打印该命令就能查看当前占用CPU的排行,可以看到占用最高的进程是一个java程序,进程id为2266。

也就是说当前某个java项目占用CPU太高了,我们的任务就是要找到该项目中哪一行代码导致的该问题,也就是进行代码排查。而代码都是在不同线程当中运行的,我们就需要找到对应的线程并定位该问题。
(2)排查操作
- 获取当前2266进程中的所有线程
可以看到2276线程占用的CPU最高,也就是该线程导致的CPU占用率过高的问题

- 使用jstack命令查看2266进程中的全部线程信息

- 定位到指定线程的信息
因为前面查询到的2276线程id是一个十进制数,而在jstack命令中查询出的日志中的线程id都是十六进制数,所以需要先对线程id进行转换。

再在jstack查询出的日志中定位到该8e4线程的信息,也就可以找到是哪行代码出现问题

- 定位java代码

可以发现是代码中的死循环的问题

(3)总结

相关文章:
JVM虚拟机-JVM调优、内存泄漏排查、CPU飙高排查
一、JVM调优的参数在哪里设置 项目开发过程中有以下两种部署项目的方式: 项目部署在tomcat中,是一个war包;项目部署在SpringBoot中,是一个jar包。 (1)war包 catalina文件在Linux系统下的tomcat是以sh结尾,在windows系…...
安全复健|windows常见取证工具
写在前面: 此博客仅用于记录个人学习内容,学识浅薄,若有错误观点欢迎评论区指出。欢迎各位前来交流。(部分材料来源网络,若有侵权,立即删除) 取证 01系统运行数据 使用工具:Live-F…...
FPGA开发流程初识
FPGA 的开发流程可知,在 FPGA 开发的过程中会产生很多不同功能的文件,为了方便随时查找到对应文件,所以在开始开发设计之前,我们第一个需要考虑的问题是工程内部各种文件的管理。如 果不进行文件分类,而是将所有文件…...
Docker 中将文件映射到 Linux 宿主机
在 Docker 中,有多种方式可以将文件映射到 Linux 宿主机,以下是常见的几种方法: 使用-v参数• 基本语法:docker run -v [宿主机文件路径]:[容器内文件路径] 容器名称• 示例:docker run -it -v /home/user/myfile.txt:…...
C# 类型、存储和变量(栈和堆)
本章内容 C#程序是一组类型声明 类型是一种模板 实例化类型 数据成员和函数成员 预定义类型 用户定义类型 栈和堆 值类型和引用类型 变量 静态类型和dynamic关键字 可空类型 栈和堆 程序运行时,它的数据必须存储在内存中。一个数据项需要多大的内存、存储在什么地方…...
基于深度学习Yolo8的驾驶员疲劳与分心行为检测系统
基于深度学习Yolo8的驾驶员疲劳与分心行为检测系统 【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】疲劳检测模型与行为分析统计 【技术栈】 ①:系统环境:Windows/Mac/Linux ②:开发环境:P…...
AOSP Android14 Launcher3——远程窗口动画关键类SurfaceControl详解
在 Launcher3 执行涉及其他应用窗口(即“远程窗口”)的动画时,例如“点击桌面图标启动应用”或“从应用上滑回到桌面”的过渡动画,SurfaceControl 扮演着至关重要的角色。它是实现这些跨进程、高性能、精确定制动画的核心技术。 …...
Linux系统学习----概述与目录结构
linux 是一个开源、免费的操作系统,其稳定性、安全性、处理多并发已经得到业界的认可,目前很多企业级的项目 (c/c/php/python/java/go)都会部署到 Linux/unix 系统上。 一、虚拟机系统操作 1.网络连接的三种方式(桥接模式、nat模式、主机模…...
python pdf转图片再OCR
先pdf转图片 import os from pdf2image import convert_from_path# PDF文件路径 pdf_path /Users/xxx/2022.pdf # 输出图片的文件夹 output_folder ./output_images2022 # 输出图片的命名格式 output_name page# 如果输出文件夹不存在,创建它 if not os.path.ex…...
(2)Docker 常用命令
文章目录 Docker 服务器Docker 镜像Docker 容器本地 RegistryRUN vs CMD vs ENTRYPOINTRUNCMDENTRYPOINT 限制容器对内存、CPU 和 IO 资源的使用内存CPUBlock IO设置权重bps 和 iops cgroup 和 namespacecgroupnamespacMount namespaceUTS namespaceIPC namespacePID namespace…...
虚拟列表技术深度解析:原理、实现与性能优化实战
虚拟列表技术深度解析:原理、实现与性能优化实战 引言 在当今数据驱动的互联网应用中,长列表渲染已成为前端开发的核心挑战。传统的一次性全量渲染方式在数据量超过千条时,往往导致页面卡顿、内存飙升等问题。虚拟列表(Virtual L…...
服务器简介(含硬件外观接口介绍)
服务器(Server)是指提供资源、服务、数据或应用程序的计算机系统或设备。它通常比普通的个人计算机更强大、更可靠,能够长时间无间断运行,支持多个用户或客户端的请求。简单来说,服务器就是专门用来存储、管理和提供数…...
c++下的onnx推理
参考代码:https://github.com/itsnine/yolov5-onnxruntime 参考链接:https://blog.csdn.net/magic_ll/article/details/125517798 1.下载onnx 官网:https://github.com/microsoft/onnxruntime/releases/tag/v1.21.0 2.下载代码 https://g…...
TCP三次握手与四次挥手面试回答版本
面试官:说一下TCP三次握手的过程 参考面试回答: 在第一次握手的时候、客户端会随机生成初始化序号、放到TCP报文头部的序号字段中、同时把SYN标志设置为1 这样就表示SYN报文(这里是请求报文)。客户端将报文放入 TCP 报文首部的序…...
Vue3 使用PrimeVue的面包屑组件Breadcrumb,使用JS滚动进行
做了一个自动添加的面包写导航栏,需要在添加之后自动滚动到最右边,发现常规的滚动方法不行,以下是源码,直接调用ScrollToRight方法就行,最主要的就是在value后面加一个$el: <Breadcrumb :home"hom…...
0101基础知识-区块链-web3
文章目录 1 web3学习路线2 区块链简史2.1 区块链2.2 公共账本2.3 区块链的设计哲学2.3.1 去中心化2.3.2 共识2.3.2.1 上链2.3.2.2 共识算法 3 web3面向资产的互联网3.1 安全性和去中心化的权衡 4 智能合约4.1 以太坊智能合约4.2 去中心化应用 5 小结结语 1 web3学习路线 参考下…...
工作纪实_63-Mac电脑使用brew安装软件
最近在接触kafka,想着在自己的电脑安装一套环境,docker也能行,但是还是想装一些原生的软件试试看,因此便想着整理一下brew的命令,这命令确实是方便,不需要下载tar包乱八七糟的东西,一键安装 bre…...
Cadence学习笔记之---库元件制作、元件放置
目录 01 | 引 言 02 | 环境描述 03 | 工具介绍 04 | 无源器件的制作 05 | IC芯片制作 06 | 放置元件 07 | 结 语 01 | 引 言 在上一篇小记中,讲述使用Cadence创建原理图工程和元件库; 本篇小记主要讲述如何制作常用的库元件,如电阻、…...
服务器如何修复SSL证书错误?
修复服务器上的SSL证书错误需要根据具体错误类型逐步排查和解决。以下是常见的步骤和解决方案: --- ### **1. 确认错误类型** 首先检查浏览器或工具(如OpenSSL)报错的具体信息,常见错误包括: - **证书过期**…...
图解Mysql原理:深入理解事务的特性以及它的实现机制
前言 大家好,我是程序蛇玩编程。 Mysql中事务大家不陌生吧,事务就是要保证一组数据库操作,要么全部成功,要么全部失败。那它具有哪些特性,如何实现的呢?接着往下看。 正文 事务的特性: 事务的基本特性主要为四种…...
《前端面试题之 Vue 篇(第四集)》
目录 1、Vue 中实现强制刷新2、Vue3 和 Vue2 的区别解析3、 Vue3 性能优于 Vue2 的原因解析4、Vue3 使用 Proxy5、首屏优化6、组件的理解7、vue项目中合理规划文件目录8、Nuxt.js 简单了解9、单页应用10、 SEO 优化 1、Vue 中实现强制刷新 在 Vue 中实现强制刷新的分析如下&am…...
C++ 模块化编程(Modules)在大规模系统中的实践难点
随着项目规模的不断扩大和代码复杂性的提升,传统的 C++ 开发模式逐渐暴露出一些根深蒂固的问题,尤其是头文件和预处理器机制所带来的编译效率低下、依赖管理混乱以及代码复用性差等痛点。C++20 标准引入的模块化编程(Modules)特性,正是为了解决这些问题而设计的一项革命性…...
DasViewer主要功能流程介绍
摘要:本文主要介绍DasViewer软件本地数据、云端数据以及在线3DTiles服务模型浏览功能。 本地数据浏览功能 打开 DasViewer 浏览器;打开本地数据,包括如下几种方式: 选择工程文件(.dav、.dvp)、模型文件(…...
提交bug单时,应该说明哪些信息?
在提交 Bug 单时,为了让开发人员能够快速定位和解决问题,需要详细说明以下几方面信息: Bug 的基本信息 标题:简洁明了地概括 Bug 的主要问题,例如 “登录页面输入错误密码后提示信息不准确”。Bug 类型:明确…...
Linux[指令与权限]
Linux指令与权限 Linux环境中,打包文件有多种 tar (打包/解包) 指令 tar -czvf 文件要打包到的位置 文件(打包并压缩到) tar -xzvf 文件(在当前目录下解压) tar选项 -c创建压缩文件 -z使用gzip属性压缩 -v展现压缩过程 -f后面使用新建文档名 -x不要新建,解压 -C 文件…...
MySQL 的锁,表级锁是哪一层的锁?行锁是哪一层的锁?
MySQL 的锁层级与类型 在 MySQL 中,锁的层级和实现与存储引擎密切相关。 1. 表级锁(Table-Level Locks) (1)存储引擎层的表级锁 实现层级:存储引擎层(如 MyISAM、InnoDB)。特点&a…...
Flink介绍——实时计算核心论文之Dataflow论文总结
数据流处理的演变与 Dataflow 模型的革新 在大数据处理领域,流式数据处理系统的发展历程充满了创新与变革。从早期的 S4 到 Storm,再到 MillWheel,每一个系统都以其独特的方式推动了技术的进步。S4 以其无中心架构和 PE(Processi…...
Next.js 编译并运行
next build 是用于构建 Next.js 应用的命令,而运行构建后的应用则通过 next start。这里是一个简明的流程说明: ✅ 构建 Next.js 应用 next build这个命令会: 编译项目中的 TypeScript 和 JavaScript 代码;优化静态资源…...
星火燎原:Spark技术如何重塑大数据处理格局
在数字化浪潮席卷全球的今天,数据已成为企业发展与社会进步的核心驱动力。面对海量且复杂的数据,传统的数据处理技术逐渐显得力不从心。而Apache Spark作为大数据领域的明星框架,凭借其卓越的性能与强大的功能,如同一束璀璨的星火…...
LeetCode 2563.统计公平数对的数目:排序 + 二分查找
【LetMeFly】2563.统计公平数对的数目:排序 二分查找 力扣题目链接:https://leetcode.cn/problems/count-the-number-of-fair-pairs/ 给你一个下标从 0 开始、长度为 n 的整数数组 nums ,和两个整数 lower 和 upper ,返回 公平…...
