IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> JVM调优 理论篇 -> 正文阅读

[开发工具]JVM调优 理论篇

主要这几个方面理解

内存结构、类加载机制、编译器优化、垃圾收集算法、垃圾收集器

一、内存结构

?

?

?二、类加载机制

1、编译生成class文件? ?javac 文件名 或 idea工具编译

2、加载

读取类的二进制流

转为方法区数据结构,并存放到方法区

在java堆中产生Java.lang.class对象

3、链接(验证、准备、解析)

验证:1.验证class文件是否符合规范

? ? ? ? ? ? ? 文件格式的验证(是否以0XCAFEBABE开头、版本号是否合理)可16进制打开查看

? ? ? ? ? ?2.元数据验证(是否有父类、是否继承了final类,不可继承、非抽象类实现了所有抽象? ? ? ? ? ? ? ? 方法)

? ? ? ? ? ?3.字节码验证(运行检查、栈数据类型呵操作码操作参数吻合、跳转指令指向合理的? ? ? ? ? ? ? ? 位置)

? ? ? ? ? ?4.符号引用验证(常量池中描述类是否存在、访问的方法或字段是否存在且有足够的? ? ? ? ? ? ? ? 权限)若确认无错可在代码启动时添加参数关闭验证-Xverify:none加快启动速度

准备:为类的静态变量分配内存,初始化为系统的初始值

解析:符号引用转换为直接引用

?4、初始化

?

5、使用

6、卸载

三、编译器优化

首先字节码运行两种方式:

1.解释执行:由解释器一行一行翻译执行(优势在于没有编译的等待时间,性能相对差一些)

2.编译执行:把字节码编译成机器码,直接执行机器码(运行效率高一点,一般认为比解释执行快一个数量级;带来额外开销)

如何查看代码执行方式:运行java -version命令查看最后输出

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?"mixed mode"为混合模式(部分解释,部分编译执行)

设置

java -Xint -version:设置jvm的执行模式为解释执行模式 "interpreted mode"

java -Xcomp -version:JVM优先以编译模式"compiled mode"运行,不能编译的,以解释模式运行

java -Xmixed?-version:以混合模式运行

Hotspot有两个即时编译器C1、C2

?

?查找热点代码(使用计数器)

1.方法调用计数器? ?2.回边计数器

即时编辑器调优—方法内联?

四、垃圾收集算法

?对象在什么时候能够被回收?通过什么方式判断回收

1.引用计数法(会有循环引用的bug,不采取这种方式)

2.可达性分析(根对象出发,不可达的对象进行回收,也不一定就回收)如下:

注意:慎用finalize()方法

? ? ?1.避免使用finalize()方法,操作不当可能导致对象永远无法被回收

? ? ?2.finalize()优先级低,何时会被调用无法确定,因为什么时间发生GC不确定

? ? ?3.建议使用try....catch.....finally来代替finalize()方法

?垃圾回收算法

1.标记-清除(清除后存在内存碎片)

2.标记-整理(标记需回收的对象,把所有存活的对象压缩到内存的一端,清理掉边界外的所有空间)

3.复制清除(把内存分为两块,每次使用一块;将正在使用的内存中的存活对象复制到未使用的内存中去,然后清除掉正在使用内存中的所有对象;交换两个内存角色,等待下次回收)

总结:三种基础垃圾回收算法对比

另外还有两种综合垃圾回收算法:分代收集算法、增量算法

4.分代收集算法

对象分配:一般初始分配到伊甸园,在存活区进行复制调整,一定条件后分配到老年代;对象大于-XX:PretenureSizeThreshold就回直接分配到老年代;新生代空间不够也会直接分配到老年代

分代收集算法好处:更有效的清除不再需要的对象;提升垃圾回收的效率

分代收集算法调优原则:合理设置Survivor区域的大小,避免内存浪费;让GC尽量发生在新生代,尽量减少Full GC的发生;参数调整如下:

垃圾回收条件

新生代(Minor GC)垃圾回收条件:伊甸园空间不足

老年代(Full GC)垃圾回收条件:老年代空间不足;元空间不足;要晋升到老年代的对象所占用的空间大于老年代的剩余空间;显示调用System.gc(),-XX:+DisableExplicitGC参数,可以忽略System.gc()调用

5.增量算法?

五、垃圾收集器

先了解一下术语

Stop The World:简写STW,也叫全局停顿,java代码停止运行,native代码继续运行,但不能? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 与jvm进行交互。? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?原因:多半由于垃圾回收导致,也可能由Dump线程/死锁检查/Dump堆等导致。? ? ? ? ? ? ? ? ? ? ? ? ? ? ?危害:服务停止,没有响应;主从切换,危害生产环境。

