JVM调优 理论篇

8 篇文章 0 订阅
5 篇文章 0 订阅

主要这几个方面理解

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

一、内存结构

 

 

 二、类加载机制

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值