[译]Java垃圾回收器的类型
说明:这篇文章来翻译来自于Javapapers 的Types of Java Garbage Collectors
在这部分的教程中我们将讲到可使用的四种不同类型的Java垃圾回收器。垃圾回收是Java中的一个自动操作的进程,它负责处理程序中对象内存的分配和回收。本篇文章是系列教程的第三部分,在前面的第二部分中我们谈到了在Java中垃圾回收是如何工作的,我建议你去好好的读下因为它读起来很有意思。在第一部分的Java垃圾回收的介绍中,我们谈到了JVM架构、堆内存模型以及相关的Java名词。
Java有四种类型的垃圾回收器
- 1.串行垃圾回收器
- 2.并行垃圾回收器
- 3.CMS垃圾回收器
- 4.G1垃圾回收器
![]()
这四种类型中的每一个都有他们自己的优势和劣势。最重要的是,我们程序员可以选择JVM使用的垃圾回收器的类型。我们选择类型通过将可选的参数传递给JVM。每一种垃圾回收器都有很大的不同而且对于不同的应用程序可以提供完全不同的表现。所以理解每一种类型的垃圾回收器并且根据应用程序来合适的使用很有意义的。
1.串行垃圾回收器##
串行垃圾回收器在工作的时候会持有所有的应用程序线程。它本设计用在单线程环境中。在垃圾回收的时候它只有一个线程在使用。它在进行垃圾回收的时候会将其他的应用程序线程给冻结住,所以它不太适合用于一个服务器环境。它最适合用于单命令行程序。
开启-XX:+UseSerialGCJVM参数就可以使用串行垃圾回收器了。
2.并行的垃圾回收器##
并行垃圾回收器也被称为吞吐量优先收集器。它是JVM中默认的垃圾回收器,它使用多个线程用于垃圾回收。和串行垃圾回收器类似的是当它在进行垃圾回收操作的时候也会将其他的应用程序线程给冻结住。
3.CMS垃圾回收器##
并发标记清理(CMS)垃圾回收器使用多个线程去扫描堆内存并且标记回收的实例然后清理被标记的实例。CMS垃圾回收器在下面的两种场景下会持有所有的应用程序线程:
- 1.在标记在老年代中被引用的对象的时候
- 2.在进行垃圾回收时如果在堆内存中在并行出现了改变
和并行垃圾回收器相比,CMS收集器使用更多的CPU去确保更好的应用程序吞吐量。如果为了一更好的表现我们能够分配跟多的CUP给它,那么CMS相对于并行回收器是一个更好的选择。
开启XX:+USeParNewGCJVM参数就可以使用CMS垃圾回收器了。
4.G1垃圾回收器##
G1垃圾回收器用于大型的堆内存区。它将堆内存进行分区然后并行进行回收操作。G1在释放内存之后仍然进行空闲对空间的压缩操作。但是CMS进行压缩内存操作是在程序停下来以后。G1是根据最大的垃圾而优先次序来进行分区。
开启–XX:+UseG1GCJVM参数就可以使用G1垃圾回收器了。
Java8改进##
在使用G1垃圾回收器的使用开启JVM参数-XX:+UseStringDeduplication。这样的操作可以在移除多个字符串值的时候转换成单个字符数组。这个可选项是在Java 8 u 20。
考虑到上面四中不同类型的垃圾回收器,具体使用哪一个取决于应用程序的场景、可用的硬件以及要求的吞吐量。
垃圾回收JVM选项
下面是一些和Java垃圾回收相关的重要的JVM选项。
开启垃圾回收器的选项
| Option | Description |
| -XX:+UseSerialGC | Serial Garbage Collector |
| -XX:+UseParallelGC | 并行垃圾回收器 |
| -XX:+UseConcMarkSweepGC | CRM垃圾回收器 |
| -XX:ParallelCMSThreads= | CMS回收器– 线程的使用数目 |
| -XX:+UseG1GC | G1 垃圾回收器 |
GC优化选项
| Option | Description |
| -Xms | 初始化堆内存大小 |
| -Xmx | 最大的堆内存大小 |
| -Xmn | 年轻代大小 |
| XX:PermSize | 初始化永久代大小 |
| -XX:MaxPermSize | 最大的永久代大小 |
JVM GC选项的使用示例
java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar
在下一篇系列文章中我们将用Java程序的例子来看如何监控和分析垃圾回收。
[译]Java垃圾回收器的类型的更多相关文章
- [译]Java 垃圾回收介绍
说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Introduction 在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的. ...
- Java垃圾回收器
一.Java垃圾回收器要负责完成以下3个任务: 1.分配内存 2.确保被引用对象的内存不被错误回收 3.回收不再被引用的对象的内存空间 二.垃圾回收是一个复杂而又耗时的操作.如果JVM花费过多的时间在 ...
- Java垃圾回收器的工作原理
上课,老师照本宣科,实在难以理解,干脆就看书包里的Java书,正好看了Java的垃圾回收器是如何工作的,觉得有必要记录一下. 参考于 Java编程思想第四版(Thinking in Java) 老年代 ...
- [译]Java垃圾回收是如何工作的
说明:这篇文章来翻译来自于Javapapers 的How Java Garbage Collection Works 这部分教程是为了理解Java垃圾回收的基础以及它是如何工作的.这是垃圾回收系列教程 ...
- [译]Java 垃圾回收的监控和分析
说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Monitoring and Analysi 在这个系列的Java垃圾回收教程中,我们将看到可用于垃圾 ...
- Java垃圾回收介绍(译)
在Java中,对象内存空间的分配与回收是由JVM中的垃圾回收进程自动完成的.与C语言不同的是,在Java中开发者不需要专门为垃圾回收写代码.这是使Java流行的众多特征之一,也帮助了程序员写出了更好的 ...
- Java GC系列(3):垃圾回收器种类
本文由 ImportNew - 好好先生 翻译自 javapapers. 目录 垃圾回收介绍 垃圾回收是如何工作的? 垃圾回收的类别 垃圾回收监视和分析 在这篇教程中我们将学习几种现有的垃圾回收器.在 ...
- 【转】Java学习---垃圾回收算法与 JVM 垃圾回收器综述
[原文]https://www.toutiao.com/i6593931841462338062/ 垃圾回收算法与 JVM 垃圾回收器综述 我们常说的垃圾回收算法可以分为两部分:对象的查找算法与真正的 ...
- Java垃圾回收算法和垃圾回收器
基本上 jvm内存回收有三种 基本算法 标记-清除 标记清除的算法最简单,主要是标记出来需要回收的对象,然后然后把这些对象在内存的信息清除.如何标记需要回收的对象,在上一篇文章里面已经有说明. 标记- ...
随机推荐
- 如何设置eclipse在默认模式下打开文件
如何设置eclipse在默认模式下打开文件 打开eclipse.选择例如以下:windows --> preferences --> General --> Editors --&g ...
- MPQ Storm库 源代码分析 一个
MPQ什么? MPQ维基上说的非常明确. 简而言之,它是暴雪公司用于游戏数据打包的工具.星际争霸,魔兽争霸游戏中都有使用.该工具内含游戏资源加密和压缩等功能. git下载地址:http ...
- CentOS7 安装Hadoop集群环境
先按照上一篇安装与配置好CentOS以及zookeeper http://www.cnblogs.com/dopeter/p/4609276.html 本章介绍在CentOS搭建Hadoop集群环境 ...
- iOS6和iOS7适应代码(6) —— NSLocalizedString
我们的应用程序都需要国际化,字符串的重要组成部分.一般来说.我们是通过一个string资源文件来达到这个目的,我们需要支持多国语言,有多少次把这个文档本地化.需要使用的代码NSLocalizedStr ...
- 新安装Win10
随着微软发布Windows 10下载技术预览版.现在,您可以免费下载Windows 10技术预览ISO档,安装和开放经验. Windows 10技术预览提供的第一部英语.中国简体.葡萄牙语,含32位. ...
- Android复制WIN8点击下沉倾斜系统瓷砖效果
※效果 ※使用说明 Java代码 import android.app.Activity; import android.os.Bundle; import android.widget.Toast; ...
- Linux命令学习篇0——原产地
昨天在用curl发送简单的HTTP请求做測试的时候发现自己每次使用的时候都是在网络上查看别人的演示样例才干想起来怎么用,这样效率太低了.尽管有网络依旧在,可是总感觉不是被自己掌握着,心里不踏实,回忆起 ...
- android登录界面
在网上在到一个登录界面感觉挺不错的,给大家分享一下~先看效果图: 这个Demo除了按钮.小猫和Logo是图片素材之外,其余的UI都是通过代码实现的. 一.背景 背景蓝色渐变,是通过一个xml文件来设置 ...
- Floodlight Controller 路线原则
SDN的出现能够使得各种复杂的路由协议从原本的Device OS中剥离出来,放在SDN Controller中.Controller用一种简单的协议来和全部的Router进行通信.就能够获得 ...
- 流动python - 八皇后问题简单解决方案
思维: 使用DFS. 坐标的一维阵列的表达,在标行,元素列.A[i]=j它表示第一i女王就行了j柱. 以穿越线,由线(从上到下),决定其列(左到右),所以,不要推断冲突的行,和主斜线副斜线冲突. (行 ...