当前位置: 首页 > 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所指对象的指向以及对象的值都不可…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查

在对接支付宝API的时候&#xff0c;遇到了一些问题&#xff0c;记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

leetcodeSQL解题:3564. 季节性销售分析

leetcodeSQL解题&#xff1a;3564. 季节性销售分析 题目&#xff1a; 表&#xff1a;sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析

Java求职者面试指南&#xff1a;Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问&#xff08;基础概念问题&#xff09; 1. 请解释Spring框架的核心容器是什么&#xff1f;它在Spring中起到什么作用&#xff1f; Spring框架的核心容器是IoC容器&#…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...

WebRTC调研

WebRTC是什么&#xff0c;为什么&#xff0c;如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...