论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
DevOps与敏捷开发
›
浅谈JVM整体架构与调优参数
浅谈JVM整体架构与调优参数
瑞星
金牌会员
|
2024-5-16 05:52:16
|
显示全部楼层
|
阅读模式
楼主
主题
637
|
帖子
637
|
积分
1911
本文分享自华为云社区《
【性能优化】JVM整体架构与调优参数说明
》,作者: 冰 河。
JVM的分类
这里,我们先来说说什么是VM吧,VM的中文含义为:假造机,指的是使用软件的方式模拟具有完整硬件系统功能、运行在一个完全隔离环境中的完整计算机系统,是物理机的软件实现。
常用的假造机有:VMWare、Virtual Box,Java Virtual Machine(JVM,Java假造机)。
这里,我们重点聊的就是JVM,Java假造机。看下图。
这张图看起来还是比较简朴的,JVM运行于操作系统之上,操作系统是运行在计算机硬件上的。
关于JVM,其实有很多大厂开发了不同版本的JVM,比较着名的有:Sun HotSpot VM、BEA JRockit VM、IBM J9 VM、 Azul VM、 Apache Harmony、 Google Dalvik VM、 Microsoft JVM等等。
现在使用的比较多的JDK8版本就是Sun HotSpot VM与BEA JRockit VM合并之后开发出的JDK版本。
JVM的构成
JVM主要由三个子系统构成,分别为:类加载器子系统、运行时数据区(内存布局)和字节码执行引擎。
为了更好的明白JVM,我们来看一下JVM的全貌图。
当我们开发Java步伐时,首先会编写.java文件,之后,会将.java文件编译成.class文件。
JVM中,会通过类装载子系统将.class文件的内容装载到JVM的运行时数据区,而JVM的运行时数据区又会分为:方法区、堆、栈、本地方法栈和步伐计数器 几个部分。
在装载class文件的内容时,会将class文件的内容拆分为几个部分,分别装载到JVM运行时数据区的几个部分。此中,值得留意的是:步伐计数器的作用是:记录步伐执行的下一条指令的地址。
方法区也叫作元空间,主要包含了:运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应的Class实例的引用等信息。
在JVM中,步伐的执行是通过执行引擎进行的,执行引擎会调用本地方法的接口来执行本地方法库,进而完成整个步伐逻辑的执行。
我们常说的垃圾网络器是包含在执行引擎中的,在步伐的运行过程中,执行引擎会开启垃圾网络器,并在后台运行,垃圾网络器会不断监控步伐运行过程中产生的内存垃圾信息,并根据相应的计谋对垃圾信息进行清算。
这里,大家需要留意的是:栈、本地方法栈和步伐计数器是每个线程运行时独占的,而方法区和堆是所有线程共享的。所以,栈、本地方法栈和步伐计数器不会涉及线程安全题目,而方法区和堆会涉及线程安全题目。
方法区(元空间)
很多小伙伴一看到方法区三个字,脑海中的第一印象可能是存储方法的地方吧。
实则不然,方法区的另一个名字叫作元空间,信赖不少小伙伴或多或少的听说过元空间。这个区域是JDK1.8中划分出来的。主要包含:运行时常量池、类型信息、字段信息、方法信息、类加载器的引用、对应的Class实例的引用等信息。方法区中的信息可以大概被多个线程共享。
比方,在步伐中声明的常量、静态变量和有关于类的信息等的引用,都会存放在方法区,而这些引用所指向的具体对象 一般都会在堆中开辟单独的空间进行存储,也可能会在直接内存中进行存储。
堆
堆中主要存储的是实际创建的对象,也就是会存储通过new关键字创建的对象,堆中的对象可以大概被多个线程共享。堆中的数据不需要事先明白生存期,可以动态的分配内存,不再使用的数据和对象由JVM中的GC机制自动回收。对JVM的性能调优一般就是对堆内存的调优。
Java中基本类型的包装类:Byte、Short、Integer、Long、Float、Double、Boolean、Character类型的数据是存储在堆中的。
堆一般会被分成年轻代和老年代。而年轻代又会被进一步分为1个Eden区和2个Survivor区。在内存分配上,如果保持默认设置的话,年轻代和老年代的内存大小比例为1 : 2,年轻代中的1个Eden区和2个Survivor区的内存大小比例为:8 : 1 : 1。
栈
栈一般又叫作线程栈或假造机栈,一般存储的是局部变量。在Java中,每个线程都会有一个单独的栈区,每个栈中的元素都是私有的,不会被其他的栈所访问。栈中的数据大小和生存期都是确定的,存取速度比较快。
在Java中,所有的基本数据类型(byte、short、int、long、float、double、boolean、char)和引用变量(对象引用)都是在栈中的。一般情况下,线程退出或者方法退出时,栈中的数据会被自动清除。
步伐在执行过程中,会在栈中为不同的方法创建不同的栈帧,在栈帧中又包含了:局部变量表、操作数栈、动态链接和方法出口。
关于局部变量表、操作数栈、动态链接和方法出口的具体作用,会在《
架构师进阶系列
》中的后续文章中详细阐述。
栈中一般会存储对象的引用,这些引用所指向的具体对象一般都会在堆中开辟单独的地址空间进行存储,也有可能存储在直接内存中。
留意: 这里说的是这些引用所指向的具体对象一般都会在堆中开辟单独的地址空间进行存储,也有可能存储在直接内存中。
因为在JVM中,如果开启了逃逸分析和标量替换,则可能不会再在堆上创建对象,可能会将对象直接分配到栈上,也可能不再创建对象,而是进一步分解对象中的成员变量,将其直接在栈上分配空间并赋值。
本地方法栈
本地方法栈相对来说比较简朴,就是保存native方法进入区域的地址。
比方,在Java中创建线程,调用Thread对象的start()方法时,会通过本地方法start0()调用操作系统创建线程的方法。此时,本地方法栈就会保存start0()方法进入区域的内存地址。
步伐计数器
步伐计数器也叫作PC计数器,只要存储的是下一条将要执行的下令的地址。
JVM调优参数
在JVM中,主要是对堆(新生代)、方法区和栈进行性能调优。各个区域的调优参数如下所示。
堆:-Xms、-Xmx
新生代:-Xmn
方法区(元空间):-XX:MetaspaceSize、-XX:MaxMetaspaceSize
栈(线程):-Xss
为了更加直观的表述,我们可以将JVM的内存区域和对应的调优参数总结成下图所示。
在设置JVM启动参数时,需要特殊留意方法区(元空间)的参数设置。
关于方法区(元空间)的JVM参数主要有两个:-XX:MetaspaceSize和-XX:MaxMetaspaceSize。
-XX:MetaspaceSize: 指的是方法区(元空间)触发Full GC的初始内存大小(方法区没有固定的初始内存大小),以字节为单元,默认为21M。达到设置的值时,会触发Full GC,同时垃圾网络器会对这个值进行修改。
如果在发生Full GC时,回收了大量内存空间,则垃圾网络器会适当低落此值的大小;如果在发生Full GC时,开释的空间比较少,则在不超过设置的-XX:MetaspaceSize值或者在没设置-XX:MetaspaceSize的值时不超过21M,适当提高此值。
-XX:MaxMetaspaceSize: 指的是方法区(元空间)的最大值,默认值为-1,不受堆内存大小限制,此时,只会受限于本地内存大小。
末了需要留意的是: 调整方法区(元空间)的大小会发生Full GC,这种操作的代价是非常昂贵的。如果发现应用在启动的时候发生了Full GC,则很有可能是方法区(元空间)的大小被动态调整了。
所以,为了只管不让JVM动态调整方法区(元空间)的大小造成频繁的Full GC,一般将-XX:MetaspaceSize和-XX:MaxMetaspaceSize设置成一样的值。比方,物理内存8G,可以将这两个值设置为256M
末了,我们一起看下在物理内存8G的情况下,启动应用步伐时,可以设置的JVM参数。当然,我这里给出的是一些经验值,实际摆设到生产环境时,需要经过压测找到最佳的参数值。
启动SpringBoot
java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar xxx.jar
复制代码
启动Tomcat(Linux)
在Tomcat bin目次下catalina.sh文件里设置。
‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M
复制代码
启动Tomcat(Windows)
在Tomcat bin目次下catalina.bat文件里设置。
‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M
复制代码
总结
本日,我们一起学习了JVM的整体架构和调优参数,主要包括:JVM的总体布局、JVM的分类、JVM的构成和调优参数。你学会了吗?欢迎在文末留言说出你的想法,如果你有更好的见解,也可以在文末留言和大家交流。
点击关注,第一时间相识华为云新鲜技能~
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
瑞星
金牌会员
这个人很懒什么都没写!
楼主热帖
复习一下Linux常用命令,孰能生巧~ ...
OpenSSL RSA相关基本接口和编程示例 ...
适用于顺序磁盘访问的1分钟法则 ...
执行计划缓存,Prepared Statement性能 ...
内网安全-横向移动(1)
使用 Power Shell 修改 Hyper-V 虚拟机 ...
Java-泛型机制详解
「MySQL高级篇」explain分析SQL,索引 ...
读高性能MySQL(第4版)笔记14_备份与 ...
Oracle实现金额小写转大写函数 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表