Java GC调优(上)

简介

 图1 

 

 Java-HotSpot是什么?

虚拟机(JVM)版本是25.4-b25

java -version出来信息包含两部分:
Java软件包发行版本信息和内核(JVM)版本信息。

java的发行包包含三种类型Java ME,Java SE,Java EE,发行包就相当于对外销售的产品包,
不同发行包会删减部分特性,因此版本信息首先显示发行包类型和版本。

JVM是Java平台的基础和核心,一般在一个java大版本中JVM版本变化都是比较小的。
HotSpot是一种JVM实现技术,相对以往的方式在性能和扩展能力上得到了很大的提升,因此它不是一个独立产品,可以理解Sun(Oracle)实现的JVM版本的品牌商标。

1.JVM体系结构 

   

 方法区和堆是GC的作用区。

2.常用的GC算法

   1).引用计数算法(Reference Counting GC)简称 直接垃圾回收

      图1:

  

          缺点:

           1.每次对象赋值,都要对计算器做维护,而且计算器有一定的消耗。

           2.循环引用,无法收回,且并不能判断它们是否死亡

        注:JVM并不采用此种方式。

    2).追踪(Tracing GC ) 简称 间接垃圾收集

  1. 标记-清除 (Mark-Sweep)
  2. 标记-复制 (Mark-Copying)
  3. 标记-整理  (Mark-Compact)

     图2:

 

标记清除(Mark Sweep)

    原理:

        1.标记  从root开始进行扫描,对存活的对象进行标记。

            

         2.清除

                扫描整个内存空间,回收未标记的对象,使用free-list记录可用区域。

              

              会产生大量不连续的碎片空间,需要进行两次的扫描,耗时严重。不需要额外的内存空间。

标记复制(Mark-Copying)

   原理:从跟(GC Root)集合开始,通过Traceing从from找存活的对象,拷贝到to中。

             from、to身份交换,下面从to中分配开始:

  

         没有标记和清除,效率高。

         没有内存碎片,可以利用bump-the-pointer(指针碰撞)实现快速内存分配。

标记整理 (Mark-Compact)

  原理

       标记

           与标记-清除一样

             

       整理(压缩)

           

          没有内存碎片,可以利用bump-the-pointer实现快速内存分配。

          移动成本高

标记-清除-整理

  原理:

        Mark-sweep与Mark-compact结合

        和Mark-sweep一样,当进行多次GC后,再进行compact 减少移动队形的成本。

3.HotSpot 内存管理

不同的对象不同的生命周期不一样,98%以上都是临时的对象。

根据各代特点应用不同的GC算法,提高效率

GC回收类型

部分收集

  • Mintor GC/Young GC   回收新生代的GC
  • Magjor GC/Old GC       回收老年代的GC   (目前只有CMS收集器会有单独收集老年代的行为)
  • Mixed GC/Young GC and other Old GC  (目前只有G1收集器有这种行为)

整堆收集

  • Full GC :收集整个Java堆和方法区的垃圾收集。(永久代,新生代,旧生代三者)

新生代

  •  有Eden区和Survivor区,默认比列8:1. Survivor分为from/to (so/s1),to总为空。
  • 一般在Eden区分配对象,优化:本地线程分配缓冲 TLAB(Thread Local Allocation Buffer)
  • 保存80%-90%生命周期较短的对象,GC频率高,采用效率较高的复制算法。

旧生代 

存放着多次经历GC存活的对象;

新创建的大对象有可能直接进入旧生代(老年代),具体要看GC的实现

GC频率相对较低,标记-清除-整理各种结合和优化。

Java GC调优(下)

发布了121 篇原创文章 · 获赞 60 · 访问量 36万+

猜你喜欢

转载自blog.csdn.net/sdmxdzb/article/details/104166796
今日推荐