JVM调优(一)底层原理分析和问题定位

几率大的JVM面试题(含答案) 其他类型面试题汇总目录:Java校招极大几率出的面试题(含答案)----汇总 本章面试题如下: JVM三大性能调优参数,JVM 几个重要的参数 JVM调优 JVM内存管理,JVM的常见的垃圾收集器,G1垃圾收集器。GC调优,Minor GC ,Full GC 触发条件 java内存模型 Java垃圾回收机制 jvm怎样 判断一个对象是否可回收,怎样的对象才能作为GC root OOM说一下?怎么排... 阅读详情

在这里,假设你已经读过《深入理解Java虚拟机》或者类似的书籍或查看过官方文档。

这个话题从为什么开始。

在虚拟机执行时,有时候会遇到各种线上问题。比如CPU使用居高不下,内存消耗过多,IO读写频繁等问题。我们得找到相应的方法来确定问题所在,再想出对策。

CPU占用问题

CPU占用高原因分析

原因a: 线程上下文切换消耗。

每个cpu或多核cpu中的一核,同一时间只能执行一个线程。在Java应用中,进行文件IO操作、网络IO操作、锁等待或者线程Sleep时,当前线程会进入阻塞或休眠状态,从而触发线程上下文切换,上下文切换过于频繁会造成内核占用过多的cpu资源,导致应用的响应变慢。

原因b:cpu上的运行队列。

每个核上处理runnable的线程的线程线反应其负载(load),load越大,核用越长的时间来完成。(建议每个核上load为1-3个)

原因c:cpu的利用率。

cpu利用率:用户进程、内核、中断处理、IO等待以及空闲五个部分组成。用户进程占用65-70%为宜,而内核占用为30-35%左右。

查看cpu使用情况工具

可用top或pidstat来查看cpu的使用情况。

top

使用top命令后,第三行为我们比较关注的信息。us(用户占用)、sy(系统占用)、ni(改变优先级占用)、id(空闲)。

对于多核cpu,可以按1显示每核的消耗情况。

以上默认为进程信息,如果要看线程信息,可以按shift+h来显示。

pidstat

此工具可以查看线程占用cpu情况,输入pidstat 1 2,表示在控制台上一秒输出一次,一共输出2次。可以多次查看。

分析cpu占用高的各种情况

us:用户占用高

top之后,发现us的百分比过高,表明应用消耗大部分cpu。我们得找到线程id,转换成16进制(linux上),再采用kill -3 [javapid]或jstack [javapid]来查看或dump导出查看。

当然,这部分占用高可能的原因是:线程一直处于runnable状态,通常是无阻塞、循环、正则或纯粹计算动作。

另一个可能是频繁的GC,最主要是Full GC。要从JVM内存消耗上查找原因。

sy:内核占用高

top之后,sy占用高,说明linux花费太多时间用于切换线程,造成这种情况主要原因是java应用启动的线程过多,且这些应用不断处于阻塞和执行状态变化之中,导致了操作系统要不断的进行线程上下文切换。按照上面的方法导出线程信息,查看线程状态、锁信息,找出等待状态或锁竞争过多的线程。

  1. 文件IO消耗

原因分析

在linux上,物理空闲内存够用,通常只有写文件时或者第一次读取文件时才会产生真正IO。

文件IO消耗的跟踪工具

pidstat

输入 pidstat -d -t - p [pid] 1 100,查看指定进程的io和额外信息。找到其中的io消耗高的线程,之后结合jstack来进一步分析,找到对应的java代码。

  1. 网线IO消耗

暂时略

  1. 内存消耗

内存消耗原因分析

多数生产情况下,通常将-Xms和-Xmx设为相同的值,避免运行期频繁申请内存。目前只有创建线程和使用Direct ByteBuffer时才会操作jvm堆外的内存。JVM内存消耗过多会导致GC执行频繁,CPU消耗增加。应用执行速度严重下降,严重会造成OutOfMemeryError,导致java进程退出。所以出现内存消耗过大问题时,根据以下详细分析,找出是jvm外的物理内存占用还是JVM Heap区。

如果os物理内存消耗过大,可能是JVM内存设置过大、创建的线程过多或Direct ByteBuffer往物理内存里放置过多的对象造成。

堆内存设置比物理内存大更容易出现问题。

Direct ByteBuffer是直接使用物理内存的,但是GC负责回收释放。

创建的线程数也会影响物理内存,这取决于-Xss值的大小,也取决于栈的深度。

内存查看工具

top

此工具查看的进行占用情况不太准,查看的为进程的占用全部内存。因为jvm启用时,会按照堆内存设置提前占据内存空间,但不表明在jvm里此内存已经被使用。

pidstat

pidstat -r -p [pid] [interval] [times],可查看指定进程的内存占用信息(包括物理内存和虚拟内存)。

