本文首先简单介绍了垃圾收集的常见方式,然后再分析了 G1 收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践。
一、什么是垃圾回收
首先,在了解 G1 之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象。
垃圾回收的基本步骤有 2 步:
- Step-1:查找内存中不再使用的对象
- Step-2:释放这些对象占用的内存
本文首先简单介绍了垃圾收集的常见方式,然后再分析了 G1 收集器的收集原理,相比其他垃圾收集器的优势,最后给出了一些调优实践。
首先,在了解 G1 之前,我们需要清楚的知道,垃圾回收是什么?简单的说垃圾回收就是回收内存中不再使用的对象。
垃圾回收的基本步骤有 2 步:
在本教程中,你已经大致学习了包含在 Java JVM 中的 G1 垃圾收集器。首先,你学会了堆内存和垃圾收集器是如何成为任意 Java JVM 实现的关键组成部分的。接下来,你回顾了如何使用 CMS 收集器和 G1 收集器来进行垃圾回收的工作。然后,你还学习了 G1 的命令行开关和选项的相关知识,以及使用 G1 的最佳实践。最后,你学会了如何在 GC 日志文件中记录对象和数据的相关信息。
本教程涵盖的最后一个主题会介绍如何使用日志信息来分析 G1 收集器的性能。本节会提供一些选项和开关的快速概述,你可以用来收集输出至日志中的数据和信息。
你可以将日志设置为三个不同的细节级别。
等同于-XX:+PrintGC
开关,可以将日志的详细级别设置为 fine。示例输出:
在本节中,我们将学习 G1 收集器的各种命令行选项。
如果要启用 G1 收集器,那么可以使用-XX:+UseG1GC
开关。
以下是一个启动 Java2Demo 程序的命令行示例,这个程序包含在下载得到的 JDK 演示和示例程序包之中:
java -Xmx50m -Xms50m -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -jar
c:\javademos\demo\jfc\Java2D\Java2demo.jar
G1 收集器采用不同的方法来分配堆内存。接下来,我们会逐步回顾 G1 系统,如以下图片所示。
堆内存是一块内存区域(area),它又被分割成许多固定大小的区域(region)。
并发标记清除(CMS)收集器(也被称为并发低暂停收集器)负责收集老年代的垃圾。CMS 在执行大部分的垃圾收集工作时会尝试和应用程序的线程并发工作,这样便能尽可能地减少由于垃圾收集而造成的停顿时间。通常,并发低暂停收集器不会复制或整理存活的对象。进行垃圾收集时,不会移动存活的对象。如果内存碎片的问题较为严重,那么可以分配一块更大的堆内存。
注意:年轻代的 CMS 收集器使用与并行收集器相同的算法。
垃圾优先(G1)收集器是一种服务器式的垃圾收集器,适用于具有大容量内存的多处理器计算机。它可以高概率地满足垃圾收集(GC)停顿时间的目标,同时达到高吞吐量。在 Oracle 的 JDK 7u4 以及更新版本中,G1 垃圾收集器已经得到完全的支持了。G1 收集器是专门为有以下要求的应用程序而设计的:
Java 是一种编程语言和计算平台,它是由 Sun 微系统公司于 1995 年首次发布的。Java 程序包括实用工具、游戏和商业应用等等,而 Java 正是驱动这些程序的底层技术。Java 在全世界大约 8.5 亿台个人电脑上运行,并且还在全世界数十亿台设备上运行,包括移动设备和电视设备。Java 由一些关键组件构成,它们组成一个整体,形成 Java 平台。
本教程涵盖如何使用 G1 垃圾收集器,以及如何与 Hotspot JVM 配合使用的基础知识。你将会学习 G1 垃圾收集器的内部工作原理、启用 G1 的关键命令行开关,以及记录 G1 操作日志的选项。
预计大约 1 小时。
本教程涵盖 Java 语言中的 Java 虚拟机(JVM)的 G1 垃圾收集相关的基础知识。在本教程的第一部分中,我们会概述 JVM 的相关知识,并且会介绍垃圾收集机制及其性能。接下来,我们会回顾 Hotspot JVM 使用的 CMS 垃圾收集器是如何工作的。然后,我们会逐步讲解 Hotspot JVM 在使用 G1 垃圾收集器时,垃圾收集机制的工作原理。紧接着,还会有一个章节涵盖 G1 垃圾收集器能够使用的垃圾收集命令行选项。最后,你将会学到 G1 垃圾收集器能够使用的日志选项。
这个包提供了Java管理扩展的核心类。
接口名称 | 描述 |
---|---|
Descriptor | 某个JMX元素的额外的元数据。 |
DescriptorAccess | 这个接口可用于获取与某个JMX组件相关联的Descriptor类的描述符的访问权。 |
DescriptorRead | 这个接口可用于读取某个管理接口元素(例如,MBeanInfo)的描述符。 |
DynamicMBean | 这个接口定义了某个动态的MBean应当实现的方法(动态MBean会对外公开一个动态的管理接口)。 |
MBeanRegistration | 如果想要在MBean服务器中注册或注销某个MBean的之前和之后执行某些操作,那么这个MBean可以实现这个接口。 |
MBeanServer | 这个接口可用于在探针端操作MBean。 |
MBeanServerConnection | 这个接口可以表示和某个(本地的或远程的)MBean服务器之间的连接和通信方式。 |
MBeanServerDelegateMBean | 可用于定义某个MBeanServerDelegate对象的管理接口。 |
NotificationBroadcaster | 如果某个MBean需要发送通知,那么这个MBean应当实现这个接口。 |
NotificationEmitter | 如果某个MBean需要发送通知,那么这个MBean应当实现这个接口。 |
NotificationFilter | 任何作为通知过滤器的类都应该实现这个接口。 |
NotificationListener | 任何需要接收通知的对象都应该实现这个接口。 |
PersistentMBean | 如果某个MBean需要持久化,那么这个MBean应当实现这个接口。 |
QueryExp | 表示某些关系约束,类似于数据库查询的where子句。 |
ValueExp | 表示可以作为参数传递给关系表达式的值。 |
类名称 | 描述 |
---|---|
Attribute | 通过关联属性名称和属性值,这个类可以表示MBean的属性。 |
AttributeChangeNotification | 这个类定义了由MBean发送的属性变更通知。 |
AttributeChangeNotificationFilter | 这个类实现了属性变更通知(AttributeChangeNotification)的NotificationFilter(通知过滤器)接口。 |
AttributeList | 这个类表示MBean的属性值列表。 |
AttributeValueExp | 这个类可以表示用作关系约束参数的属性。 |
DefaultLoaderRepository | 已弃用 继续阅读详解 javax.management 包 |