G1

作者: 夜雨声眠 | 来源:发表于2018-06-10 11:25 被阅读0次

G1 垃圾收集器

Java 技术和 JVM 概览


Java

    1995年Sun公司发布了一门编程语言——Java。Java广泛应用与基础软件、游戏以及商业软件中。Java运行在超过8亿5千万的私人设备上,包括移动终端、私人电脑和服务器。
Java是一门面向对象的编程语言,有以下几个特点:

  • 平台独立。Java程序代码被编译为字节码并存储在class文件中,由JVM加载class文件来运行。
  • 面向对象。
  • 自动垃圾收集。在C/C++语言中,开发者既是权利至高无上的上帝,又是最苦逼的奴隶。开发者能够利用指针直接操作内存,但是同时也要记得回收/释放这块内存,否则就会造成内存泄漏。
  • 功能丰富的标准库。

Java 运行环境(Java Runtime Environment)

JRE包含JVM(java虚拟机 Java Virtual Machine )以及java平台核心类库和支持文件。


Java Development kit

Java Development kit(JDK)是用于开发JAVA程序的一系列工具的集合。利用JDK,开发者不仅可以将Java程序编译后放在JVM中运行,也可以将JAVA应用程序打包和发布。

Java Virtual Machine

Java Virtual Machine(Java虚拟机,JVM)是一个抽象的操作系统。JAVA程序运行在JVM中,JVM屏蔽了不同操作系统底层接口的差异性,提供统一的接口和类库给JAVA程序,从而实现了JAVA语言的平台独立特性。
JAVA虚拟机对JAVA编程语言一无所知,它只认识字节码(准确的说,只认识class文件。Class文件中包括Java虚拟机指令,符号表以及其他的辅助信息)。换句话说,完全可以用其他语言来编写程序,只要有一个工具将语言翻译为字节码即可。
JVM拥有非常完善的体系架构,能够让它支持许多强大的基础特性,并实现了高性能和可大规模扩展的能力。以目前主流的JVM——HotSpot来说,
HotSpot中的JIT(Just In Time)编译器在发现某个方法或者代码块调用特别频繁的时候,会将这些代码认定为“热点代码(HotSpot Code)”,为了提高热点代码的运行效率,在运行时,HotSpot虚拟机将这些代码编译为与平台相关的机器码,并进行各个层次的优化,从而极大的提升整个软件的运行效率(据说在某些场景中,优化后的代码块运行速度甚至可以超过C++或者C)。

Slide1.PNG

HotSpot虚拟机的三个关键组件是:

  • Heap(堆),Heap是存放对象和数组的内存区域,它是垃圾收集器的重点回收目标。大多数的优化手段都是调整堆大小以及选择合适的垃圾收集器
  • JIT编译器,负责将机器码转化为操作系统原生指令。
  • Garbage Collector,垃圾收集器,负责回收内存。

性能优化的基本目标

一般来说,优化JAVA程序的目标分为两种:

  • 响应时间
  • 吞吐量

响应时间

响应时间代表应用程序多快能做成响应,例如:

. UI程序对一个事件(如点击一个按钮)的响应速度;
. 网站返回请求网页的速度
. 数据库查询的执行时间

以上这些场景,长时间的等待无疑会导致是不可接受的。

吞吐量

吞吐量代表应用程序在单位时间内处理的任务数量最大值。例如:

. 单位时间内的事务完成数量。
. 一小时内程序处理的任务数。
. 一小时内数据库能完成的查询数量。

在此种场景下,较长的暂停时间是可接受的,重点是要完成更多的任务。


回顾一下JVM GC

GC的作用就是回收内存。优化GC的收集效率,减少内存碎片,减少停顿(STW:Stop The World)是GC开发团队的永恒目标。

串行收集器(Serial 以及 Serial Old)

-XX:+SerialGC

串行收集器采用单线程STW的方式来回收内存空间。
当内存不足的时候,串行GC设置停顿表示,等所有线程都进入安全点后,应用线程全都暂停,GC开始工作,回收并整理空间。
显然,串行收集器非常适合与堆内存不大,单核甚至双核的应用程序中,这样的应用程序往往是客户端程序。

并行收集器(Parallel Scavenge + Parallel Old)

-XX:+UseParallelGC 或者


G1 垃圾收集器

使用方法

-XX:+UseG1GC -Xmx32g -XX:MaxGCPauseMillis=200

其中-XX:+UseG1GC为开启G1垃圾收集器,-Xmx32g 设计堆内存的最大内存为32G,-XX:MaxGCPauseMillis=200设置GC的最大暂停时间为200ms。如果我们需要调优,在内存大小一定的情况下,我们只需要修改最大暂停时间即可。

介绍G1垃圾收集器

The Garbage-First (G1) collector is a server-style garbage collector, targeted for multi-processor machines with large memories. It meets garbage collection (GC) pause time goals with a high probability, while achieving high throughput. The G1 garbage collector is fully supported in Oracle JDK 7 update 4 and later releases. The G1 collector is designed for applications that:

  • Can operate concurrently with applications threads like the CMS collector.
  • Compact free space without lengthy GC induced pause times.
  • Need more predictable GC pause durations.
  • Do not want to sacrifice a lot of throughput performance.
  • Do not require a much larger Java heap.

垃圾收集器是个适用于使用多线程,大内存的服务端的垃圾收集器。它大概率降低垃圾收集的暂停时间,从而提升整体吞吐量。如果应用程序具有如下特点,就可以尝试使用G1来优化。

  • 如同CMS垃圾收集器一般,使用多线程回收,回收能够与应用程序的工作线程并发工作(因此看起来并没有stop the world)。
  • 压缩空间,减少内存碎片,并且并未延长GC等待时间。
  • GC等待的时间可预估。
  • 不能牺牲高吞吐量。
  • 不占用太大的堆内存(不明确,不知道官方的“大”是多大)。

相关文章

  • JVM源码分析系列

    JVM G1算法系列 G1垃圾收集器介绍 G1垃圾收集器之RSet G1垃圾收集器之SATB G1垃圾收集器之对象...

  • G1详情解读

    G1(Garbage First) 1. G1的由来 Garbage First 简称G1,是Java提出的最...

  • 3.JVM系列-G1垃圾收集器

    目录 一、背景 二、G1垃圾收集器特性 三、G1执行步骤 四、G1基本参数 四、G1日志解释 六、基本原理 七、...

  • 一文理解G1收集器

    G1简介 Garbage First Collector, 简称G1 Collector,是HotspotJDK1...

  • 路漫漫之 - jvm G1 垃圾回收器

    因为G1的堆内存划分和这不太一样。我就来详细的探讨下G1。G1收集器采用不同的方法来分配堆, G1 将内存分配为 ...

  • JVM 收集器之 ZGC

    1、前言 上篇我们说了 G1,G1 有很多创建,比如分 region 收集,并发标记等,G1 运行的流程如图所示:...

  • G1

    G1

  • 一篇文章搞懂G1收集器

    一、何为G1收集器 The Garbage-First (G1) garbage collector is a s...

  • G1收集器详解

    详解 JVM Garbage First(G1) 垃圾收集器 G1垃圾收集器入门

  • 2022-03-03

    G1: May I have this dance? G2: I'd love to. G1: You are a...

网友评论

      本文标题:G1

      本文链接:https://www.haomeiwen.com/subject/cyefeftx.html