当前位置: 首页 > news >正文

JVM调优,调的是什么?目的是什么?

文章目录

  • 前言
  • 一、jvm是如何运行代码的?
  • 二、jvm的内存模型
      • 1 整体内存模型结构图
      • 2 堆中的年代区域划分
      • 3 对象在内存模型中是如何流转的?
      • 4 什么是FULL GC,STW? 为什么会发生FULL GC?
      • 5 要调优,首先要知道有哪些垃圾收集器及哪些算法
      • 6 调优不是盲目的,要有依据,几款内存诊断工具
      • 7 结束语
      • 8 出个问题,也是课程中的
  • 总结


前言

jvm是java语言可以跨平台运行的基础

jvm 是什么,他是一个可以运行字节码文件的机器;
调优调的是什么?
调整的jvm内存模型中的参数,以及GC垃圾回收器的选择,甚至可以选择使用哪种垃圾回收算法;
那么调优的目的是什么?
调优调的是: 减少GC 的次数,以及GC的STW 时间,这里的GC 大多数指FULL GC

当然minor gc 可能时间会非常长,不过这个情况较为特殊,之后文中会说;


一、jvm是如何运行代码的?

大概步骤为

  • java源文件编译为.class文件
  • .class文件被各种平台版本的jvm编译为本地机器码(字节码)
  • 类加载机制将这些字节码加载后,放到运行时数据中(内存模型中)
  • 字节码执行器,通过内存中的入栈出栈执行这些字节码

二、jvm的内存模型

1 整体内存模型结构图

jvm内存模型

● 堆: 存放对象实例 常量池
● 方法区: 方法信息头,静态变量,常量
● 本地方法栈: native 保留方法运行时候的内存空间
● 程序计数器: 存放执行字节码的行号指示器 (字节码指令的地址)
● java虚拟机栈: 对象的引用,指针,八大基本类型 局部变量

2 堆中的年代区域划分

我们只需要关注我们大多数调整的就好了,那就是年轻代 ,老年代
堆中的年代划分

  • 默认新生代 老年代比例 1:2
  • 默认新生代中 eden 和 s (s0 s1) 区域的比例为 8:1:1

3 对象在内存模型中是如何流转的?

  1. 首先new 一个对象的时候,对象一般会在堆中开辟一块内存存储
  2. 然后这个线程结束,这个对象不再被引用之后,就会被纳入到年轻代,当其中的一块s区域满了,发生轻gc,也就是会发生stw;
  3. 多种情况会导致对象进入老年代: 例如 一个对象的分代年龄大于15; 对象的整体大小大于s0/s1区域的50% ,不会放入s区,直接进入老年代 等等;
  4. 分代年龄: 在s区域中的对象,每经过一次轻gc,分代年龄加1;
  5. 轻gc处理对象的方式: 一部分被加入到老年代,大多数都是从一个s区域复制到另个一s区域(标记复制算法)
  6. s区域中的两块区域,总有一块是空的;

4 什么是FULL GC,STW? 为什么会发生FULL GC?

  1. 与轻gc 类似,FULL GC 是发生在老年代的gc
  2. stw 是 stop the word,所有用户线程都会停止,现象例如: 你在淘宝添加一个物品到购物车,卡住了;
  3. 发生full gc 与轻gc类似,也就是老年代空间被填满了,必须进行垃圾回收,将无用对象全部移除,释放空间
  4. 如果释放的空间不够,程序仍然在申请大量的内存,那么此时会发生 oom;
  5. full gc 一般采用 可达性算法回收(自行百度);

5 要调优,首先要知道有哪些垃圾收集器及哪些算法

  1. 常用垃圾回收算法汇总
    垃圾回收中的常用算法
  2. 常用的垃圾回收器
    ● Serial 是一个新生代收集器,基于标记-复制算法实现
    ● Serial Old 是一个老年代收集器,基于标记-整理算法实现
    ● 两者都是单线程收集,需要「Stop The World」
    ● Parallel Scavenge 收集器是一款新生代收集器,基于标记-复制算法实现
    ● Parallel Old 收集器是一款老年代收集器,基于标记-整理算法实现
    ● 两者都支持多线程并行收集,需要「Stop The World」
    ● CMS(Concurrent Mark Sweep)是一个老年代收集器,基于标记-清除算法实现
    ● G1 是一款主要面向服务端应用的垃圾收集器。
    ● 从整体来看是基于「标记-整理」算法实现的收集器,但从局部(两个 Region 之间)上看又是基于「标记-复制」算法实现
    ● G1 即是新生代又是老年代收集器",无需组合其他收集器。
    可以看到垃圾回收器一般不采用单独的一个算法实现
    JDK9 前,我们会在 CMS 和 G1 间选择,对于大概 4GB 到 6GB 以下的堆内存,CMS 一般能处理得比较好,而对于更大的堆内存,可重点考察一下 G1
  3. 其中G1比较重要,我们详细说下相关参数
 -XX:+UseG1GC
