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”

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“Linux”目录结构and配置网络

了解完命令格式和vi、vim编辑器后&#xff0c;我们来认识一下目录的结构&#xff1a; 一、目录 &#xff08;1&#xff09;目录的特点 windows特点&#xff1a; Windows中有C、D、E盘&#xff0c;每个都是一个根系统 Linux特点&#xff1a; linux中只有一个根&#xff08;单…

富在术数,不在劳身 财富的积累更多依赖于智慧和策略,而不是单纯的体力劳动 GPT-4o免费用

"富在术数&#xff0c;不在劳身"这句话的意思是财富的积累更多依赖于智慧和策略&#xff0c;而不是单纯的体力劳动。这句话强调了智慧和技巧在获取财富过程中的重要性&#xff0c;提示人们在追求财富时&#xff0c;应注重策略和方法的运用&#xff0c;而不仅仅依靠辛…

【正点原子Linux连载】第四十一章 Linux wifi驱动实验 摘自【正点原子】ATK-DLRK3568嵌入式Linux驱动开发指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DLRK3568开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第四十…

服务的war包已经丢在tomcat中但是还是没法访问,如何排查?

问题出现的现象是我已经将 XWiki 的 WAR 包放置在 Tomcat 的 webapps目录下但仍然无法访问&#xff0c;反思之后可以从下面以下几个方面来诊断和解决问题&#xff1a; 1. 确认 Tomcat 正在运行 首先&#xff0c;确保 Tomcat 服务正在正常运行。可以使用以下命令检查 Tomcat 的…

嵌入式科普(16)c语言函数参数的传递方式

目录 一、概述 二、C函数参数 2.1 一张图讲清 2.2 按数据类型分类&#xff1a; 2.2.1 基本数据类型参数&#xff1a; 2.2.2 数组参数&#xff1a; 2.2.3 结构体参数&#xff1a; 2.2.4 指针参数&#xff1a; 2.2.5 函数指针参数&#xff1a; 2.3 按传递方式分类&…

nestjs封装一个响应体

封装一个DTO // response.dto.tsimport {CallHandler,ExecutionContext,Injectable,NestInterceptor, } from "nestjs/common"; import { FastifyReply } from "fastify"; import { Observable } from "rxjs"; import { map } from "rxjs/…

电力系统潮流计算的计算机算法(一)——网络方程、功率方程和节点分类

本篇为本科课程《电力系统稳态分析》的笔记。 本篇为这一章的第一篇笔记。下一篇传送门。 实际中的大规模电力系统包含成百上千个节点、发电机组和负荷&#xff0c;网络是复杂的&#xff0c;需要建立复杂电力系统的同一潮流数学模型&#xff0c;借助计算机进行求解。 简介 …

浅谈音频鉴黄技术

随着互联网的迅猛发展和网络智能化的普及&#xff0c;音视频内容已成为互联网传播的主流形式&#xff0c;各大视频网站、直播平台及短视频应用不断涌现&#xff0c;为亿万用户提供了丰富多样的娱乐和资讯内容。然而&#xff0c;这种繁荣背后也隐藏着不容忽视的问题&#xff1a;…

如何申请免费一年SSL证书

申请免费一年的SSL证书可以通过以下几个步骤进行&#xff0c;这里以JoySSL为例&#xff0c;因为它是目前提供此类服务的流行平台之一&#xff0c;同时也提到了宝塔面板中的TrustAsia SSL证书。请根据您的具体需求选择合适的方式&#xff1a; 申请免费一年SSL证书&#xff1a; …

MIT 6.5840(6.824) Lab1:MapReduce 设计实现

1 介绍 本次实验是实现一个简易版本的MapReduce&#xff0c;你需要实现一个工作程序&#xff08;worker process&#xff09;和一个调度程序&#xff08;coordinator process&#xff09;。工作程序用来调用Map和Reduce函数&#xff0c;并处理文件的读取和写入。调度程序用来协…

游戏数值策划关卡策划文案策划系统策划及游戏运营干货

1.《游戏新手村》免费电子书 我2007年开始做网络游戏&#xff0c;后面又做过网页游戏和手机游戏。当时市面上关于游戏策划和运营的书籍屈指可数&#xff0c;于是我就想着要不我写一本吧&#xff0c;然后2014年10月开始撰写。关于本书的更多信息可查看这篇文章>> 游戏新手…

论Java和C++方向选择

目录 1.难度2.就业压力3.岗位选择4.薪资待遇5.选择建议小结 1.难度 Java &#xff0c;C&#xff0c; 测开&#xff0c;整体来说三个方向难度相当。 1.仅从语法角度来看&#xff0c;c 是掌控一切&#xff0c;知识都要懂一点&#xff0c;而java的特点在于省心&#xff0c;都封装…

Google如何做医疗大模型(Med-Gemini)

1. 前言 开发垂直领域模型的方法有好几种&#xff0c;其中医疗、法律等专业是比较能体现模型垂直行业能力的&#xff0c;因此也深受各大厂商的重视。 五一小长假的第一天&#xff0c;Google在Arxiv上发布了《Capabilities of Gemini Models in Medicine 》 ( https://arxiv.o…

大模型LLM 结合联网搜索增强isou

参考&#xff1a; https://github.com/yokingma/search_with_ai 在线使用网址&#xff1a; https://isou.chat/ 安装github下载&#xff0c;运行docker compose 如果一直报下面错误&#xff1a; 解决方法https://github.com/yokingma/search_with_ai/pull/7 默认打开&a…

nginx 发布静态资源

一. nginx 发布静态资源 在nginx中nginx.conf配置文件中添加内容如下&#xff1a; server {listen 90;server_name localhost;# 配置静态资源文件&#xff0c;就可以访问了location / {root /home/fooie-shop;index index.html;}# 配置音频和图片资源location /imoo…

NSSCTF | [SWPUCTF 2021 新生赛]babyrce

打开题目&#xff0c;显示了一个php脚本 我们来分析一下这个脚本是什么意思 <?php error_reporting(0); header("Content-Type:text/html;charsetutf-8"); highlight_file(__FILE__); if($_COOKIE[admin]1) {include "../next.php"; } elseecho &quo…

Java——多线程

一.多线程 1.什么是多线程 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程的实际运作单位 简单理解多线程就是应用软件中相互独立&#xff0c;可以同时运行的功能(也可以理解为人体内相互独立&#xff0c;但可以同时运行的器官⌓‿⌓) 我们…

排序-冒泡排序(bubble sort)

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历待排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就把它们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…

[牛客网]——C语言刷题day2

答案&#xff1a;B 解析&#xff1a; char *p[10] 是指针数组,数组里存放了10个指针,在64位系统下指针占8个字节,所以sizeof(p) 10 * 8 80. char (*p1)[10]是数组指针,p1是一个指向存放10个char类型的数组的指针,所以sizeof(p1) 8. 答案&#xff1a;B 解析&#xff1a…

0513student的Maven项目

0513student的Maven项目包-CSDN博客 数据库字段 主页需求 点击休学按钮&#xff0c; 实现对 ‘’是否休学‘’ ‘’休学操作‘’ 的相应修改&#xff1b; 还有对数据库中相应学生休学状态修改。