JVM机制理解与调优方案
作者:
逍遥Sean
简介:一个主修Java的Web网站\游戏服务器后端开发者
主页:https://blog.csdn.net/Ureliable
觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言!
前言
很多Java开发岗位要求实际调优经验,难倒了JVM小白😭
想要掌握JVM调优首先理解JVM的组成和机制,明白GC的原理和算法,掌握调优工具,知道参数配置,随后在开发过程中根据项目需要进行配置或是机制优化💪
👇👇👇
另外,博主之前分享了一篇关于JVM的面试经验,欢迎友友学习评价~
文章链接: Java开发第二轮面试被疯狂问JVM相关,被整懵了!!赶紧好好复习一下
JVM机制理解与调优方案
- 1 原理
- 1.1 JVM内存分配
- 1.2 JVM的主要组成部分及其作用?
- 1.3 JVM运行时数据区包含哪些?
- 1.4 JVM 对象创建步骤流程是什么?
- 2 GC
- 2.1 JVM垃圾回收机制,何时触发MinorGC等操作
- 2.2 JVM的垃圾回收算法
- 3 JVM调优
- 3.1 JVM 调优的工具?
- 3.2 常用的JVM调优参数?
- 3.3 JVM调优方案总结
1 原理
1.1 JVM内存分配
Java虚拟机(JVM)内存分配主要分为以下几个步骤:
-
堆内存分配:Java中的对象都存储在堆内存中,
当程序需要创建一个新对象时,JVM就会在堆中分配一块内存空间
,并返回该对象的引用。 -
栈内存分配:
栈内存用于存放方法调用中的数据,如方法的参数、局部变量等
。每当调用一个新方法时,JVM就会为该方法分配一块栈内存空间,并将该方法的参数和局部变量存储在该内存空间中。 -
方法区内存分配:
方法区用于存储类的元数据、静态变量、常量等数据,通常也称为“永久代”
。当JVM需要加载一个类时,它就会在方法区中分配一块内存空间,并将该类的元数据等信息存储在该内存空间中。 -
本地内存分配:
本地内存用于存储使用JNI(Java Native Interface)调用的本地方法库的数据
。当程序需要调用本地方法库时,JVM就会为该方法库分配一块本地内存空间,并将相关数据存储在该内存空间中。
1.2 JVM的主要组成部分及其作用?
-
类装载器(Class Loader):
Java代码 -----> 字节码 的编译过程
。JVM中的类装载器用于加载Java程序的类文件。它会将Java程序中的类文件加载到内存中,并生成对应的Java类。 -
运行时数据区(Runtime Data Area):
把上一步编译得到的字节码加载到内存中
。JVM中的运行时数据区用于存储Java程序中的数据。它包括方法区、堆、栈、程序计数器和本地方法栈。 -
执行引擎(Execution Engine):
解析上一步加载而来的字节码,翻译成为系统指令,交由CPU执行
。JVM中的执行引擎用于执行由字节码文件生成的指令。它是将Java程序转换为机器指令的重要组成部分。 -
本地库接口(Java Native Interface(JNI)):JVM中的JNI允许Java程序调用本地应用程序。JNI提供了一种标准的接口,使Java程序可以与C或C++程序进行交互。
-
Java虚拟机语言规范(Java Virtual Machine Specification):
诸如IO之类的由其他语言写成的本地库接口
。JVM中的规范文件定义了Java编程语言的语法和语义。它描述了JVM如何解释Java程序,并将其转换为机器指令。 -
调试接口(Debugging Interface):JVM中的调试接口允许开发人员在代码执行期间调试Java程序。它提供了一些开发工具,如JMX(Java Management Extensions)和JVMPI(Java Virtual Machine Profiler Interface)。
1.3 JVM运行时数据区包含哪些?
程序计数器:行号指示器,通过改变该值,以选取下一步的指令
Java虚拟机栈:局部变量、方法出口等,为JVM服务
本地方法栈:局部变量、方法出口等,为本地Native方法服务
堆区:内存最大的一块,所有的对象实例都在这里分配内存
方法区:常量、静态变量等
1.4 JVM 对象创建步骤流程是什么?
-
类加载:JVM需要先加载类定义。如果定义这个类的.class文件还没有被加载,JVM就会把这个文件读进来,然后对它进行解析和验证。
-
分配内存:当类被加载后,JVM需要在堆上分配内存来存储对象。根据对象的类型和大小,JVM会在堆上分配一段连续的内存空间。
-
初始化成员变量:在对象创建的过程中,JVM需要初始化对象的所有成员变量。如果成员变量是基本类型,JVM会给其默认值;如果成员变量是引用类型,JVM会初始化为null。
-
执行构造函数:当内存空间分配完成并且成员变量初始化完成后,JVM会调用构造函数对对象进行初始化。
-
返回对象引用:构造函数执行完成后,对象就被创建成功了。JVM会返回对象的引用,开发者就可以通过该引用来访问和操作该对象。
2 GC
2.1 JVM垃圾回收机制,何时触发MinorGC等操作
分代垃圾回收机制:不同的对象生命周期不同。把不同生命周期的对象放在不同代上,不同代上采用最合适它的垃圾回收方式进行回收。
JVM中共划分为三个代:年轻代、年老代和持久代,
年轻代:存放所有新生成的对象;
年老代:在年轻代中经历了N次垃圾回收仍然存活的对象,将被放到年老代中,故都是一些生命周期较长的对象;
持久代:用于存放静态文件,如Java类、方法等。
新生代的垃圾收集器命名为“minor gc
”,老生代的GC命名为”Full Gc 或者Major GC
”.其中用System.gc()强制执行的是Full Gc
.
判断对象是否需要回收的方法有两种:
- 引用计数。当某对象的引用数为0时,便可以进行垃圾收集。
- 对象引用遍历。如果某对象不能从这些根对象的一个(至少一个)到达,则将它作为垃圾收集。在对象遍历阶段,gc必须记住哪些对象可以到达,以便删除不可到达的对象,这称为标记(marking)对象。
触发GC(Garbage Collector)的条件:
-
GC在优先级最低的线程中运行,一般在应用程序空闲即没有应用线程在运行时被调用。
-
Java堆内存不足时,GC会被调用。
2.2 JVM的垃圾回收算法
简要记忆:
标记-清除
:无用对象全部干掉
标记-整理
:有用对象都向一边移动,边界以外的全部干掉
复制算法
:左边内存快满时,将其中要保留的对象复制到右边内存中,然后整体干掉左边内存。右边同理,内存利用率仅有一半
分代算法
:根据对象存活周期的不同将内存划分为几块,一般是新生代和老年代,新生代基本采用复制算法,老年代采用标记整理算法。
完整概念:
- 标记-清除算法(Mark-Sweep):首先标记所有活动对象,然后清除所有未标记的对象。
- 复制算法(Copying):将存活对象复制到一块新的内存中,然后清除旧的内存。
- 标记-整理算法(Mark-Compact):首先标记所有活动对象,然后将所有存活对象移到一端,最后清除端边界之外的所有对象。
- 分代收集算法(Generational):根据对象的生命周期划分为不同代,根据代的特点采用不同的垃圾回收算法,如新生代采用复制算法,老年代采用标记-整理算法。
- 并发标记-清除算法(Concurrent Mark-Sweep):在应用程序运行的同时标记和清除垃圾,减少停顿时间。
- G1算法(Garbage-First):将堆内存分成多个大小相等的区域,根据垃圾多少先清理垃圾最多的区域,提高垃圾回收效率。
3 JVM调优
3.1 JVM 调优的工具?
JVM 调优的常用工具包括以下几种:
- jstat:用于监视 JVM 运行状态和性能指标。
- jmap:用于生成 Java 堆转储快照并进行分析。
- jstack:用于生成 Java 线程转储快照并进行分析。
- VisualVM:是一个图形化的工具,可用于监视和分析 JVM 应用程序的运行状态和性能指标。
- jconsole:也是一个图形化的工具,可以监视和管理 JVM 应用程序。
- JVM Profiler:是一个高级的分析工具,可用于分析 JVM 应用程序的性能瓶颈。
- GCViewer:是一个用于分析 JVM 垃圾回收行为和性能的工具。
这些工具都有各自的特点和优劣,具体使用取决于实际调优需求。
JDK 自带了很多监控工具,都位于 JDK 的 bin 目录下,其中最常用的是 jconsole 和 jvisualvm这两款视图监控工具。
•jconsole
:用于对 JVM 中的内存、线程和类等进行监控;
•jvisualvm
: JDK自带的全能分析工具,可以分析:内存快照、线程快照、程序死锁、监控内存的变化、 gc 变化等。
3.2 常用的JVM调优参数?
常用版:
• -Xms2048M最小内存2048M
• -Xmx2048M最大内存2048M
• -XX:NewRatio=4设置年轻的和老年代的内存比例为 1:4
• -XX:SurvivorRatio=8设置新生代 Eden 和 Survivor 比例为 8:2
• -XX:+UseConcMarkSweepGC指定使用 CMS + Serial Old 垃圾回收器组合;
• -XX:+PrintGC开启打印 gc 信息;
• -XX:+PrintGCDetails打印 gc 详细信息。
完整版:
- -Xms:设置JVM初始堆大小
- -Xmx:设置JVM最大堆大小
- -Xmn:设置年轻代大小
- -XX:SurvivorRatio:设置Eden区和Survivor区的比例
- -XX:MaxPermSize:设置永久代大小
- -XX:MaxTenuringThreshold:设置对象晋升年龄的最大值
- -XX:NewRatio:设置老年代与年轻代的比例
- -XX:+UseConcMarkSweepGC:使用CMS垃圾回收器
- -XX:+UseParallelGC:使用并行垃圾回收器
- -XX:ParallelGCThreads:设置并行垃圾回收线程数
- -XX:+CMSParallelRemarkEnabled:启用CMS回收完成后并行分析标记
- -XX:+UseParallelOldGC:使用并行老年代垃圾回收器
- -XX:MaxGCPauseMillis:设置最大垃圾回收停顿时间
- -XX:+AggressiveOpts:启用侵略性优化特性
- -XX:+OptimizeStringConcat:启用字符串拼接优化
- -XX:+UseBiasedLocking:启用偏向锁
- -XX:CompileThreshold:设置JIT编译阈值
3.3 JVM调优方案总结
-
调整内存分配参数:包括最大堆内存、最小堆内存、新生代大小等,以避免频繁的垃圾回收和内存溢出。
-
优化垃圾回收:可以通过选择不同的垃圾回收器,调整回收器选项等来实现。
-
选择合适的JVM版本:新版本的JVM可能会提供更好的性能和稳定性。
-
减少对象的创建:避免频繁的对象创建和销毁,尽量重用已经创建的对象。
-
使用线程池:尽量减少线程的创建和销毁,使用线程池来管理线程。
-
避免过度同步:使用适当的同步控制方式,避免过度使用锁和同步方法。
-
优化代码结构和算法:使用更高效的算法和数据结构,避免不必要的计算和内存消耗。
-
监控JVM运行状态:及时发现问题并解决,包括内存泄漏、线程死锁等。
-
使用JVM调试工具:如JVisualVM、JConsole和Java Flight Recorder等,以便更好地分析和解决问题。
注:以上方案须具体问题具体分析,不同应用场景可能需要不同的调优方法。
相关文章:
JVM机制理解与调优方案
作者:逍遥Sean 简介:一个主修Java的Web网站\游戏服务器后端开发者 主页:https://blog.csdn.net/Ureliable 觉得博主文章不错的话,可以三连支持一下~ 如有需要我的支持,请私信或评论留言! 前言 很多Java开发…...
Django的设计模式及模板层
Django的设计模式及模板层 设计模式MVC和MVT MVC 代表 Model-View-Controller(模型-视图-控制器)模式。 M 模型层(Model),主要用于对数据库层的封装 V 视图层(View),用于向用户展示结果 (WHAT HOW) C 控制(Controller,用于处理请求、获取数据、返回结果(重要) 作…...
写代码生成流程图
我们在写文档,博客的时候,一般都会使用markdown语法,最常见的就是一些github开源项目的README。有时候会去画一些流程图,例如使用process.on或者xmind等第三方网站,然后截图插入到文档中。 今天我们介绍一种使用代码直…...
python reportlab生成pdf
这里自定义了pagetemplate,使用BaseDocTemplate,但我感觉一般使用SimpleDocTemplate就可以。 from reportlab.platypus import Frame from reportlab.lib.pagesizes import A4, landscapepadding dict(leftPadding72,rightPadding72,topPadding72,bott…...
第一次作业题解
第一次作业题解 P5717 【深基3.习8】三角形分类 思路 考的是if()的使用,还要给三条边判断大小 判断优先级: 三角形?直角、钝角、锐角等腰等边 判断按题给顺序来 代码 #include <stdio.h> int main() {int a 0, b 0, c 0, x 0, y 0, z 0…...
美篇作文网教学资源源码-自带作文数据
非常漂亮的UI设计和页面排版! 自适应手机pc端 页面内容均支持自定义 可以用来做网站矩阵,或者增强你其他网站板块,或者单独运营都可以。 可以通过广告方式变现,或者引流等等 友好的seo,更容易被浏览器收录 关注青狐…...
电脑软件:Duplicate Cleaner Pro 5.16 重复文件清理软件(附下载)
大家平时在使用电脑的时候,会经常从网上下载文件或者从其他电脑拷贝文件到自己的电脑上。久而久之就会在电脑中存放很多相同的文件,并且会越积越多,不仅占用很多磁盘空间,在文件管理上也非常混乱不方便。如何解决呢? …...
支持笔记本电脑直插直充,TOWE 65W智能快充PDU超级插座
电源插排在我们的生活中是必不可少的电器配件。今天,我们日常生活中所使用的电子设备越来越多,无论是手机、平板、笔记本电脑还是各种家用电器,都需要电源来驱动。虽然相对于其他电器来说,插排结构比较简单,但现代家庭…...
部署Kafka
kafka:kafka_2.13-3.5.1 NOTE: Your local environment must have Java 8 installed. Apache Kafka can be started using ZooKeeper or KRaft. To get started with either configuration follow one the sections below but not both. 1 Windows单机 1.1 Kafka w…...
Open3D 进阶(11)使用GMM-Tree算法对点云配准
GMM-Tree算法 一、算法原理1、主要函数2、参考文献二、代码实现三、结果展示1、点云初始位置2、配准后的位置四、测试数据本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、算法原理 1、...
算法刷题注意事项
目录 1、使用nextInt后再使用nextLine的注意事项2、判断x是否是素数3、注意字符串和数字的排序4、Arrays.asList不可修改元素 1、使用nextInt后再使用nextLine的注意事项 使用nextInt再使用nextLine会有问题,输入的回车会被nextLine给接受,可以将nextLi…...
搭建自己的pypi服务器
要搭建自己的 PyPI 服务器,您可以使用 warehouse 项目,它是 PyPI 的开源实现。下面是一些基本步骤: 准备环境: 安装 Python安装 PostgreSQL 数据库 克隆 warehouse 项目: git clone https://github.com/pypa/wareh…...
ndoe.js、npm相关笔记
1、npm 全局安装 npm config get prefix 获取 npm 全局安装路径如果全局插件不能正常使用,看环境变量是否已经配置。没有配置则把全局安装路径配置到环境变量的path中...
如何使用ArcGIS Pro制作标准地图样式国界
相信大家都浏览过标准地图服务提供的标准地图,不知道你有没有想过尝试制作里面的国界,这里为大家介绍一下制作方法,希望能对你有所帮助。 制作已定国界 在地图数据内,国界分为已定国界、未定国界和海岸线,我们先对已定…...
基于数学模型水动力模拟、水质建模、复杂河网构建技术在环境影响评价、入河排污口论证及防洪评价中的应用
目录 专题一 一维水动力模型在河流水动力模拟中的应用 专题二 一维复杂河网模型构建及建筑物设置 专题三 一维水质模型在入河排污口和环境影响评价中的应用 专题四 平面二维水动力模型的构建和验证 专题五 平面二维水动力模型在防洪影响评价中的应用 专题六 平面二维水动…...
每天学习3个小时能不能考上浙大MBA项目?
不少考生经常会问到上岸浙大MBA项目想要复习多长时间,这个问题其实没有固定答案。在行业十余年的经验总结来看,杭州达立易考教育认为基于每一位考生的个人复习时间、个人学习能力以及原有基础情况等不同,复习上岸的预期分数目标也会有差异&am…...
NVM的下载安装和使用
node包管理工具NVM让我们更加方便在各个node版本之间切换来适配不同的项目 一、下载安装 下载地址:github下载地址 https://github.com/coreybutler/nvm-windows/releases安装一直点下一步就行,可以安装在D、E盘都行,安装后检查是否安装成功…...
iOS 视频压缩 mov转mp4 码率
最近还是因为IM模块的功能,IOS录制MOV视频发送后,安卓端无法播放,迫不得已兼容将MOV视频转为MP4发送。 其中mov视频包括4K/24FPS、4K/30FPS、4K/60FPS、720p HD/30FPS、1080p HD/30FPS、1080p HD/60FPS! 使用AVAssetExportSessi…...
基于Esp32-cam在无外部 PIR 传感器情况下实现运动检测(一)
关于无需外部 PIR 传感器的 Esp32-cam 运动检测的世界最佳指南。从 A 到 Z 您需要了解的一切 无需外部 PIR 传感器的 Esp32-cam 运动检测一直是该网站上最热门的话题。 几个月来我付出了很大的努力来完善本指南,但它始终感觉不够好。 所以我继续工作。现在我感到很满足。 现在…...
安卓recovery流程分析(编译、界面、图片)
目录 recovery 界面菜单 recovery 界面操作 recovery 启动流程 recovery 编译makefile recovery 图片大小 ramdisk、boot.img、recovery.img之间的关系 authordaisy.skye的博客_CSDN博客-嵌入式,Qt,Linux领域博主 recovery 界面菜单 recovery 界面显示 android recoveryuse …...
唤醒手腕 2023年 B 站课程 Golang 语言详细教程笔记(更新中)
0001、1000集GO语言Flag毒誓 唤醒手腕UP猪Pig目标花费1000集进行讲解Go语言视频学习教程(有趣的灵魂,适合小白,不适合巨佬),从2023年3月19日开始,将会一直每天更新,准备在2024年5月1日之前更新…...
Qt获取屏幕(桌面)的大小或分辨率
Qt提供QDesktopWidget和QScreen两个类获取屏幕大小。Qt5开始,QDesktopWidget官方不建议使用,改为QScreen。Qt 6.0 及之后版本,QDesktopWidget 已从QtWidgets 模块中被彻底移除。 QDesktopWidget QDesktopWidget 提供了详细的位置信息&#…...
第4讲:vue内置命令(文本插值,属性绑定,v-text,v-html)
MVVM 什么是MVVM? MVVM是Model-View-ViewModel的简写。它本质上就是MVC 的改进版。MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。 View层: 视图层 在我们前端开发中,通常就是 DOM 层。 主要的作用是…...
vue实现自动生成路由,非手动创建,含避坑点
自动生成路由js文件:autoRouter.js let routeArr []; let baseUrl /components/settingManagement/; const content require.context(../components/settingManagement/, true, /\.vue$/); content.keys().forEach(e > {const path e.substring(e.indexOf(/…...
数据挖掘note(赵老师语录)
(一) 数据挖掘一般分为机器学习和统计学习,大数据学的课程一般是关于机器学习,我们学的浅,主要关于统计学习,示意图如下所示: 这是一个大数据时代,但是数据挖掘的利用率不足0.5%&am…...
秋招在线人才测评考什么内容?
又是一年招聘季,各大高校都会组织校园招聘,这次我们就来了解一下秋季校园招聘究竟考什么。近些年来校园秋招已经广泛采用在线测评,尤其各行业龙头大厂们,网申、在线测评、小组无领导讨论,一面二面......各类纷杂的面试…...
LeetCode算法二叉树—236. 二叉树的最近公共祖先
目录 236. 二叉树的最近公共祖先 代码: 运行结果: 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足…...
Qt事件处理
1. 事件 众所周知Qt是一个基于C的框架,主要用来开发带窗口的应用程序(不带窗口的也行,但不是主流)。我们使用的基于窗口的应用程序都是基于事件,其目的主要是用来实现回调(因为只有这样程序的效率才是最高…...
宝塔nginx搭建Ftp文件服务器
一:创建FTP 填入账号密码后,选择根目录,这个根目录就是nginx要代理的目录 二:配置nginx root的地址就是上面填的FTP根目录 三:http访问 服务器ip端口号加图片 例如我放了一个320.jp 我服务器ip是110.120.120.120 那…...
SAP和APS系统订单BOM核对(SAP配置BOM攻略九)
配置订单BOM因为要考虑历史ECN、特征语法、BOM语法,是最复杂的一个算法结果,为了摆脱这种被动的场景,博主开发了一个被动核对数据的程序来保障数据质量。 今天是APS系统上线的第三天,我们的核对程序在昨天上线,面对大量…...
和先锋影音和做的网站/青岛seo服务
dubbo provider抛出一个自定义异常,consuemer获取失败dubbo 源码有一个统一的异常处理策略public Result invoke(Invoker> invoker, Invocation invocation) throws RpcException {try {Result result invoker.invoke(invocation);if (result.hasException() &a…...
做电影网站考什么软件/app开发公司排名
Trie树的定义 Trie树,又称为前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的…...
制作wordpress插件/深圳网络营销和推广渠道
1.安装编译环境 2.上传源码包并解压 3.编译并安装 4.复制配置文件到 /etc目录下 5.开启Redis,默认在前端运行,效果如图 命令:redis-server /etc/redis.conf6.修改配置文件 /etc/redis.conf 以守护进程运行 将daemonize参数修改为yes 将…...
优秀网站开发/产品设计公司
1. 解压Oracle11.1.0.6 for win32,然后点击setup 2.选择高级安装,下一步 3.选择企业版,下一步 4.修改Oracle基目录,也可以是默认,下一步 5.将状态复选框打上√,下一步 6.为新安装的oracle创建数据库,选择创建数据库&am…...
软件搭建/宁波seo外包推广平台
class Solution:def maxSubArray(self, nums: [int]) -> int:res nums[0]res_max resfor num in nums[1:]:res num if res < 0 else res numres_max max(res_max, res)return res_max...
房屋装修网/北京seo推广
正如预期的一样,网络犯罪分子会利用Apple最新发表的iPhone 5s消息,几乎在苹果的新产品发表会同时,这个网络钓鱼(Phishing)信件开始流传。此次,趋势科技病毒防治中心 Trend Labs更深入发现,黑客利…...