并行收集:多个垃圾收集线程并行工作,收集过程中用户业务线程处于等待状态

并发收集:指用户线程与垃圾收集线程同时工作

吞吐量:CPU用于运行用户代码的时间与CPU总消耗时间的比值? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 公式:运行用户代码时间 / (运行用户代码时间 + 垃圾收集时间)

垃圾收集算法:为实现垃圾回收提供理论支持

垃圾收集器:利用垃圾收集算法,实现垃圾回收的实现落地(不同垃圾收集器可配合使用)

主流垃圾收集器及作用内存区域如下:(连线表示可配合使用)

1.Serial收集器(串行收集器):单线程;适用客户端程序或单核机器上,默认使用Serial

? ? 采用复制清理算法,线程->暂停线程进行gc回收->线程运行

2.ParNew收集器:Serial收集器的多线程版本,主要和CMS收集器配合使用

? ?可使用-XX:ParallelGCThreads设置垃圾收集器的线程数(一般设置为CPU的核心数)

3.Parallel Scavenge收集器:也叫吞吐量优先收集器;采用复制算法;并行多线程

可控制吞吐量:-XX:MaxGCPauseMillis:尽力控制最大的垃圾收集停顿时间

? ? ? ? ? ? ? ? ? ?-XX:GCTimeRatio:设置吞吐量的大小,取值0-100,系统花费不超过1/(1+n)的时? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?间用于垃圾收集

自适应GC策略:可用-XX:+UseAdptiveSizePolicy打开

? ? ? ? ? ? ? ? ? ? 打开自适应策略后,无需手动设置新生代的大小(-Xmn)、Eden与Survivor区的? ? ? ? ? ? ? ? ? ? ? ? 比例(-XX:SurvivorRatio)等参数

? ? ? ? ? ? ? ? ? ? 虚拟机会自动根据系统的运行状况收集性能监控信息,动态的调整这些参数,? ? ? ? ? ? ? ? ? ? ? ? 从而达到最优的停顿时间以及最高的吞吐量

4.Serial Old收集器:老年代的Serial收集器,不同的是采用标记整理算法

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 可配合新生代垃圾收集器(Serial、ParNew、Parallel Scavenge)一同? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 使用,CMS收集器故障时会用Servial Old作为后备

5.Parallel Old收集器:只能和Parallel Scavenge配合使用,适用关注吞吐量的场景

6.CMS收集器:并发收集器,采用标记-清除算法

? ? ? ? ? ? ? ?特点:Stop The World的时间比较短;大多过程并发执行

? ? ? ? ? ? ? ? ? ? ? ? ? CPU资源敏感,并发阶段可能导致应用吞吐量降低;无法处理浮动垃圾;

? ? ? ? ? ? ? ? ? ? ? ? ? 不能等到老年代几乎满了才开始收集,因此预留内存不够了需用Serial Old? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 作为后备,会导致STW时间加长;可使用CMSInitiatingOccupancyFraction? ? ? ? ? ? ? ? ? ? ? ? ? ? 设置老年代占比达到多少就触发垃圾收集,默认是68%;

? ? ? ? ? ? ? ? ? ? ? ? ? 标记清除导致内存碎片的产生,设置UseCMSCompactAtFullCollection在完? ? ? ? ? ? ? ? ? ? ? ? ? ? 成Full GC后是否要进行内存碎片整理(默认开启),? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 还可设置CMSFullGCsBeforeCompaction进行几次Full GC后进行一次内存? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 碎片整理(默认0)

? ? ? ? ? ? ? ?适用于希望系统停顿时间短,响应速度快的场景,比如各种服务器的应用程序。

7.G1收集器(采用复制清理算法)

? ?减少Full GC的思路:增加预留内存(增大-XX:G1ReservePercent,默认为堆的10%)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?更早的回收垃圾(减少-XX:InitiatingHeapOccupancyPercent,老年代? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?达到该值就触发Mixed GC,默认45%)

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?增加并发阶段使用的线程数(增大-XX:ConcGCThreads),对应用吞? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?吐量有影响

? ?特点:可以作用在整个堆;可控停顿时间(MaxGCPauseMillis=200);无内存碎片问题

? ?适用场景:占用内存较大的应用(6G以上);替换CMS垃圾收集器

? ?总结:内存划分为Region;回收包括YoungGC/MixedGC/FullGC;与CMS有类似又不同

G1 OR CMS?

如何选择垃圾收集器?要从以下几个方面考虑

1.系统瓶颈的主要矛盾点是什么?(吞吐量或低延迟响应速度还是其他)

2.服务器基础设施限制、JDK版本等

JDK参数参考链接:VM Options Explorer - OpenJDK11 HotSpot

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-21 21:12:07  更:2022-03-21 21:13:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:47:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码