在这篇教程中咱们将学习几种现有的垃圾回收器。在Java中,垃圾回收是一个自动的进程能够替代程序员进行内存的分配与回收这些复杂的工做。这篇是垃圾回 收教程系列的第三篇,在前面的第2部分咱们看到了在Java中垃圾回收是如何工做的,那是篇有意思的文章,我推荐你去看一下。第一部分介绍了Java的垃 圾回收,主要有JVM体系结构,堆内存模型和一些Java术语。
Java有四种类型的垃圾回收器:
- 串行垃圾回收器(Serial Garbage Collector)
- 并行垃圾回收器(Parallel Garbage Collector)
- 并发标记扫描垃圾回收器(CMS Garbage Collector)
- G1垃圾回收器(G1 Garbage Collector)
每种类型都有本身的优点与劣势。重要的是,咱们编程的时候能够经过JVM选择垃圾回收器类型。咱们经过向JVM传递参数进行选择。每种类型在很大程度上有 所不一样而且能够为咱们提供彻底不一样的应用程序性能。理解每种类型的垃圾回收器而且根据应用程序选择进行正确的选择是很是重要的。
一、串行垃圾回收器
串行垃圾回收器经过持有应用程序全部的线程进行工做。它为单线程环境设计,只使用一个单独的线程进行垃圾回收,经过冻结全部应用程序线程进行工做,因此可能不适合服务器环境。它最适合的是简单的命令行程序。
经过JVM参数-XX:+UseSerialGC
可使用串行垃圾回收器。
二、并行垃圾回收器
并行垃圾回收器也叫作 throughput collector 。它是JVM的默认垃圾回收器。与串行垃圾回收器不一样,它使用多线程进行垃圾回收。类似的是,它也会冻结全部的应用程序线程当执行垃圾回收的时候
三、并发标记扫描垃圾回收器
并发标记垃圾回收使用多线程扫描堆内存,标记须要清理的实例而且清理被标记过的实例。并发标记垃圾回收器只会在下面两种状况持有应用程序全部线程。
- 当标记的引用对象在tenured区域;
- 在进行垃圾回收的时候,堆内存的数据被并发的改变。
相比并行垃圾回收器,并发标记扫描垃圾回收器使用更多的CPU来确保程序的吞吐量。若是咱们能够为了更好的程序性能分配更多的CPU,那么并发标记上扫描垃圾回收器是更好的选择相比并发垃圾回收器。
经过JVM参数 XX:+USeParNewGC
打开并发标记扫描垃圾回收器。
四、G1垃圾回收器
G1垃圾回收器适用于堆内存很大的状况,他将堆内存分割成不一样的区域,而且并发的对其进行垃圾回收。G1也能够在回收内存以后对剩余的堆内存空间进行压缩。并发扫描标记垃圾回收器在STW状况下压缩内存。G1垃圾回收会优先选择第一块垃圾最多的区域
经过JVM参数 –XX:+UseG1GC
使用G1垃圾回收器
Java 8 的新特性
在使用G1垃圾回收器的时候,经过 JVM参数 -XX:+UseStringDeduplication
。 咱们能够经过删除重复的字符串,只保留一个char[]来优化堆内存。这个选择在Java 8 u 20被引入。
咱们给出了所有的四种Java垃圾回收器,须要根据应用场景,硬件性能和吞吐量需求来决定使用哪种。
垃圾回收的JVM配置
下面的JVM关键配置都与Java垃圾回收有关。
运行的垃圾回收器类型
配置 | 描述 |
---|---|
-XX:+UseSerialGC | 串行垃圾回收器 |
-XX:+UseParallelGC | 并行垃圾回收器 |
-XX:+UseConcMarkSweepGC | 并发标记扫描垃圾回收器 |
-XX:ParallelCMSThreads= | 并发标记扫描垃圾回收器 =为使用的线程数量 |
-XX:+UseG1GC | G1垃圾回收器 |
GC的优化配置
配置 | 描述 |
---|---|
-Xms | 初始化堆内存大小 |
-Xmx | 堆内存最大值 |
-Xmn | 新生代大小 |
-XX:PermSize | 初始化永久代大小 |
-XX:MaxPermSize | 永久代最大容量 |
使用JVM GC参数的例子
1
|
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
|
在Java垃圾回收教程的下一部分,咱们将会用一个Java程序演示如何监视和分析垃圾回收。
目录
在这个Java GC系列教程中,让咱们学习用于垃圾回收监视和分析的工具。而后,选用一种工具来监视一个Java示例程序的垃圾回收过程。若是你是一名初学者,你最好仔细阅读该系列教程。你能够从这里(垃圾回收介绍)开始。
Java GC监视和分析工具
下面是一些可用的工具,每一个都有本身的优点和缺点。咱们能够经过选择正确的工具并分析,来提高应用程序的性能。这篇教程中,咱们选用Java VisualVM。
- Java VisualVM
- Naarad
- GCViewer
- IBM Pattern Modeling and Analysis Tool for Java Garbage Collector
- HPjmeter
- IBM Monitoring and Diagnostic Tools for Java-Garbage Collection and Memory
- Visualizer
- Verbose GC Analyzer
Java VisualVM
Java VisualVM使用是免费的,其须要安装Java SE SDK。看一下Java JDK的bin文件夹中(路径:\Java\jdk1.8.0\bin),这里面有不少javac和java工具,jvisualvm就是其中之一。
Java VisualVM可以被用于:
- 生成并分析堆的内存转储;
- 在MBeans上观察并操做;
- 监视垃圾回收;
- 内存和CPU性能分析;
一、启动VisualVM
jvisualvm位于JDK bin文件夹下,直接点击就能够。
二、安装可视化GC插件
咱们须要安装可视化GC插件,以便在Java GC过程当中有良好的视觉感觉。
三、监视GC
如今,是时候监视垃圾回收进程了,开启你的Java程序,它将自动被检测到并显示到Java VisualVM界面,左侧“Application”(应用程序)窗口下,“Local”(本地节点)下,全部本地运行的Java程序都会被列出。
Java VisualVM是一个Java应用程序,所以它也会被列在其中,教程的意图在于使用VisualVM来监视它本身的GC进程。
双击“Local”(本地)下的VisualVM图标。
如今,程序监控窗口在右侧打开,这有许多不一样关于应用程序性能的相关监视指数的tab页,目前为止,咱们最感兴趣的是“Visual GC”,点击它。
上面图片显示在Old、Eden、S0和S1上空间利用状况,下图显示了每部分空间的分配和释放状况。它按照指定的刷新率保持持续刷新。
上面图片所展现的是正常运行程序的状况,当出现内存泄露或者反常的行为时,它会在图表中明确的显示出来。最少咱们能理解他是与对象内存分配和垃圾回收相关的事情。随后,经过其余tab页(像“Threads”)和Thread Dump的帮助,咱们可以减小这个问题。
在“Monitor”tab页中,咱们可以监控并定时展现全部堆内存使用状况图。经过“Perform GC”按钮能够启动垃圾回收进程。
在“Sampler”tab页中,咱们可以启动内存和CPU性能分析,它将显示详细每一个实例使用的实时报告,它将帮助咱们明确性能问题。
这篇教程是咱们四篇Java垃圾回收系列教程的最后一篇。