JVM调优-调优原则和原理分析
1.写在前面
对于JVM调优这个话题,可能大部分程序员都听过这个名词。
但是绝大多数程序员,都没有真真实实去干过,都没有真实的实践过。也不懂得如何调优?不知道要调成怎么样?
那今天咋们就对这个话题来展开描述一下,如何进行jvm调优?主要从以下几个方面进行分享:
- 调优原则和原理分析
- JVM垃圾常见的收集器
- JVM调优常见的工具
- JVM调优常用的参数
- JVM调优实践
最后分享一个jvm调优的实践案例。希望可以帮助到各位!!!
那今天我们就来分享一下,jvm调优原则和原理分析
废话不多说了,直接上干货啦!!!

2.什么是JVM?
平时我们所说的JVM广义上指的是一种规范。狭义上的是JDK中的JVM虚拟机。
JVM的实现是由各个厂商来做的。比如现在流传最广泛的是hotspot。其他实现:
复制代码
BEA公司: JRocket IBM j9 zing 号称世界最快jvm taobao.vm
JVM用什么语言编写的呢?
Java中的JVM有很多实现,不同厂商的JVM使用编程语言有所不同!
HotSpot是C、C++ 与少量汇编
3.JVM调优疑问三连
是否可以把内存空间设置足够大,那么就不需要回收垃圾呢?
哈哈,可能大部分程序员,都有这么想过。
3.1 为什么JVM调优?
单机的并发因为JVM调优了,可以再翻至少一倍!
调优的最终目的都是为了应用程序使用最小的硬件消耗来承载更大的吞吐量。
jvm调优主要是针对垃圾收集器的收集性能优化,减少GC的频率和Full GC的次数,令运行在虚拟机上的应用能够使用更少的内存以及延迟获取更大的吞吐量和减少暂停时间。
哈哈,说到这里可能大部分人就跳出来说:道理谁不懂呀,可是要怎么干呢?
下面展示了一些JVM调优的量化目标参考实例,注意:不同应用的JVM调优量化目标是不一样的。
调优目标:
- 堆内存使用率 <= 70%;
- 老年代内存使用率<= 70%;
- avg pause <= 1秒;
- Full GC 次数 0 或 avg pause interval >= 24小时 ;
- 创建更多的线程
3.2 什么时候JVM调优?
遇到以下情况,就需要考虑进行JVM调优:
- 系统吞吐量与响应性能不高或下降;
- Heap内存(老年代)持续上涨达到设置的最大内存值;
- Full GC 次数频繁;
- GC 停顿时间过长(超过 1 秒);
- 应用出现OutOfMemory 等内存异常;
- 应用中有使用本地缓存且占用大量内存空间;
3.3 调优调什么?
JVM调优核心是什么?
内存分配 + 垃圾回收!
- 合理使用堆内存
- GC高效回收占用的内存的垃圾对象
- GC高效释放掉内存空间
疑问:是否可以把内存空间设置足够大,那么就不需要回收垃圾呢?
这个问题背景:JVM回收垃圾时机,当JVM内存占满触发垃圾回收!
不可以原因如下:
- 不回收垃圾,内存增长巨快,再大的空间都不够用;10w请求,2gb垃圾对象
- 物理层面: 64 位操作系统可以支持非常大的内存,但不是无限
- 32位操作系统: 2~32 = 4GB
- 64位操作系统: 2~64 =16384PB
- 虚拟机层面:不能设置无限大内存
- 内存设置既不能太大,也不能太小需要基于业务场景平衡考量:内存空间设置过大,一旦内存空间触发垃圾回收,就会非常危险,寻找这个垃圾非常耗时,由于内存空间足够大,寻找这个垃圾的时候,极其的消耗时间,因此导致程序停顿;
举个栗子类比一下:房子足够大,是不是就可以不用打扫卫生!显然是不行的
以上就是JVM调优的三大疑问,是不是很多小伙伴,都有这样的疑问呢?
哈哈,估计大伙,多多少少都会带有这样的疑问。
4 调优原则:
- 优先原则:优先架构调优和代码调优,JVM优化是不得已的手段
- 大多数的Java应用不需要进行JVM优化
- 观测性原则:发现问题解决问题,没有问题不找问题
调优,还是得从实际出发,可能咋们写的代码,需要优化,或者我们的框架需要优化。
调优,是不得已的手段了。
5.调优基础知识
在讲JVM调优之前,先简单回顾下JVM相关的基础知识,这里我们重点回顾下JAVA堆、垃圾回收器。这两块也是在JVM调优过程中重点关注的部分。
5.1 堆Heap
被所有线程共享,在虚拟机启动时创建,用来存放对象实例,几乎所有的对象实例都在这里分配内存。
对于大多数应用来说,Java堆(Java Heap)是Java虚拟机所管理的内存中最大的一块。
Java堆是垃圾收集器管理的主要区域,因此很多时候也被称做“GC堆”。如果从内存回收的角度看,由于现在收集器基本都是采用的分代收集算法,所以Java堆中还可以细分为:新生代和老年代;
新生代又有Eden空间、From Survivor空间、To Survivor空间三部分。Java 堆不需要连续内存,并且可以通过动态增加其内存,增加失败会抛出 OutOfMemoryError 异常。
5.2 垃圾回收
从年轻代空间(包括 Eden 和 Survivor 区域)被称为 Minor GC 。
Full GC 是清理整个堆空间—包括年轻代和老年代。
我们不用去关心到底是叫 Minor GC 还是 Full GC,大家应该关注当前的 GC 是否停止了所有应用程序的线程,还是能够并发的处理而不用停掉应用程序的线程,停止了所有应用程序的线程俗称STW。(Stop-the-world )
在 JVM 中,垃圾回收器的具体实现有:
- 串行收集器(Serial)
- 新生代并行收集器(ParNew)
- 并行回收(Parallel Scavenge)
- CMS(Concurrent Mark Sweep)
- Serial Old(Serial收集器的老年代版本)
- Parallel Old(Parallel Scavenge收集器的老年代版本)
- G1(Garbage-First)当今收集器技术发展的最前沿成果之一
下面是配套资料,对于做【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