程序执行慢的原因

锁竞争激烈

比较典型的是数据库连接池是有限的,而程序开太多的线程,那么有很多线程处于阻塞等待状态。

硬件资源未充分

这个好理解,多核CPU,只用单线程运行的话,无法充分发挥硬件优势。

数据量增长

这主要是相对数据库来说,若从1万条上升到1亿条,那么在查询时,应用程序多处在等待数据库给结果阶段。

那么知道以上原因和分析工具后,我们可以对jvm进行调优操作。

工具的常用命令:

jstack:

jstack [ option ] pid
jstack [ option ] executable core
jstack [ option ] [server-id@]remote-hostname-or-IP

1)、options:

executable Java executable from which the core dump was produced.

(可能是产生core dump的java可执行程序)

core 将被打印信息的core dump文件

remote-hostname-or-IP 远程debug服务的主机名或ip

server-id 唯一id,假如一台主机上多个远程debug服务

2)、基本参数:

-F当’jstack [-l] pid’没有相应的时候强制打印栈信息

-l长列表. 打印关于锁的附加信息,例如属于java.util.concurrent的ownable synchronizers列表.

-m打印java和native c/c++框架的所有栈信息.

-h | -help打印帮助信息

pid 需要被打印配置信息的java进程id,可以用jps查询.

pidstat

pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]

常用的参数:

-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数

CMS圣经:CMS垃圾回收器的原理、调优,多标+漏标+浮动垃圾 分析与 研究 本文介绍了CMS(Concurrent Mark-Sweep)垃圾回收器的工作原理、优缺点及常见问题,并通过具体案例分析了其优化策略。重点探讨了CMS的各个阶段,包括标记、并发清理和重标记 阅读详情

相关推荐

JVM问题定位的典型案例分析

JVM问题定位的典型案例分析

java慢场景_jvm调优的几种场景

假定你已经了解了运行时的数据区域和常用的垃圾回收算法,也了解了Hotspot支持的垃圾回收器。一、cpu占用过高cpu占用过高要分情况讨论,是不是业务上在搞活动,突然有大批的流量进来,而且活动结束后cpu占用率就下降了,如果是这种情况其实可以不用太关心,因为请求越多,需要处理的线程数越多,这是正常的现象。话说回来,如果你的服务器配置本身就差,cpu也只有一个核心,这种情况,稍微多一点流量就真的能够...

weixin_32892145的博客 672

WiseFlow本地搭建实录---保姆教程

本文介绍了如何从0开始搭建wiseflow的个人情报官的方法,目前所有的API全部都是免费的,对机器没有要求,大家可以放心搭建

liuhui244的博客 1962

Java底层深入-JVM调优

Java底层深入-JVM调优笔记: 说一说JVM中的内存泄露和内存溢出? JVM内存调优的参数的类型? 说一说常见的JVM内存调优的参数? 说一说JVM内存调优的工具? JVM的性能指标有哪些? GC日志工具用过吗? 说说常见的JVM调优的问题和对应的原因? 有没有进行过JVM的调优? 以上这些面试题是否在面试过程中有被问到呢? 一. JVM中的内存泄露和内存溢出 - 内存泄露: 内存泄漏是指本应该被GC回收的无用对象没有...

weixin_54089731的博客 232

【GESP】C++四级考试大纲知识点梳理, (10) 文件读写和重定向

其实,由于本人也是边学、边实验、边总结,且对考纲深度和广度的把握属于个人理解。因此本文更多的不是一个教程,而是个人知识梳理,如有遗漏、疏忽,欢迎指正、交流。孩子放假,出游一周,没有更新。刚刚归来,继续学习。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。(10)掌握文件操作中的重定向,实现文件读写操作,了解文本文件的分类,掌握写操作、读操作、读写操作。GESP C++四级官方考试大纲中,共有11条考点,本文针对第10条考点进行分析介绍。孩子放假,出游一周,没有更新。

CoderCoding的博客 526

整车无线布置的综述

车载无线功能日益丰富,涵盖5G、GNSS、V2X等多种技术,布置需兼顾性能与美观。车顶是理想位置,鲨鱼鳍、后视镜等集成方案可优化空间。需考虑射频电缆损耗、GNSS天线视角、V2X全向覆盖等关键因素。整车测试需适应高频段需求,通过链路预算和互补天线设计优化信号。不同车型需定制方案,并注意抗干扰和多频段兼容性。(149字)

Godspeed_zwh的博客 1860

JVM底层原理分析 + 性能调优

基本概念 JVM位置 JVM运行在操作系统之上的,与硬件没有直接的交互 体系结构 类装载器ClassLoader 负责加载class文件,class文件在文件开头有特定的文件标示(cafe babe),将class文件字节码内容加载到内存中,并将这些内容转换成方法区中的运行时数据结构并且ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定 并不是所有后缀为.class的文件都能被加载,只有在文件开头为cafe babe的文件才是唯一认证