启用 G1 垃圾回收器
-XX:InitiatingHeapOccupancyPercent=<45>
当整个 Java 堆的占用达到参数的值时,开始并发标记阶段
-XX:MaxGCPauseMillis=200
G1 暂停时间目标 ( >0 的毫秒数)
-XX:NewRatio=n
新生代与老生代 (new/old generation) 的大小比例 (Ratio). 默认值为 2
-XX:SurvivorRatio=n
Eden/Survivor 空间大小的比例 (Ratio). 默认值为 8
-XX:MaxTenuringThreshold=n
提升年老代的最大临界值 (tenuring threshold). 默认值为 15
-XX:ParallelGCThreads=n
设置垃圾收集器在并行阶段使用的线程数,默认值随 JVM 运行的平台不同而不同
-XX:ConcGCThreads=n
并发垃圾收集器使用的线程数量。 默认值随 JVM 运行的平台不同而不同
-XX:G1ReservePercent=n
作为空闲空间的预留内存百分比,以降低目标空间溢出的风险。默认值是 10%
-XX:G1HeapRegionSize=n
指定每个 Region 的大小。默认值将根据 heap size 算出最优解。最小值为 1Mb, 最大值为 32Mb
  1. 我们能够调整的参数有哪些(常用参数汇总)
//常见配置汇总 
//堆设置 
-Xms:初始堆大小 
-Xmx:最大堆大小 
-XX:NewSize=n:设置年轻代大小 
-XX:NewRatio=n:设置年轻代和年老代的比值.如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4 
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值.注意Survivor区有两个.如:3,表示Eden:Survivor=3:2,一个Survivor区占整个年轻代的1/5 
-XX:MaxPermSize=n:设置持久代大小
-XX:MetaspaceSize:设置元空间大小
-XX:MaxMetaspaceSize:设置元空间最大大小
-Xss128k: 设置每个线程的堆栈大小。
//收集器设置 
-XX:+UseSerialGC:设置串行收集器 
-XX:+UseParallelGC:设置并行收集器 
-XX:+UseParalledlOldGC:设置并行年老代收集器 
-XX:+UseConcMarkSweepGC:设置并发收集器
//垃圾回收统计信息 
-XX:+PrintGC 
-XX:+PrintGCDetails 
-XX:+PrintGCTimeStamps 
-Xloggc:filename
//并行收集器设置 
-XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数.并行收集//线程数. 
-XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间 
-XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的百分比.公式为1/(1+n)
//并发收集器设置 
-XX:+CMSIncrementalMode:设置为增量模式.适用于单CPU情况. 
-XX:ParallelGCThreads=n:设置并发收集器年轻代收集方式为并行收集时,使用的CPU数.并行收集线程数.
-XX:+CMSParallelRemarkEnabled:并发清理

6 调优不是盲目的,要有依据,几款内存诊断工具

  1. jmap jmap使用
  2. jstack jstack使用
  3. 阿里arhtas
    百度即可;
    下载,运行 arthas
    ● 线程占用过高原因: thread pid
    ● 死锁信息: thread -b
    ● 查看当前代码: jad 文件名称

7 结束语

通过看此文章不会让你知道具体怎么调优,但是应该知道如果调优的大体学习路线,具体怎么调优,我是经过自己的学习外加 观看 诸葛老师的课程 传送门
没错,我也是一个毕业于哔哩哔哩的人;

8 出个问题,也是课程中的

调优的目的是为了减少full gc 的次数和时间,尽量通过minor gc处理,这样就可以了,没有问题哈;
问题如下:
我现在有 8核64G的一个服务器,上面运行的程序不是BAT那种级别的,但是也不小;
问题: 堆内存可以设置很大,为了尽量通过轻gc解决,是不是年轻代设置的越大越好?

答案是否定的,因为当年轻代足够大之后,发生minor gc 的时候,也需要stw ,这个时间也会非常久,所以还是需要做适合的大小配置;这也就是我们为什么要调优的原因; 合适的大小才最重要!!!