软件测试面试小程序
被百万人刷爆的软件测试题库!!!谁用谁知道!!!全网最全面试刷题小程序,手机就可以刷题,地铁上公交上,卷起来!
涵盖以下这些面试题板块:
1、软件测试基础理论 ,2、web,app,接口功能测试 ,3、网络 ,4、数据库 ,5、linux 6、web,app,接口自动化 ,7、性能测试 ,8、编程基础,9、hr面试题 10、开放性测试题,11、安全测试,12、计算机基础

编辑资料获取方式 :xiaobei_upup,添加时备注“csdn alex”


相关文章:
JVM调优-调优原则和原理分析
1.写在前面 对于JVM调优这个话题,可能大部分程序员都听过这个名词。 但是绝大多数程序员,都没有真真实实去干过,都没有真实的实践过。也不懂得如何调优?不知道要调成怎么样? 那今天咋们就对这个话题来展开描述一下&…...
dell服务器安装ubuntu18.04桌面版教程
目录 一、制作U盘启动盘 1.镜像下载地址: 2.制作U盘启动盘 二、服务器进入bios一系列设置 1.插入U盘启动盘 2.开机过程按F11键,进入Boot Manager ,点击 3.点击点击One-shot BIOS Boot Menu 4.进入boot menu ,找到U盘(一般…...
医疗图像处理2023年CVPR:Label-Free Liver Tumor Segmentation-无标签肝肿瘤分割
目录 一、摘要 二、介绍 三、相关工作 四、网络框架 1.位置选择 2.纹理处理 3.形状生成 4.后处理 5.参数设计 五、实验 1.数据集: 2.评价指标: 3.实现: 4.结果: 六、结论 一、摘要 通过在CT扫描中使用合成肿瘤&am…...
远程桌面如何连接?
远程桌面连接是一种可以在不同地点之间共享电脑桌面的技术。通过远程桌面连接,用户可以在远程的计算机上操作另一台计算机,就像是直接坐在前者的前面一样。这种技术可以帮助用户解决在不同地点之间共享数据、协同办公、设备管理等问题。 【天联】的使用场…...
Centos 停服倒计时!你的操作系统何去何从?
在计算机技术的不断演进中,操作系统扮演着至关重要的角色。然而,对于许多企业和个人用户来说,CentOS的突然停服消息带来了一场不小的冲击。作为一款备受欢迎的企业级Linux发行版,CentOS的停服意味着用户需要重新评估自己的操作系统…...
ITMS-91053: Missing API declaration
1. 添加PrivacyInfo.xcprivacy File → New → File → App Privacy 2. 格式 3. 已知对应关系 NSPrivacyAccessedAPICategoryFileTimestamp 3B52.1: Files provided to app by user, per documentation:File Timestamp NSPrivacyAccessedAPICategoryDiskSpace …...
iOS 裁剪图片
参考资源 YSHYClipImageDemo YQImageTool 裁剪图片 完整demo:https://github.com/liquangang/cutImageFinish...
算法训练营第60天|LeetCode 647.回文子串 516.最长回文子序列
LeetCode 647.回文子串 题目链接: LeetCode 647.回文子串 代码: class Solution { public:int countSubstrings(string s) {int size s.size();int result 0;vector<vector<int>>dp(size,vector<int>(size,false));for(int i si…...
读天才与算法:人脑与AI的数学思维笔记25_涌现理论
1. 人工智能新闻 1.1. 人工智能新闻报道算法的核心是如何将未经处理的原始数据转换成新闻报道 1.2. 很少有记者为美联社决定使用机器来帮助报道这些新闻持反对意见 1.2.1. 像“Wordsmith”这样的算法,具有自动化的洞察力、科学的叙事能力,现在正被应用…...
C/C++ IPV6服务器socket绑定在::,接受ipv4链接(双栈)
先决条件: 1、 创建IPV6套接字 2、打开套接字可重用 3、禁用仅限 IPV6 BOOL bEnable FALSE; if (setsockopt(listenfd_, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char*>(&bEnable), sizeof(bEnable)) < 0) …...
【Win10设备管理器中无端口选项】
计算机疑难杂症分享002 Win10设备管理器中无端口选项1、问题现象2、问题原因3、问题解决3.1、驱动精灵(亲测的此方法)3.2、添加过时硬件3.3、官方的方法 Win10设备管理器中无端口选项 1、问题现象 当我调试串口通信时,发现打开设备管理器没有端口,打开…...
「YashanDB迁移体验官」Oracle向YashanDB迁移的丝滑体验
📢📢📢📣📣📣 作者:IT邦德 中国DBA联盟(ACDU)成员,10余年DBA工作经验, Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主,全网粉丝10万 擅长主流Oracle、My…...
实现用户个人随机salt生成jwt及鉴别用户权限的实现思路
实现用户个人随机salt生成jwt及鉴别用户权限的实现 盐值是什么? 盐值(salt)是在密码学中用于增加密码安全性的一种随机值。它通常是一个随机生成的字符串,与用户密码结合在一起,然后再进行加密处理。盐值的作用是增加…...
AI工具的热门与卓越:揭示AI技术的实际应用和影响
文章目录 每日一句正能量前言常用AI工具创新AI应用个人体验分享后记 每日一句正能量 我们在我们的劳动过程中学习思考,劳动的结果,我们认识了世界的奥妙,于是我们就真正来改变生活了。 前言 随着人工智能(AI)技术的快…...
VUE el-button指定图片背景
似乎只能通过css指定? 代码1 <el-button circleclass"stream0"click"switchToStream(0)" > </el-button> 代码2 <style>.stream0 {background-size: cover;background-image: url(~/assets/stream.png); } 如果要动态变…...
【ARM 嵌入式 C 入门及渐进 1.2 -- 是否为 n 字节对齐】
文章目录 是否为 n 字节对齐 是否为 n 字节对齐 在C语言中,你可以定义一个宏来检查一个给定地址是否是n字节对齐的。这里的n应该是2的幂(例如,2、4、8、16等)。要做到这一点,可以利用位操作的特性。具体地,…...
适配qnx和linux平台的线程管理类封装
概述 封装代码仓库: https://gitee.com/liudegui/my_thread 尝试封装一个基于C11的多线程控制与调度类,适配QNX和Linux平台,且代码符合Misra标准。它提供了以下主要功能: 线程的创建与销毁管理。线程的优先级调度。线程的CPU亲…...
【信息系统项目管理师】复习~第十五章
15.项目风险管理 每个项目都存在两个层面上的风险:①每个项目都有会影响项目达成目标的单个风险;②由单个风险和不确定性的其他来源联合导致的整体项目风险。项目风险会对项目目标产生负面或正面的影响,也就是风险与机会。项目风险管理旨在利…...
ARM单片机实现流水灯(GD32)
根据上图可知使用的引脚分别是PA8,PE6,PF6流水灯功能的实现要分别初始化这几个引脚 流水灯实现 编写流水灯代码 LED.C #include "gd32f30x.h" // Device header #include "Delay.h" // 初始化LED灯 void LED_Init(void){// 使能RCU时钟…...
操作系统基础之磁盘
概述 基本概念 磁盘有正反两个盘面,每个盘面有多个同心圆,每个同心圆是一个磁道,每个同心圆又被划分为多个扇区,数据就被存在扇区中。 磁头首先寻找到对应磁道,然后等到磁盘进行周期旋转到指定的扇区,才…...
逻辑回归:给不确定性划界的分类大师
想象你是一名医生。面对患者的检查报告(肿瘤大小、血液指标),你需要做出一个**决定性判断**:恶性还是良性?这种“非黑即白”的抉择,正是**逻辑回归(Logistic Regression)** 的战场&a…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
C++ Visual Studio 2017厂商给的源码没有.sln文件 易兆微芯片下载工具加开机动画下载。
1.先用Visual Studio 2017打开Yichip YC31xx loader.vcxproj,再用Visual Studio 2022打开。再保侟就有.sln文件了。 易兆微芯片下载工具加开机动画下载 ExtraDownloadFile1Info.\logo.bin|0|0|10D2000|0 MFC应用兼容CMD 在BOOL CYichipYC31xxloaderDlg::OnIni…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
算法打卡第18天
从中序与后序遍历序列构造二叉树 (力扣106题) 给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。 示例 1: 输入:inorder [9,3,15,20,7…...
篇章二 论坛系统——系统设计
目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...
高端性能封装正在突破性能壁垒,其芯片集成技术助力人工智能革命。
2024 年,高端封装市场规模为 80 亿美元,预计到 2030 年将超过 280 亿美元,2024-2030 年复合年增长率为 23%。 细分到各个终端市场,最大的高端性能封装市场是“电信和基础设施”,2024 年该市场创造了超过 67% 的收入。…...
嵌入式面试常问问题
以下内容面向嵌入式/系统方向的初学者与面试备考者,全面梳理了以下几大板块,并在每个板块末尾列出常见的面试问答思路,帮助你既能夯实基础,又能应对面试挑战。 一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责…...
react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...