bad_boy的博客 2042

高功率半导体叠阵激光准直

摘要:研究针对高功率半导体激光器叠阵的光束整形问题,通过Zemax软件模拟5个巴条(间隔1.81mm)的LD阵列(总功率300W)。采用非序列模式建立模型,设置慢轴/快轴发散角分别为5°和19.5°,并配置包含19个发光点的巴条结构。通过S-TIH53材质的快轴准直镜(焦距0.6mm)和慢轴准直镜(焦距2.88mm)进行光束整形,有效降低了快慢轴发散角。仿真结果表明该方法能显著改善叠阵激光的光束质量,为高亮度光纤耦合提供了解决方案。

Zhaxibamao的博客 915

JVM虚拟机 底层原理分析与性能优化

今天看了关于jvm的一些视频,个人对jvm的一些进行一下总结。 目录 1.JVM的概念: 方法区 虚拟机栈 本地方法栈 程序计数器 堆 JVM关于内存回收 新生代 老年代 1.JVM的概念: JVM,Java Virtual Machine, java虚拟机。通过将java字节码文件转换成os需要的机器代码实现java文件的执行,java虚拟机实现了java的跨平台性。 ...

SmilingCobra 513

别让 Claude Code 一直问你“能不能执行“:权限配置完全指南

Claude Code 提供了一套精细的权限配置机制,配置好权限设置,可以提速不少。这个小技巧需要掌握一下。

沐风 3843

基于 YOLOv26 的陶瓷产品缺陷检测系统:智能视觉质检方案

本文提出了一种基于YOLOv26深度学习模型的陶瓷产品智能缺陷检测系统。该系统针对陶瓷生产中的裂纹、气泡、釉面缺陷等8类常见质量问题,采用YOLOv26目标检测算法实现高精度自动化检测。系统架构包含数据采集、预处理、YOLOv26检测和后处理四个模块,具有多类别分类、实时推理和强鲁棒性等技术优势。文章详细介绍了数据预处理与增强方法,并提供了Python代码实现示例。该方案可显著提升陶瓷产品质量检测效率,替代传统人工检测方式,为陶瓷制造业提供智能化质检解决方案。

一键难忘的博客 789

JVM是如何定位垃圾-GC Roots 根对象枚举

JVM是如何定位需要回收的垃圾

leofee的博客 1631

华为OD机试真题2025双机位B卷 Python&JS 实现【朋友圈个数】

给定一组朋友关系,统计一下该朋友关系网中的朋友圈个数。 朋友圈的定义:一个朋友圈至少由3个朋友组成,且要求同一个朋友圈中的任意两个人都具有直接的朋友关系。 输入描述 输入一个朋友关系列表,如 Fiends =A.B],[A.C],IB,DI,其中的每一个元素 Friendsi表示 Friends[i][0)和 Friends [i][1] 是朋友关系 先输入一个数字 N 代表关系的总数,后面每条关系一行,两个成员以逗号分隔

MISAYAONE的博客 562

2026 Java后端面试高频考点:并发JVM、故障排查与AI大模型应用

在Java后端开发中,并发编程、JVM调优与线上故障排查始终是衡量工程师实战能力的核心标尺。从线程池参数设计到OOM问题定位,从CPU飙升分析到容器环境下的内存管理,这些场景不仅考验对底层原理的理解,更要求具备系统化的问题排查思路。与此同时,随着AI技术工程化落地,RAG检索增强生成、提示词工程与向量数据库等新考点正逐步融入后端技术体系,成为2026年Java面试中的高频方向。掌握ConcurrentHashMap的锁优化、Spring事务失效的常见陷阱,并结合Redis预减库存、分布式锁等方案解决高并发一

weixin_33416697的博客 220

educoder中Hive综合应用案例 — 用户搜索日志分析

Hive综合应用案例 — 用户搜索日志分析

weixin_46026136的博客 4789

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JVM工作原理与实战(三十五):性能调优

JVM作为Java程序的运行环境,其负责解释和执行字节码,管理内存,确保安全,支持多线程和提供性能监控工具,以及确保程序的跨平台运行。本文主要介绍了性能调优、性能调优案例等内容。

Rye的博客 2117

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

JVM调优和线上问题

JVM调优可能很多人都没遇到过,真正遇到了不知道如何去分析和解决问题,其实很多时候我们出现这个问题的原因都是最近提交的代码有问题,出现问题的时候主要靠cpu,内存等指标去参考,并且一般只有内存dump才能知道是什么问题。所以下面我总结了我如何排查线上JVM的问题,以及如何去调优,下一章我也会介绍一个大杀器Arthas。

qq_24768941的博客 2460

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

