Unit_2 -- 系统部署和维护
#Part_1
First:JVM 垃圾回收机制
01:JVM 内存结构
1.1:JVM 介绍
JVM 是 Java Virtual Machine(Java虚拟机)的缩写,JVM 是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的主流虚拟机;
1.2:运行时数据区
堆:存储对象实例;
方法区:存储类信息、静态变量、常量池、编译的代码;
虚拟机栈:局部变量表(基本数据类型的值)、对象(该对象的引用地址)
本地方法栈:为虚拟机执行 Native 方法服务;
程序计数器:每个线程都有一个独立的程序计数器,存储正在执行虚拟机指令地址。
1.3:堆内存结构
新生代:主要用来存放新生的对象。分为两大部分伊甸园(Eden)和幸存区(From Survior+To Survior);
老生代:主要存放应用程序中生命周期长的内存对象。新生区 GC 时部分对象可转入老生代;
永久代:常驻内存,用于存储 Java 运行时环境。例如 JDK 自带的 Class 与 Interface
02:JVM FULL GC 的危害和产生的原因
2.1:GC 模式
Minor GC:
年轻代 的 GC 事件。出现比较频繁,处理速度比较快
Major GC:
老年代 的 GC 事件。Major GC 速度比 Minor GC 慢 10倍
Full GC:
整个堆的 GC 事件,包含年轻代和老年代空间
2.2:GC 触发条件
Minor GC:当新生代 Eden 区满时,触发Minor GC;
Major GC:当老年代空间不足的时候会先触发一次 Major GC,如果之后空间还不足就触发Minor GC;
Full GC: 见下面
2.3:Full GC 触发条件
①:System.gc():建议 jvm 进行 Full GC ,不一定回立马执行。很多情况下它会触发 Full GC ,增加 GC 频率;
②:老生代空间不足:新生代有对象转入以及创建大对象、大数组时才会出现空间不足
③:永久代空间满了:当系统中要加载的类、反射的类和调用的方法较多时永久代的空间不足时
④:Minor GC 后进入老年代的大小大于老年代的可用内存;
⑤:新生代的 Eden 区、From Space 向 ToSpace 与老年代的可用内存都小于该对象的大小;
⑥:空间分配担保失败:使用复制算法的 Minor GC 需要老年代的内存空间作担保,如果出现了 HandlePromotionFailure 担保失败,则会触发 Full GC
2.4:Full GC 的危害
在发生 Full GC 的时候,意味着 JVM 会安全的暂停所有正在执行的线程(Stop The World),来回收内存空间,在这个时间内,所有除了回收垃圾的县城外,其他有关 Java 的程序、代码都会静止,反映到系统上,就会出现系统响应大幅度变慢,卡机等状态;
Full GC 出现的频率越高,系统的响应越慢。
03:JVM 各区各代的垃圾回收算法
介绍:
第一步:发现无用对象;
第二步:回收被无用对象占用的内存空间,使该空间可被程序再次使用;
JVM 分代采用不同的垃圾回收机制
3.1:引用计数法
在对象中添加一个引用计数器,每当有一个地方引用它时,计数器的值就加一;当引用失效时,计数器的值就减一。当某一时刻计数器的值为 零时,这个对象就不再使用;
①:每次赋值使用都需要维护引用计数值,本身也消耗性能;
②:循环引用比较难维护
*
*
JVM 一般不采用这种算法
3.2:可达性分析算法(根搜索算法,追溯性算法)
3.3:标记复制算法
将每次 GC 之后,将存活的对象复制到另一块区域,并进行对象的年龄计算
3.4:标记删除算法
遍历所有对象,将对象打上标记,没有活动的对象进行删除
3.5:标记整理算法(标记压缩)
很对对象是一直存活的,针对老年代,标记所有对象,针对活动对象进行压缩,删除边界之外的
3.6:垃圾回收器
垃圾回收器,实现垃圾回收算法进行垃圾回收。是垃圾回收算法的实际应用,一般一种垃圾回收期可能会用到多种垃圾回收算法
3.7:分类
串行垃圾回收器(Serial):
:一个线程进行垃圾回收,暂停所有用户线程
:ParNew 是 Serial 收集器的升级版
并行垃圾回收器(Parallet):
多个垃圾回收线程并行工作,此时的用户线程是暂停的
并发垃圾回收器(CMS)
:用户线程和垃圾收集线程同时进行,不需要停顿用户线程
G1 垃圾回收器:
:将堆内存分割成不同的区域然后并发进行垃圾回收
Second:JVM 调优
01:JVM 调优
1.1:调优的指标
调优的指标
吞吐量:单位时间内处理业务的数量;
RT:平均响应时间;
QPS(Query Per Second):一秒的时间内处理多少个请求
TPS(Transaction Per Second):每秒的事务数 =(系统同时处理的事务数)/ 平均响应时间;
内存占用:运行期间 Java 堆区所占的内存大小;
暂停时间:GC 垃圾收集时,线程的工作线程被暂停的时间;
1.2:调优的原则
02:JVM 关键启动参数
2.1:运行时数据区
2.2:启动参数分类
标准参数(-)
:指的是所有 JVM 通用的一些配置参数
:特征:所有的 JVM 实现都必须实现这些参数的功能,而且向后兼容
非标准参数(-X)
:指的是 JVM 底层的一些配置参数,可调整提高系统性能
:特征:不保证所有 JVM 都实现,不保证向后兼容性
非 stable 参数(-XX)
:此类参数各个 JVM 实现会有所不同,将来可能会随时取消,需要慎重使用
2.3:JVM 堆参数调整
-Xms:堆内存初始化的大小;
-Xmx:堆内存最大的大小;
-Xmn:堆内存新生代空间大小;
-Xss:线程堆栈空间大小。默认 1M
重点提示 : 老年代的大小 = 堆内存大小 - 新生代大小
2.4:JVM 常用的参数值
-Xms值
初始堆内存大小
-Xmx最大堆内存大小
-Xmm
新生代空间大小
1 核 2G1G1G500M2 核 4G2560M2560M1200M4 核 8G4G4G2G java后端必备java基础8 核 16G10G10G5G2.5:JVM 回收统计信息
-XX:+PrintGC : 打印简要 GC 日志
-XX:+PrintGCDetails : 打印详细的 GC 日志
2.6:JVM 关键启动参数
用法:
-
java -Xms4G -jar springBoot-0.0.1-SNAPSHOT.jar
-
-
-Xms4G 是指:JVM 启动时整个堆(包括年轻代、年老代)的初始化大小 4G
-Xmx4G 是指:JVM 启动时整个堆的最大值 4G
-Xmn2G 是指:年轻代的空间大小 2G ,剩下的是年老代的空间
03:JVM 内存查看以及分析工具
Jconsole 工具
目录:jdk安装目录下 bin -->jconsole.exe (Javajdk-21binjconsole.exe)
java 自带的 GUI 监视工具,可监控 Java 进程的堆内存、CPU、线程等综合信息
启动方式:
:jdk-21binjconsole.exe 找到目录文件,双击点开直接运行;
:cmd 命令,jconsole pid
注意事项:
:可监控本地 Java 进程,也可监控远程的 Java 进程
:pid 为 Java 进程 ID
Jmap 堆内存的使用、设置情况
Jstack
Eclipse Memory Analyzer
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.bianchenghao6.com/h6javajc/2847.html