java8串行和并行的区别_垃圾收集器–串行,并行,CMS,G1(以及Java 8中的新增功能)...

java8串行和并行的区别

Blog_Trash-1

4个Java垃圾收集器–错误的选择如何严重影响性能

在2014年,对于大多数开发人员来说,还有两件事仍然是个谜:垃圾收集和了解异性。 由于我对后者知之甚少,所以我认为我会对前者大吃一惊,尤其是因为在该领域中,Java 8发生了一些重大变化和改进,尤其是去除了PermGen和一些新的和令人兴奋的优化(有关此方面的更多信息,请参见结尾)。

当我们谈论垃圾收集时,我们绝大多数人都知道这个概念,并将其应用到日常编程中。 即使这样,很多事情我们还是不了解,那时候情况就变得很痛苦。 关于JVM的最大误解之一是它有一个垃圾收集器,实际上它提供了四种不同的垃圾收集器,每种垃圾都有其独特的优缺点。 使用哪种选择不是自动的,而是由您自己决定的,吞吐量和应用程序暂停之间的差异可能会很大。

这四种垃圾收集算法的共同点是它们是代生成的,这意味着它们使用古老的假设(即堆中的大多数对象是短寿命的,应Swift回收)将托管堆分成不同的段。 由于这也是一个广为人知的领域,因此我将直接介绍不同的算法,以及它们的优缺点。

1.串行收集器

串行收集器是最简单的一种,您可能不会使用,因为它主要是为单线程环境(例如32位或Windows)和小型堆而设计的。 该收集器会在工作时冻结所有应用程序线程,这使它在所有目的和用途上都无法在服务器环境中使用。

使用方法:您可以通过打开-XX:+ UseSerialGC JVM参数来使用它,

2.并行/吞吐量收集器

接下来是并行收集器。 这是JVM的默认收集器。 就像它的名字一样,它的最大优点是使用多个线程来扫描并压缩堆。 并行收集器的不利之处在于,在执行次要或完全GC收集时,它将停止应用程序线程。 并行收集器最适合可以容忍应用程序暂停并试图优化以减少由收集器引起的CPU开销的应用程序。

3. CMS收集器

紧跟在并行收集器之后的是CMS收集器(“ current-mark-sweep ”)。 该算法使用多个线程(“并发”)在堆(“标记”)中扫描可回收(“清扫”)未使用的对象。 在以下两种情况下,该算法将进入“世界停止”(STW)模式:初始化根的初始标记(从线程入口点或静态变量可以访问的旧代对象),以及应用程序更改状态时在算法同时运行时堆,迫使它返回并进行最后的修改以确保标记了正确的对象。

使用此收集器时,最大的担忧是升级失败 ,在这种情况下,收集年轻一代和老一代之间出现了种族状况。 如果收集器需要将年轻物体提升给老一代,但又没有足够的时间清理空间,则必须首先这样做,这将导致完整的STW收集-这就是CMS收集器的初衷阻止。 为确保不会发生这种情况,您可以增加旧一代的大小(或为此增加整个堆的大小),或者为收集器分配更多的后台线程,以便他与对象分配率竞争。

与并行收集器相比,此算法的另一个缺点是,它使用更多的CPU,以便通过使用多个线程来执行扫描和收集,从而为应用程序提供更高级别的连续吞吐量。 对于大多数长时间运行的服务器应用程序而言,这不利于应用程序冻结,这通常是一个不错的选择。 即使这样, 默认情况下不会启用该算法。 您必须指定XX:+ USeParNewGC才能真正启用它。 如果您愿意分配更多的CPU资源以避免应用程序暂停,那么这可能是您可能要使用的收集器,假设您的堆大小小于4Gb。 但是,如果大于4GB,则可能要使用最后一种算法-G1收集器。

4. G1收藏家

JDK 7更新4中引入的Garbage first收集器(G1)旨在更好地支持大于4GB的堆。 G1收集器利用多个后台线程来扫描它划分成区域的堆,范围从1MB到32MB(取决于堆的大小)。 G1收集器旨在首先扫描那些包含最多垃圾对象的区域,并为其命名(垃圾优先)。 使用–XX:+ UseG1GC标志打开此收集器。

这种策略有可能在后台线程完成对未使用对象的扫描之前耗尽堆,在这种情况下,收集器将不得不停止应用程序,这将导致STW收集。 G1还具有另一个优点,即它可以在移动过程中压缩堆,这是CMS收集器仅在完整STW收集期间执行的操作。

在过去的几年中,大堆一直是一个有争议的领域,许多开发人员从每台机器模型的单个JVM转移到每台机器具有多个JVM的更多微服务,组件化体系结构。 这是由许多因素驱动的,包括希望隔离不同的应用程序部分,简化部署并避免通常将应用程序类重新加载到内存中所带来的成本(在Java 8中实际上已得到改进)。

