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

devtools/2024/9/23 0:16:39/

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.ppmy.cn/devtools/42090.html

相关文章

Go系列:git status 高级技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。

Docker是一种开源的容器化平台&#xff0c;它可以将应用程序及其所有依赖项打包为一个可以在任何环境中运行的独立容器。下面是Docker的基本概念和优势以及在应用程序开发中的实际应用。 基本概念&#xff1a; 镜像&#xff08;Image&#xff09;&#xff1a;镜像是Docker的基…

Linux查看进程命令ps和top

Linux 是一种自由和开放源代码的操作系统&#xff0c;它的使用在全球范围内非常广泛。在 Linux 中&#xff0c;进程是操作系统中最重要的组成部分之一&#xff0c;它代表了正在运行的程序。了解如何查看正在运行的进程是非常重要的&#xff0c;因为它可以帮助你了解系统的运行状…

全新多语言海外抢单刷单系统源码 订单自动匹配 支持分组 代理后台

安装教程 测试环境&#xff1a;Nginx PHP7.0 MySQL5.6 config/database 修改数据库 设置运行目录public 伪静态thinkphp 后台登录地址&#xff1a;/admin 账号admin 密码admin123 前端出现报错 删除runtime文件夹得缓存文件即可 源码免费下载地址抄笔记 (chaobiji.cn)

vs2019 c++里用 typeid() . name () 与 typeid() . raw_name () 测试数据类型的区别

&#xff08;1&#xff09; 都知道&#xff0c;在 vs2019 里用 typeid 打印的类型不大准&#xff0c;会主动去掉一些修饰符&#xff0c; const 和引用 修饰符会被去掉。但也可以给咱们验证学到的代码知识提供一些参考。那么今天发现其还有 raw_name 成员函数&#xff0c;这个函…

免费WordPress主题可以商用吗?不可以

免费WordPress主题可以商用吗?不可以商用。 使用WordPress免费主题进行商业活动确实存在一些风险和不推荐的原因&#xff0c;以下是一些额外的不能商用的理由&#xff1a; 缺乏专业性&#xff1a;免费主题往往是由个人开发者或爱好者制作的&#xff0c;可能缺乏专业设计和开…

三子棋游戏

1、实现三子棋 test.c //测试游戏的逻辑 game.c //游戏代码的实现 game.h //游戏代码的声明&#xff08;函数声明&#xff0c;符号定义&#xff09; 1、 在主函数里实现&#xff0c;首先有个界面&#xff0c;让玩家选择是否玩游戏。上来就先打印菜单&#xff0c;用do ... …

C语言简要(一)

总得让她开心吧 helloworld #include <stdio.h>int main() {printf("hello world!\n");return 0; } 程序框架 #include <stdio.h> int main {return 0; }输出 printf("hello world!\n"); "里面的内容叫做“字符串”&#xff0c;prin…