测试工程师都能看懂的Jvm知识 中

200 阅读7分钟

你好 我是懂java的测试


前言

上篇文章只是介绍了一些jvm基础知识,反响还不错,本篇文章分享一些jvm稍微深入的东西。

还是老规矩,本文将以问答形式,由易到难,循序渐进讲述jvm相关的知识。不拽那些官方晦涩难懂的词语,只想用白话通俗的语言,力争让大家都能看懂jvm。

1、JVM中都有哪些常见的垃圾回收器?

主要分为以下几种:

Serial

回收新时代的回收器,Serial它是一种单线程收集器,不仅仅意味着它只会使用一个CPU或者一条收集线程去完成垃圾收集工作,更重要的是其在进行垃圾收集的时候需要暂停其他线程。

优点:简单高效,拥有很高的单线程收集效率

缺点:收集过程需要暂停所有线程

算法:复制算法

适用范围:新生代

Serial old

Serial Old收集器是Serial收集器的老年代版本,也是一个单线程收集器,不同的是采用"标记-整理算法",运行过程和Serial收集器一样

ParNew

可以把这个收集器理解为Serial收集器的多线程版本。

优点:在多CPU时,比Serial效率高。

缺点:收集过程暂停所有应用程序线程,单CPU时比Serial效率差。

算法:复制算法

适用范围:新生代

CMS

CMS是老年代的回收器,和ParNew一样,多线程版本,使用的是标记清楚算法,

但是它有下面 几个明显的缺点:

对CPU资源敏感(会和服务抢资源)、无法处理浮动垃圾、它使用的回收算法-“标记-清除”算法会导致收集结束时会有大量空间碎片产生。

G1

G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机 器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征.

2、"Stop the world"是什么玩意儿?

为了要让垃圾回收器专心致志的干工作,不能随便让我们写的Java系统继续对象了,所以此时JVM会在后台直接进入“Stop the World”状态。也就是说,他会直接停止我们写的Java系统的所有工作线程,让我们写的代码不再运行!

为什么这么玩?试想一下,别人刚通过“可达性算法”判断部分内存区域对象是可回收垃圾,这时候系统运行又创建了大量对象,别人又要重新判断哪些对象可回收,这还怎么进行垃圾回收?

3、Young Gc、Full Gc又是什么玩意?

Young Gc就是发生在新时代的垃圾回收,有些资料说Minor Gc,其实就Young Gc,Major Gc就是发生在老年代的垃圾回收,又称OldGc,Full Gc是发生在新时代、老年代、永久代等区域的垃圾回收,full就是全部的意思。不管是Young Gc、Full Gc还是其他Gc,都会造成 Stop the World 现象,都会导致系统卡顿,只是每个Gc造成的卡顿时间不同。

4、Young Gc、Old Gc什么时候触发?

Young Gc一般在新时代 Eden区满了之后就会采用复制算法,进行垃圾回收。

Old Gc一般发生的条件有以下几种:

  1. Young Gc后有一批对象回收不了,要进入老年代,但是老年代的内存空间放不下这么多对象,只能通过Old Gc来清理空间,来存放新时代过来的对象。

2)老年代空间使用率达到92%(可配置),也会触发Old Gc,

总之一句话,就是老年代没有足够的空间放置新对象了,所以得通过Old Gc 来回收对象。在很多 Jvm实现机制里,其实在上述条件达到以后,可能会触发FullGc,连同新时代、老年代、永久代一起给回收咯。

如果Full GC之后,老年代还是没有足够空间存放Minor GC过后的剩余存活对象,此时就会导致所谓的“OOM”内存溢出了。

5、自己动手模拟Young GC看看?

打开Idea 、新建一个类,输入以下代码

/**
 * @author zflv
 */
public class RocketMqTest {

    public static void main(String[] args) {
        //1m 1024*1024
        byte[] array = new byte[1024*1024];
        array=new byte[1024*1024];
        array=new byte[1024*1024];
        array=new byte[1024*1024];
        array = null;
        byte[] array1 = new byte[2*1024*1024];

    }

}

然后在截图所示区域

图片

填写以下配置:

-XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760  -XX:NewSize=5242880  -XX:Ma
xNewSize=5242880 -XX:+PrintGCTimeStamps -XX:+PrintGCDetails -Xloggc:gc.log

然后运行main 方法,会在项目中生成GC.log,如下所示

Java HotSpot(TM) 64-Bit Server VM (25.211-b12) for windows-amd64 JRE (1.
8.0_211-b12), built on Apr  1 2019 20:53:26 by "java_re" with MS VC++ 10.0 (VS2010)
Memory: 4k page, physical 8133460k(1586644k free), swap 33299284k(15627288k free)
CommandLine flags: -XX:InitialHeapSize=10485760 -XX:MaxHeapSize=10485760 -XX:MaxNewSize=5242880 -XX:NewSize=5242880 -XX:+PrintGC -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC 
0.804: [GC (Allocation Failure) [PSYoungGen: 3984K->504K(4608K)] 3984K->2094K(9728K), 0.0034707 secs] [Times: user=0.05 sys=0.00, real=0.00 secs] 
Heap
 PSYoungGen      total 4608K, used 3727K [0x00000000ffb00000, 0x0000000100000000, 0x0000000100000000)
  eden space 4096K, 78% used [0x00000000ffb00000,0x00000000ffe25c98,0x00000000fff00000)
  from space 512K, 98% used [0x00000000fff00000,0x00000000fff7e010,0x00000000fff80000)
  to   space 512K, 0% used [0x00000000fff80000,0x00000000fff80000,0x0000000100000000)
 ParOldGen       total 5120K, used 3638K [0x00000000ff600000, 0x00000000ffb00000, 0x00000000ffb00000)
  object space 5120K, 71% used [0x00000000ff600000,0x00000000ff98db10,0x00000000ffb00000)
 Metaspace       used 3177K, capacity 4496K, committed 4864K, reserved 1056768K
  class space    used 347K, capacity 388K, committed 512K, reserved 1048576K

是不是很懵逼?没关系下期文章我会着重介绍这些打印的日志,并且会详细分享Jvm调优方式。

新开了java测试开发交流群,喜欢的可加入,若失效,可加我微信lvceshikaifa,拉你进群。

图片

关注公众号,测试干货及时送达图片

懂Java的测试

软件测试技术分享,包括功能、自动化、性能、测试开发等,简历指点、面试助攻等

17篇原创内容

公众号

懂Java的测试精品文章

 

本文使用 文章同步助手 同步