你好 我是懂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一般发生的条件有以下几种:
- 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的测试精品文章
-
接口自动化相关面试题
-
测试工程师都能看懂的Redis 上
-
模拟面试之高级测试要具备的知识广度和深度
本文使用 文章同步助手 同步