JVM调优-调优原则和原理分析

1.写在前面

对于JVM调优这个话题,可能大部分程序员都听过这个名词。

但是绝大多数程序员,都没有真真实实去干过,都没有真实的实践过。也不懂得如何调优?不知道要调成怎么样?

那今天咋们就对这个话题来展开描述一下,如何进行jvm调优?主要从以下几个方面进行分享:

  • 调优原则和原理分析
  • JVM垃圾常见的收集器
  • JVM调优常见的工具
  • JVM调优常用的参数
  • JVM调优实践

最后分享一个jvm调优的实践案例。希望可以帮助到各位!!!

那今天我们就来分享一下,jvm调优原则和原理分析

废话不多说了,直接上干货啦!!!

image.png

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调优:

  1. 系统吞吐量与响应性能不高或下降;
  2. Heap内存(老年代)持续上涨达到设置的最大内存值;
  3. Full GC 次数频繁;
  4. GC 停顿时间过长(超过 1 秒);
  5. 应用出现OutOfMemory 等内存异常;
  6. 应用中有使用本地缓存且占用大量内存空间;

3.3 调优调什么?

JVM调优核心是什么?

内存分配 + 垃圾回收!

  1. 合理使用堆内存
  2. GC高效回收占用的内存的垃圾对象
  3. GC高效释放掉内存空间

疑问:是否可以把内存空间设置足够大,那么就不需要回收垃圾呢?

这个问题背景:JVM回收垃圾时机,当JVM内存占满触发垃圾回收!

不可以原因如下:

  1. 不回收垃圾,内存增长巨快,再大的空间都不够用;10w请求,2gb垃圾对象
  2. 物理层面: 64 位操作系统可以支持非常大的内存,但不是无限
    1. 32位操作系统: 2~32 = 4GB
    2. 64位操作系统: 2~64 =16384PB
  3. 虚拟机层面:不能设置无限大内存
  4. 内存设置既不能太大,也不能太小需要基于业务场景平衡考量:内存空间设置过大,一旦内存空间触发垃圾回收,就会非常危险,寻找这个垃圾非常耗时,由于内存空间足够大,寻找这个垃圾的时候,极其的消耗时间,因此导致程序停顿;

举个栗子类比一下:房子足够大,是不是就可以不用打扫卫生!显然是不行的


以上就是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 中,垃圾回收器的具体实现有:

  1. 串行收集器(Serial)
  2. 新生代并行收集器(ParNew)
  3. 并行回收(Parallel Scavenge)
  4. CMS(Concurrent Mark Sweep)
  5. Serial Old(Serial收集器的老年代版本)
  6. Parallel Old(Parallel Scavenge收集器的老年代版本)
  7. 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”

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/837942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

洛谷 P3372:线段树 1 ← 分块算法模板(区间更新、区间查询)

【题目来源】https://www.luogu.com.cn/problem/P3372【题目描述】 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; &#xff08;1&#xff09;将某区间每一个数加上 k。 &#xff08;2&#xff09;求出某区间每一个数的和。【输入格式】 第一行…

二叉树——初解

二叉树 树树的概念树的性质 二叉树二叉树的概念二叉树的性质二叉树的实现方式数组构建左孩子右兄弟法构建指针构建 树 树的概念 在计算机科学中&#xff0c;树&#xff08;Tree&#xff09;是一种重要的非线性数据结构&#xff0c;它由若干节点&#xff08;Node&#xff09;组…

Java面经学习2

来源 https://www.nowcoder.com/discuss/619573767051800576 1.一面内容 RocketMQ延时消息&#xff08;项目用到了&#xff09;底层怎么实现的&#xff08;不会&#xff09; 消息量太大导致读消息延迟时间很长怎么办 redis为什么快&#xff08;说了内存、数据结构优化、单线…

Chromium 调试指南2024 Windows11篇-调试变量监视(十)

1. 前言 设置断点和监视变量是调试过程中常用的两种技术手段。通过设置断点&#xff0c;我们可以暂停程序的执行并检查程序的内部状态&#xff0c;而监视变量则可以帮助我们实时查看程序中关键变量的值。本文将介绍如何在Chromium项目中进行断点设置和变量监视&#xff0c;帮助…

java内容快速回顾+SSM+SpringBoot简要概述

文章目录 java基础知识基本知识列表面对对象堆与栈的关系值修改与引用修改异常&#xff1a;错误异常 SSMspringMVCServletSpringMVC&#xff1a;基于 Servlet的 Spring Web 框架&#xff0c; spring控制反转 IoC(Inversion of Control)面向切面 Aop MybatisJDBCMybatis SpringB…

Git 基础使用(1) 入门指令

文章目录 Git 作用Git 安装Git 使用Git 仓库配置Git 工作原理Git 修改添加Git 查看日志Git 修改查询Git 版本回退 概念补充 Git 作用 Git 是一种分布式版本控制系统&#xff0c;它旨在追踪文件和文件夹的更改&#xff0c;并协助多人协作开发项目。 Git 安装 &#xff08;Lin…

Go 处理错误异常

在Go语言中错误和异常是两个完全不同的概念&#xff0c;错误指的是可能出现问题的地方出现了问题&#xff0c;而异常指的是不该出现问题的地方出现了问题 从Go语言的机制上讲错误和异常就是error 和panic的区别 错误&#xff08;Error&#xff09;&#xff1a;程序中预期会发生…