总结

经过此番学习,对于jvm内存模型,代码运行,对象流转,内存分配有了更高层次认知,对于jvm调优,为什么要调优有清晰的认知,继续学习这篇文章;
改jvm参数不难,难的是你要知道参数的大小的计算; 要明白参数大小的由来

相关文章:

JVM调优,调的是什么?目的是什么?

文章目录前言一、jvm是如何运行代码的&#xff1f;二、jvm的内存模型1 整体内存模型结构图2 堆中的年代区域划分3 对象在内存模型中是如何流转的?4 什么是FULL GC,STW? 为什么会发生FULL GC?5 要调优,首先要知道有哪些垃圾收集器及哪些算法6 调优不是盲目的,要有依据,几款内…...

docker部署zabbix监控

docker部署zabbix监控 1、环境说明 公有云ubuntu22.04 系统->部署docker环境zabbix-server 6.4 2、准备docker环境 更新apt以及安装一些必要的系统工具 sudo apt-get update sudo apt-get -y install apt-transport-https ca-certificates curl software-properties-co…...

C语言刷题(6)(猜名次)——“C”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰还是在复习噢&#xff0c;今天来给大家介绍一个有意思的题目 题目名称&#xff1a; 猜名次 题目内容&#xff1a; 5位运动员参加了10米台跳水比赛&#xff0c;有人让他们预测比赛结果&#xff1a; A选…...

两年外包生涯,感觉自己废了一半....

先说一下自己的情况。大专生&#xff0c;17年通过校招进入湖南某软件公司&#xff0c;干了接近2年的点点点&#xff0c;今年年上旬&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落&#xff01;而我已经在一个企业干了五年的功能测试…...

【python】喜欢XJJ?这不得来一波大采集?

前言 大家早好、午好、晚好吖 ❤ ~欢迎光临本文章 俗话说的好&#xff1a;技能学了~就要用在自己喜欢得东西上&#xff01;&#xff01; 这我不得听个话~我喜欢小姐姐&#xff0c;跳舞的小姐姐 这不得用python把小姐姐舞采集下来~嘿嘿嘿 完整源码、素材皆可点击文章下方名片…...

公司测试员用例写得乱七八糟,测试总监制定了这份《测试用例编写规范》

统一测试用例编写的规范&#xff0c;为测试设计人员提供测试用例编写的指导&#xff0c;提高编写的测试用例的可读性&#xff0c;可执行性、合理性。为测试执行人员更好执行测试&#xff0c;提高测试效率&#xff0c;最终提高公司整个产品的质量。 一、范围 适用于集成测试用…...

LeetCode 热题 HOT 100【题型归类汇总,助力刷题】

介绍 对于算法题&#xff0c;按题型类别刷题才会更有成效&#xff0c;因此我这里在网上搜索并参考了下 “&#x1f525; LeetCode 热题 HOT 100” 的题型归类&#xff0c;并在其基础上做了一定的完善&#xff0c;希望能够记录自己的刷题历程&#xff0c;有所收获&#xff01;具…...

【Java进阶篇】—— File类与IO流

一、File类的使用 1.1 概述 File 类以及本章中的各种流都定义在 java.io 包下 一个File对象代表硬盘或网络中可能存在的一个文件或文件夹&#xff08;文件目录&#xff09; File 能新建、删除、重命名 文件和目录&#xff0c;但 File不能访问文件内容本身。如果我们想要访问…...

Mysql 竟然还有这么多不为人知的查询优化技巧,还不看看?

前言 Mysql 我随手造200W条数据&#xff0c;给你们讲讲分页优化 MySql 索引失效、回表解析 今天再聊聊一些我想分享的查询优化相关点。 正文 准备模拟数据。 首先是一张 test_orde 表&#xff1a; CREATE TABLE test_order (id INT(11) NOT NULL AUTO_INCREMENT,p_sn VARCHA…...

MATLAB算法实战应用案例精讲-【智能优化算法】海洋捕食者算法(MPA) (附MATLAB和python代码实现)

目录 前言 知识储备 Lvy 飞行 布朗运动 算法原理 算法思想 数学模型...

Spring @Profile

1. Overview In this tutorial, we’ll focus on introducing Profiles in Spring. Profiles are a core feature of the framework — allowing us to map our beans to different profiles — for example, dev, test, and prod. We can then activate different profiles…...

Vue3电商项目实战-个人中心模块4【09-订单管理-列表渲染、10-订单管理-条件查询】