即便如此,涉及到JVM的最大驱动程序之一还是希望避免大堆发生的长时间“停止世界”暂停(在大型集合中可能要花费几秒钟)。 诸如Docker之类的容器技术也加快了这一步,使您能够相对轻松地在同一台物理计算机上部署多个应用程序。

Java 8和G1收集器

Java 8 update 20刚刚推出的另一个漂亮的优化是G1收集器字符串重复数据删除 。 由于字符串(及其内部char []数组)占用了我们的大部分堆内存,因此进行了新的优化,使G1收集器可以识别在整个堆中重复多次的字符串,并更正它们以指向同一内部char []数组,以避免同一字符串的多个副本无效地驻留在堆中。 您可以使用-XX:+ UseStringDeduplication JVM参数来进行尝试。

Java 8和PermGen

Java 8中最大的更改之一是删除了堆中的permgen部分,该部分传统上分配给类元数据,内部字符串和静态变量。 传统上,这将要求开发人员使用的应用程序会加载大量的类(对于使用企业容器的应用程序很常见),以专门针对堆的这一部分进行优化和调整。 多年来,它已成为许多OutOfMemory异常的来源,因此(如果是非常不错的)添加JVM(主要是)要多加注意。 即使这样,它本身也可能不会减少开发人员将其应用程序分离到多个JVM中的浪潮。

这些收集器中的每一个都通过一系列的拨动开关进行不同的配置和调整,每一个都有可能增加或减少吞吐量,所有这些都取决于应用程序的特定行为。 在下一篇文章中,我们将研究配置这些策略的关键策略。

同时,您最想了解关于不同收藏家之间差异的哪些事情? 在评论部分打我!

补充阅读

  1. 在InfoQ上对G1收集器进行了非常深入的深入审查。
  2. Java性能–权威指南。 我最喜欢的Java性能书 。
  3. 有关CodeCentric 博客上有关字符串重复数据删除的更多信息。

翻译自: https://www.javacodegeeks.com/2014/09/garbage-collectors-serial-vs-parallel-vs-cms-vs-g1-and-whats-new-in-java-8.html

java8串行和并行的区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339780.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python函数参数学习_python学习笔记-11.函数参数和返回值进阶

1. 函数参数和返回值的作用函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式:无参数,无返回值无参数,有返回值有参数,无返回值有参数,有返回值定义函数时,是否接收参数…