17.多线程

多线程 程序、进程、线程的概念 程序&#xff1a;是指令和数据的有序集合&#xff0c;是一个静态的概念。比如&#xff0c;在电脑中&#xff0c;打开某个软件&#xff0c;就是启动程序。 进程&#xff1a;是执行程序的一次执行过程&#xff0c;是一个动态的概念&#xff0c;…

c# 实现每个整数分钟执行一次的定时任务

StartAsync 方法中&#xff0c;计算了下一个整数分钟的时间&#xff0c;然后使用 System.Threading.Timer 类创建定时器&#xff0c;并将首次触发时间设为该时间。在 InsertDB2Async 方法中&#xff0c;我们定义了要执行的操作&#xff0c;然后使用 await Task.Delay(1000) 模拟…

mongo副本集本地部署

介绍 前言&#xff1a; mongodb 因为高性能、高可用性、支持分片等特性&#xff0c;作为非关系型数据库被大家广泛使用。其高可用性主要是体现在 mongodb 的副本集上面&#xff08;可以简单理解为一主多从的集群&#xff09;&#xff0c;本篇文章主要从副本集介绍、docker搭建…

blender渲染时导致cpu高负载的可能因素

Blender 在进行渲染时&#xff08;尤其是在使用 Cycles 渲染引擎时&#xff09;通常会导致 CPU 高负载的原因主要有以下几个&#xff1a; 渲染计算&#xff1a;Blender 的 Cycles 渲染引擎是一种基于光线追踪的渲染引擎&#xff0c;它通过追踪光线在场景中的传播来生成图像。这…

基于SSM的“口腔护理网站”的设计与实现(源码+数据库+文档)

基于SSM的“口腔护理网站”的设计与实现&#xff08;源码数据库文档) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 首页 用户注册页面 医生信息查看模块 口腔护理预约模块 后台首页面…

分享如何通过定时任务调用lighthouse前端测试脚本+在持续集成测试中调用lighthouse前端测试脚本

最近写了个小工具来优化lighthouse在实际工作中的使用&#xff0c;具体实现了&#xff1a;通过定时任务调用前端测试脚本在持续集成测试中调用前端测试脚本。由于在公司中已经应用&#xff0c;所以就不能提供源码了&#xff0c;这里简单说一下实现思路&#xff0c;希望可以帮助…

Java 循环结构 - for, while 及 do...while

Java 循环结构 - for, while 及 do…while 顺序结构的程序语句只能被执行一次。 如果您想要同样的操作执行多次&#xff0c;就需要使用循环结构。 Java中有三种主要的循环结构&#xff1a; while 循环 do…while 循环 for 循环 在 Java5 中引入了一种主要用于数组的增强型 f…

前端面试题日常练-day04 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末。 1. 下列哪个 CSS 单位可以根据用户的首选字体大小进行调整&#xff1f; A) pxB) emC) remD) vw2. HTML5 中的<video>元素用于什么&#xff1f; A) 播放音频文件B) 嵌入外部网页内容C) 显示图…

Debezium日常分享系列之:Debezium 2.7.0.Alpha2发布

Debezium日常分享系列之&#xff1a;Debezium 2.7.0.Alpha2发布 新功能和改进1.Oracle ROW_ID 包含在更改事件中2.带有 JDBC 接收器的 PostreSQL 数组3.Oracle 使用自定义模式名称刷新表4.使用 JWT/seed 进行 NATS 身份验证5.Oracle 大量表查询过滤器 新功能和改进 1.Oracle R…

OUC图书馆电脑开启无线网络,连接手机热点,解决联网但无法访问网络的问题

OUC图书馆电脑连手机热点 前言手动脚本&#xff08;暂未测试&#xff09;注意 前言 【中国海洋大学】OUC图书馆电脑默认只能有线连校园网&#xff0c;这让没有校园网的人很是头疼&#xff08;手机流量太多了&#xff0c;根本用不完&#xff0c;需要大流量卡的可以私信我&#…

在Android设备丢失数据后恢复数据的4个方法

了解 Android 媒体存储 媒体存储是下载、查看、播放和流式传输视频文件、音频文件、图像和其他媒体文件时所需的过程。此服务无法从手机桌面访问&#xff0c;因此您需要按照以下步骤通过安卓手机访问此系统服务。 步骤1&#xff1a;导航到手机设置&#xff0c;然后转到应用程…

Flink中基于Chandy-Lamport算法的分布式快照实现详解

Apache Flink利用了一种基于Chandy-Lamport分布式快照算法的变体——异步屏障快照&#xff08;Asynchronous Barrier Snapshotting, ABS&#xff09;来实现其强大的容错机制。Chandy-Lamport算法最初由K.M. Chandy和Leslie Lamport于1985年提出&#xff0c;是一种用于分布式系统…

linux shell脚本追踪与调试命令之sh

linux shell脚本在执行之前,大家就怕出问题,该如何调试呢?我们有没有办法不需要通过直接执行该脚本就判断是否有问题呢?当然有,那就是sh命令。 1.sh用法 sh [参数] shell.sh sh命令参数 参数说明-n不需要执行脚本,仅查询语法问题-v在执行脚本前,先将脚本的内容输出到…