【jvm系列-13】jvm性能调优篇---参数设置以及日志分析

jvm参数设置和日志分析

zhenghuishengq的博客 2万+

Java面试-如何进行 JVM 调优?常见性能问题分析

《Java面试200问》系列开篇:深入解析JVM调优与性能优化 本文是《Java面试200问》系列的开篇之作,聚焦JVM调优与性能问题分析。文章从JVM基础架构入手,系统讲解内存管理机制(堆/非堆内存划分)、垃圾回收原理(GC算法与回收器对比)以及实战调优策略。通过典型案例解析常见OOM问题,并提供代码优化建议(减少对象创建、避免内存泄漏等)。最后针对面试场景,梳理了5大高频考点(引用类型、对象存活判定、CMS/G1区别等),帮助开发者构建完整的JVM知识体系。全文采用原理+实践相结合的讲述方式,配有调优参

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

【JVM调优全解析:从底层原理到实战落地】

本文系统讲解JVM调优的核心知识与实战方法。首先解析JVM内存模型(堆、方法区等)、垃圾回收机制(算法、收集器)及调优指标(吞吐量、延迟等)。随后通过两个典型场景案例:1)电商秒杀系统因MinorGC频繁导致延迟飙升,通过扩大年轻代、调整Survivor比例及改用G1收集器解决;2)后台系统因内存泄漏引发FullGC,通过修复静态缓存泄漏、调整老年代内存及切换ParallelGC优化。总结调优闭环流程(监控→定位→调优→验证)与最佳实践,强调优先代码优化再参数调整,并提供30个高频调优参数解析及常见

qq_36021478的博客 1030

JVM底层设计原理与调优项目实战教程,阿里P8架构师推崇的这份JVM笔记,到底牛在哪了?

前言 JVM ,即“Java 虚拟机”,有点类似于“操作系统”,上面跑着Java程序。 其实我们在平常的工作中,并不会直接接触到JVM,但是经常会遇到与之相关的问题: 一段代码有问题,执行效率低,但就是无法找到深层次原因。 线上系统CPU疯狂运转, GC时间飙升,产生卡顿,严重影响服务响应时间; 正在运行的Java程序,突然就OOM(内存溢出)了; 要做性能优化时面对一堆JVM的参数无从下手… 这些问题其实都和JVM有关系。 我还记得曾经有一次花了整整一周时间,才定位到一个棘手的堆外内存

欢迎您访问我的公众号【前程有光】 5783

JVM调优实战 Day 7:JVM线程分析与死锁排查

本篇文章围绕JVM线程分析与死锁排查展开,系统介绍了线程的基本概念、JVM线程模型、死锁的成因与检测方法,并结合实际案例展示了如何通过工具进行问题定位与调优。我们还提供了具体的代码示例和配置建议,帮助读者在实际项目中高效应对线程相关问题。

在未来等你的专栏 1390

JVM 调优深度实战:从底层原理到生产排查全路径复盘

JVM 调优不仅仅是参数的堆砌,它是一场基于对底层原理深刻理解的“刑侦破案”。掌握了排查工具链(top -> jstack -> jstat -> jmap),你就拿到了打开高手大门的钥匙。

1198

JVM 底层与调优

本文摘要: JVM核心知识精要:1.垃圾回收机制详解GC Roots、三大回收算法及主流收集器(G1/ZGC/Shenandoah)选型建议;2.JVM参数调优指南,解析四大参数前缀(-/-X/-XX/-D)作用及生产配置模板;3.线上问题排查手册,涵盖OOM、频繁GC、CPU飙高、死锁的定位方法;4.内存泄漏完整排查流程,通过MAT工具分析堆快照的实战技巧。重点总结:G1适合通用场景,ZGC适用于低延迟要求;调优参数遵循"-X管内存、-XX管GC"原则;泄漏排查需关注静态集合、Thre

Ycy的博客 463

想要学会JVM调优,先掌握JVM内存模型和JVM运行原理

想要学会JVM调优,先掌握JVM内存模型和JVM运行原理: 在Java中,JVM内存模型主要分为堆、程序计数器、方法区、虚拟机栈和本地方法栈。 JVM在很大程度上减轻了Java开发人员投入到对象生命周期的管理精力。 在使用对象的时候,JVM会自动分配内存给对象,在不使用的时候,垃圾回收器会自动回收 对象,释放占用的内存。

qq_30713721的博客 1492

【性能优化】JVM调优与写出JVM友好高效的代码

本文讲解JVM调优的步骤、常用的JVM调优参数,如何调整堆大小和垃圾回收器,以及写出JVM友好的代码。

小明的Java问道之路 1740
上一篇: Spring data jpa的高级查询的应用和底层原理分析
下一篇: JVM调优(二)内存收集器原理和参数调整
bbbbln
博客等级 码龄11年 14粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值