文章目录09-订单管理-列表渲染10-订单管理-条件查询09-订单管理-列表渲染 目的&#xff1a;完成订单列表默认渲染。 大致步骤&#xff1a; 定义API接口函数抽取单条订单组件获取数据进行渲染 落的代码&#xff1a; 1.获取订单列表API借口 /*** 查询订单列表* param {Number…...

【十二天学java】day01-Java基础语法

day01 - Java基础语法 1. 人机交互 1.1 什么是cmd&#xff1f; 就是在windows操作系统中&#xff0c;利用命令行的方式去操作计算机。 我们可以利用cmd命令去操作计算机&#xff0c;比如&#xff1a;打开文件&#xff0c;打开文件夹&#xff0c;创建文件夹等。 1.2 如何打…...

【面试题】闭包是什么?this 到底指向谁?

一通百通&#xff0c;其实函数执行上下文、作用域链、闭包、this、箭头函数是相互关联的&#xff0c;他们的特性并不是孤立的&#xff0c;而是相通的。因为内部函数可以访问外层函数的变量&#xff0c;所以才有了闭包的现象。箭头函数内没有 this 和 arguments&#xff0c;所以…...

汽车4S店业务管理软件

一、产品简介  它主要提供给汽车4S商店&#xff0c;用于管理各种业务&#xff0c;如汽车销售、售后服务、配件、精品和保险。整个系统以客户为中心&#xff0c;以财务为基础&#xff0c;覆盖4S商店的每一个业务环节&#xff0c;不仅可以提高服务效率和客户满意度&#xff0c;…...

基于 pytorch 的手写 transformer + tokenizer

先放出 transformer 的整体结构图,以便复习,接下来就一个模块一个模块的实现它。 1. Embedding Embedding 部分主要由两部分组成,即 Input Embedding 和 Positional Encoding,位置编码记录了每一个词出现的位置。通过加入位置编码可以提高模型的准确率,因为同一个词出现在…...

算法小抄6-二分查找

二分查找,又名折半查找,其搜索过程如下: 从数组中间的元素开始,如果元素刚好是要查找的元素,则搜索过程结束如果搜索元素大于或小于中间元素,则排除掉不符合条件的那一半元素,在剩下的数组中进行查找由于每次需要排除掉一半不符合要求的元素,这需要数组是已经排好序的或者是有…...

大学四年..就混了毕业证的我,出社会深感无力..辞去工作,从头开始

时间如白驹过隙&#xff0c;一恍就到了2023年&#xff0c;今天最于我来说是一个值得纪念的日子&#xff0c;因为我收获了今年的第一个offer背景18年毕业&#xff0c;二本。大学四年&#xff0c;也就将就混了毕业证和学位证。毕业后&#xff0c;并未想过留在湖南&#xff0c;就回…...

C语言数据结构初阶(6)----链表常见OJ题

CSDN的uu们&#xff0c;大家好&#xff01;编程能力的提高不仅需要学习新的知识&#xff0c;还需要大量的练习。所以&#xff0c;C语言数据结构初阶的第六讲邀请uu们一起来看看链表的常见oj题目。移除链表元素原题链接&#xff1a;203. 移除链表元素 - 力扣&#xff08;Leetcod…...

关键字 const

目录 一、符号常量与常变量 二、const的用法 2.1 const常用方法 2.2 const用于指针 2.2.1 p指针所指的对象值不能改变&#xff0c;但是p指针的指向可以改变 2.2.2 常指针p的指向不能改变&#xff0c;但是所指的对象的值可以改变 2.2.3 p所指对象的指向以及对象的值都不可…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

基于服务器使用 apt 安装、配置 Nginx

&#x1f9fe; 一、查看可安装的 Nginx 版本 首先&#xff0c;你可以运行以下命令查看可用版本&#xff1a; apt-cache madison nginx-core输出示例&#xff1a; nginx-core | 1.18.0-6ubuntu14.6 | http://archive.ubuntu.com/ubuntu focal-updates/main amd64 Packages ng…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案

一、TRS收益互换的本质与业务逻辑 &#xff08;一&#xff09;概念解析 TRS&#xff08;Total Return Swap&#xff09;收益互换是一种金融衍生工具&#xff0c;指交易双方约定在未来一定期限内&#xff0c;基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...

现代密码学 | 椭圆曲线密码学—附py代码

Elliptic Curve Cryptography 椭圆曲线密码学&#xff08;ECC&#xff09;是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础&#xff0c;例如椭圆曲线数字签…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...