java spr_Java中的42行代码中的URL缩短器服务(Java(?!)Spring Boot + Redis

java spr显然,编写URL缩短服务是新的“ Hello,world! ”在IoT /微服务/时代的世界中。 一切始于在45行Scala中的URL缩短服务 -整洁的Scala,以Spray和Redis进行调味以进行存储。 紧随其后的是, 在35行Clojure中提供了ur…

python邮件发送哪个好_python发邮件(一)

复习模块如果我们要发送邮件,就需要用到smtplib模块的以下方法:1、import smtplib #引入smtplib模块2、server smtplib.SMTP() #server为变量,通过SMTP指定一个服务器,这样才能把邮件送到另一个服务器,SMTP…

SSL Kafka经纪人从Kafka Mirror Maker迁移到Brooklin的挑战

问题 从卡夫卡镜子制造商转移到布鲁克林有我在这里所写的优势。 但是,进行这种迁移并不容易,因为它本来应该如此。 我面临的主要挑战是:在消费者Kafka经纪人和Brooklin之间建立SSL连接 解 SSL问题 事实证明,这个问题比我预期的要…

mysql移动数据的语句是_mysql基本语句

MySQL关系型数据库RDS中的老大哥,增删改查是MySQL入门的基础增删改查语句增删改查的语句命令为增:insert删:delete改:update查:SELECT或者show库操作创建数据库:create database shujukuba;创建带字符集的数…

jetty嵌入式容器_嵌入式Jetty和Apache CXF:借助Spring Security来保护REST服务

jetty嵌入式容器最近,我遇到了一个非常有趣的问题,我认为这只需要几分钟就可以解决:在Linux中使用Spring Security (当前稳定版本3.2.5 )保护Apache CXF (当前版本3.0.1 )/ JAX-RS REST服务。在…

python逻辑运算符的使用_总结Python中逻辑运算符的使用

下表列出了所有python语言支持的逻辑运算符。假设变量a持有10和变量b持有20,则:示例:试试下面的例子就明白了所有的python编程语言提供了逻辑运算符:#!/usr/bin/pythona 10b 20c 0if ( a and b ):print "line 1 - a and b are true&q…

如何使用用户数据脚本在EC2实例上安装Apache Web Server

你好朋友, 在本教程中,我们将看到如何使用用户数据脚本在EC2实例上安装Apache Web Server。 在我以前的教程之一中,我已经解释了如何使用AWS控制台启动EC2实例。如果您还没有完成该操作,我建议您先进行一下操作。 首先&#xf…

java 常量接口_java接口定义常量研究

背景和同事讨论到,在接口中定义常量的问题,引发了争论,即,假如在接口中定义变量,是否需要用static来限定的问题,或者说用static和不用static会有什么区别。引论package spring.interfaceTest;public interf…

spring 多租户_使用Spring Security的多租户应用程序的无状态会话

spring 多租户从前, 我发表了一篇文章,解释了构建无状态会话的原理 。 巧合的是,我们再次为多租户应用程序执行同一任务。 这次,我们将解决方案集成到Spring Security框架中,而不是自己构建身份验证机制。 本文将解释…

java api 1.6 下载_Java JDK API

JDKJavaDevelopmentKit是SunMicrosystems针对Java开发员的产品。自从Java推出以来,JDK已经成为使用最广泛的JavaSDK。JDK是整个Java的核心,包括了Java运行环境。相关软件软件大小版本说明下载地址jdk(Java Development Kit)是Sun Microsystems针对java开…

Java / Cloud:如何快速创建支持Kubernetes的REST微服务

可以肯定地说,如今微服务与云的结合风靡一时。 微服务的开发比以往任何时候都多,从而导致应用程序部署数量增加。 在过去的十年中,开发了诸如Docker和Kubernetes之类的容器化和编排工具,从而使微服务模式真正易于采用。 本文将教…

java考试安徽工业大学_2011~2012《Java语言程序设计》试卷A及答案(安徽工业大学)...

《2011~2012《Java语言程序设计》试卷A及答案(安徽工业大学)》由会员分享,可在线阅读,更多相关《2011~2012《Java语言程序设计》试卷A及答案(安徽工业大学)(6页珍藏版)》请在人人文库网上搜索。1、装 订 线 安 徽 工 业 大 学 试 题 纸(一)20112012学年第…

jsr303自定义验证_JSR 310新日期/时间API的自定义JSR 303 Bean验证约束

jsr303自定义验证借助JSR 310,Java 8终于为我们带来了不错的日期和时间API。 对于仍在使用Java 7的那些人(就像我目前在我的当前项目中一样),有很好的反向移植,请访问www.threeten.org了解更多详细信息。 但是&#xf…

java spring注入 静态方法_JAVA静态方法中如何使用spring@Value进行注入的成员变量...

背景:一个旧项目原本集成有spring-session,现需要临时添加缓存的操作,需要复用spring-session中的一些缓存配置。实现方法:一、类上添加注解Component二、定义静态成员变量private static String redisUrl;private static String …

使用Testcontainers和PostgreSQL,MySQL或MariaDB的Spring Boot测试

Testcontainers是一个Java库,可轻松将Docker容器集成到JUnit测试中。 在Containerized World中 ,将测试配置与嵌入式数据库和服务复杂化几乎没有意义。 而是使用在Docker中运行您的服务,并让Testcontainers为您管理此服务。 在此博客文章中&…

使用Spring Boot和Project Reactor处理SQS消息-第2部分

这是我关于使用Spring Boot和Project Reactor有效处理SQS消息的博客文章的后续文章 我在第一部分中列出了一些方法上的差距。 1.处理SQS客户端调用中的失败 2.该方法一次只能处理来自SQS的一条消息,如何并行化 3.它不处理错误,管道中的任何错误都会中…

java爬虫jsoup_Java爬虫之利用Jsoup自制简单的搜索引擎

内容导读在上述代码中,url为输入词条(暂时仅限于英文),进入while循环可一直搜索,当输入为’exit’时退出。contentText为该词条的百度百科简介的网页形式,通过正则表达式将其中的文字提取出来。代码虽然简洁,但是功能还…

shader weaver_具有自定义汇编程序,Weaver和运行时的可插拔知识

shader weaver作为贝叶斯工作的一部分,我对Kie进行了很多重构,使其具有清晰的扩展点。 我想确保可以完成贝叶斯系统的所有工作部件,而无需在现有内核中添加任何代码。 因此,现在每种知识类型都可以拥有自己的包,汇编器…

matplotlib的默认字体_浅谈matplotlib默认字体设置探索

控制默认字体的设置根据官方文档https://matplotlib.org/tutorials/text/text_props.html#default-font可知:The base default font is controlled by a set of rcParams默认字体是由一组rcParams控制的。rcParamusage‘font.family"List of either names of f…