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)。
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等待的时间可预估。
- 不能牺牲高吞吐量。
- 不占用太大的堆内存(不明确,不知道官方的“大”是多大)。