写点什么

9.3JVM 垃圾回收性能分析

用户头像
张荣召
关注
发布于: 2020 年 11 月 22 日

1.JVM 的垃圾回收

JVM 垃圾回收就是将 JVM 堆中的不再被使用的对象清理掉,释放宝贵的内存资源。


JVM 通过一种可达性分析算法进行垃圾对象的识别,具体过程是:从线程栈帧中的局部变量,或者是方法区的静态变量出发,将这些变量引用的对象进行标记,然后看这些被标记的对象是否应用了其他的对象,继续进行标记,所有被标记过的对象都是被使用的对象,而那些没有被标记的对象就是可回收的垃圾对象。


标记完后,JVM 就会对垃圾对象占用的内存进行回收,回收主要有三种方法:

  • 清理:将垃圾对象占据的内存清理掉,其实 JVM 并不会真的讲这些垃圾内存进行清理,而是将这些垃圾对象占用的内存标记为空闲,

                     记录再一个空闲列表中,当应用程序需要创建新的对象的时候,就从空闲列表中找一段空闲内存分配给这个新对象。(缺点:多次垃圾回收后,内存碎片增多,不利于大块内存分配)

  • 压缩:从堆空间的头部开始,将存活的对象拷贝放在一段连续的内存空间中,那么其余的空间就是连续的空闲空间。(减少内存碎片)

  • 复制:将堆空间分成两部分,只在其中一部分创建对象,当这个部分空间用完的时候,将标记过的可用对象复制到另一个空间中。

2.JVM 分代垃圾回收

解析:方法调用完毕,栈帧出栈,引用被销毁,对象失去引用,变为垃圾对象,可以回收----对象生存期:仅仅是方法内部的生存时间---生存周期比较短==>把短生命周期的对象,放到较小的区域中==>快速垃圾回收。(扫描空间小,对象回收更快,效率更高)

           ==>分代回收。

           Yong GC:

           Full    GC:

3.JVM 垃圾器回收算法


4.G1 垃圾回收内存管理机制


特点:分成更多的小块区域,针对小块内存区回收垃圾,效率更高,占用的资源更少。对用户程序的影响更小。可管理的内存空间更大。

当前比较主流的垃圾回收器。

有一个参数:STW(Stop-The-World):期望停顿时间。这是一个参考值。

E=====Eden(伊甸园区)

S=====Survivor(From)

O=====Old(To)

H=====Humongous(大内存区)

5.JVM 启动参数

标准参数:所有 JVM 实现都必须实现这些参数的功能,而且向后兼容。

  • 运行模式  -server,-client

  • 类加载路径 -cp,-classpath

  • 运行调试 -verbose

  • 系统变量 -D

非标准参数:默认 JVM 实现这些参数,但不保证所有 JVM 实现都实现,且不保证向后兼容

  • -Xms  初始堆大小---memory  size

  • -Xmx 最大堆大小----memory  max

  • -Xmn 新生代大小----memeory new

  • -Xss 线程堆栈大小---stack size

 非 Stable 参数,此类参数各个 JVM 实现又有所不同,将来可能会随时取消

  • -XX: -UserConcMarkSweep 启用 GC   CMS

6.JVM 性能诊断工具

基本工具:JPS,JSTAT,JMAP,JSTACK

集成工具:JConsole,JVisualVM

7.JPS

JPS:JPS 用来查看 Host 上运行的所有 JAVA 进程的 pid(JvmId),一般情况下使用这个工具的目的:只是为了找出运行 JVM 进程 ID,及 jvmid,然后可以进一步使用其他的工具来监控和分析 JVM。

常用的几个参数:

  • -I   输出 Java 应用程序的 main class 的完整包

  • -q 仅显示 pid,不显示其他任何相关信息

  • -m 输出传递给 main 方法的参数

  • -v 输出传递给 JVM 的参数。在诊断 JVM 相关问题的时候,这个参数可以查看 JVM 相关参数的值。

8.JSTAT

JSTAT("Java Virtual Machine statistics monitoring tool")是 JDK 自带的轻量级小工具。主要对 Java 应用程序的资源和性能进行实时的命令行的监控,包括了对 Heap Size 和垃圾回收状况的监控。

语法结构如下:jstat [Options] vmid [interval] [count]

  • Options --选项,我们一般使用 -gcutil 查看 gc 情况

  • vmid --vm 的进程号,即当前运行的 Java 进程号

  • interval--间隔时间,单位为毫秒

  • count --打印次数,如果缺省,则打印无数次。


       S0-------Heap 上的 Survivor space 0 区已使用空间的百分比

       S1-------Heap 上的 Survivor space 1 区已使用空间的百分比

       E---------Heap 上的 Eden space 区已使用空间的百分比

       O--------Heap 上的 Old space 区已使用空间的百分比

       YGC-----从应用程序启动到采样时时发生 Young GC 的次数

       YGCT----从应用程序启动到采样时发生 Young GC 所用的时间(单位秒)

       FGC-----从应用程序启动到采样时发生 Full GC 的次数       

       FGCT----从应用程序启动到采样时发生 Full GC 所用的时间(单位秒)

       GCT-----从应用程序启动到采样时用于垃圾回收的总时间(单位秒)

9.JMAP

      JMAP 是一个可以输出内存中所有对象的工具,甚至可以将 VM 中国的 heap,以二进制输出成文本。

      使用方法: 

  • jmap -histo pid>a.log 可以将其保存到文本中去,在一段时间后,使用文本对比工具,可以对比出 GC 回收了了哪些对象。

  • jmap -dump:format=b,file=f1 PID 可以将该 PID 进程的内存 heap 输出出来到 f1 文件中。

10.jstack

      jstack 可以查看 JVM 内的线程堆栈信息。

11.JConsole

      可视化


12.JVisualVM

     可视化


用户头像

张荣召

关注

还未添加个人签名 2018.05.02 加入

还未添加个人简介

评论

发布
暂无评论
9.3JVM垃圾回收性能分析