java虚拟机参数优化_JAVA虚拟机JVM参数优化(2):垃圾收集算法选择

JAVA虚拟机JVM优化重要性,昨天JAVA虚拟机JVM参数优化(1)文章中已经描述,今天我们来讨论JAVA虚拟机在不同性能要求下如何选择三种垃圾收集算法。

JVM内部结构如下图所示:

7eb97b7428683cb7af50aa84193b2c51.png

串行收集用于单个线程执行垃圾收集的情况,在这种情况下相对它是有效的,因为它不需要和其他线程进行通讯。它适用于单个处理器机器,或者在多处理器情况下数据量小于100MB。串行收集通过参数 -XX:+UseSerialGC声明工作。

并行收集通过并行较小的收集来降低整个垃圾收集周期。中等或者大型数据量的应用运行在多处理和多线程建议采用并行收集,它通过参数-XX:+UseParallelGC声明工作。并行压缩是允许并行收集器并行执行主要集合的功能。如果不进行并行压缩,则使用单个线程执行主要集合,这会显著限制可伸缩性。如果指定了-xx:+useParallelGC选项,则默认情况下启用并行压缩。关闭它的选项是-xx:-UseParallelOldGC。

大多数并发收集器同时执行其大部分工作(例如,当应用程序仍在运行时),以缩短垃圾收集暂停时间。它是为具有中型到大型数据集的应用程序设计的,在这些数据集中,响应时间比总吞吐量更重要,通过用于最小化暂停的技术会降低应用程序性能。Java热点VM提供了两个主要并行收集器之间的选择;参见大多数并发收集器。使用选项-xx:+UseConcMarkSweepGC启用CMS收集器或-xx:+UseG1GC启用g1收集器。

选择收集器

除非应用程序有相当严格的暂停时间要求,否则首先运行应用程序并允许VM选择一个收集器。如有必要,请调整堆大小以提高性能。如果性能仍然不符合您的目标,那么使用以下准则作为选择收集器的起点。

如果应用程序有一个小的数据集(高达大约100 MB),则

使用选项-xx:+UseSerialGC选择串行收集器。

如果应用程序将在单个处理器上运行,并且没有暂停时间要求,那么让虚拟机选择收集器,或者使用选项-xx:+UseSerialGC选择串行收集器。

如果(a)应用程序性能峰值是第一优先级,并且(b)没有暂停时间要求,或者可以接受1秒或更长的暂停,那么让虚拟机选择收集器,或者使用-xx:+useParallelGC选择并行收集器。

如果响应时间比总吞吐量更重要,并且垃圾收集暂停时间必须保持短于约1秒,则使用-xx:+useConcMarkSweepgc或-xx:+UseG1GC选择并发收集器。

这些准则仅为选择收集器提供了一个起点,因为性能取决于堆的大小、应用程序维护的活动数据量以及可用处理器的数量和速度。暂停时间对这些因素特别敏感,因此前面提到的1秒阈值只是近似值:在许多数据大小和硬件组合上,并行收集器将经历超过1秒的暂停时间;相反,在某些组合上,并发收集器可能无法保持低于1秒的暂停时间。

如果推荐的收集器没有达到所需的性能,请首先尝试调整堆和生成大小以满足所需的目标。如果性能仍然不足,请尝试其他收集器:使用并发收集器减少暂停时间,并使用并行收集器增加多处理器硬件上的总吞吐量。

SPEC JBB2015MULTI测试结果分析

选取SPEC JBB2015MULTI测试结果中Java HotSpot 64-bit Server VM,version 1.8.0_131,厂商报告Cisco思科、DELL戴尔、H3C华三、HP、Inspur浪潮、Levovo联想、Quanta台湾广达。

0f1863daf4f375ba8b11a95ab58d3049.png

我们选取每个厂商中得分最高的测试结果,并且按使用堆内存数量大小升序排,如下所示。

Inspur Corporation Inspur NF5280M4 256GB/29GB 39635

-server -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:+UseLargePages -XX:+UseParallelOldGC -Xms29g -Xmx29g -Xmn27g -XX:SurvivorRatio=28 -XX:TargetSurvivorRatio=95 -XX:ParallelGCThreads=22 -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

Quanta Computer Inc. QuantaGrid D52B-2U 384GB/30GB 40874

-showversion -server -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:+UseParallelOldGC -XX:SurvivorRatio=28 -XX:TargetSurvivorRatio=95 -XX:MaxTenuringThreshold=15 -Xms30g -Xmx30g -Xmn27g -XX:ParallelGCThreads=28

PowerEdge R640 786GB/180GB 69059

-showversion -server -XX:+AlwaysPreTouch -XX:+UseParallelOldGC -XX:-UseAdaptiveSizePolicy -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution -XX:-UseBiasedLocking -XX:+AggressiveOpts -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -XX:SurvivorRatio=26 -XX:TargetSurvivorRatio=95 -Xms180g -Xmx180g -Xmn178g -XX:ParallelGCThreads=28 -XX:+PrintGCDetails -XX:+PrintGCTimeStamps

Lenovo Global Technology ThinkSystem SR650 768GB/350GB 114309

-server -Xms350g -Xmx350g -Xmn340g -XX:SurvivorRatio=40 -XX:MaxTenuringThreshold=15 -XX:+UseLargePages -XX:LargePageSizeInBytes=2m -XX:+UseParallelOldGC -Xnoclassgc -XX:+AggressiveOpts -XX:+AlwaysPreTouch -XX:-UseAdaptiveSizePolicy -XX:-UsePerfData -XX:TargetSurvivorRatio=98 -XX:ParallelGCThreads=56 -XX:-UseBiasedLocking -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps

H3C UniServer R4900 G3 1536GB/710GB 120287

-XX:+UseParallelOldGC -Xms710g -Xmx710g -Xmn690g -XX:-UsePerfData -server -XX:AllocatePrefetchInstr=2 -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseLargePages -XX:SurvivorRatio=48 -XX:TargetSurvivorRatio=90 -XX:ParallelGCThreads=56 -XX:MaxTenuringThreshold=15

Hewlett Packard Enterprise ProLiant DL380 Gen10 1536GB/735GB 117090

-XX:-UsePerfData -server -XX:AllocatePrefetchInstr=2 -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseLargePages -XX:+UseParallelOldGC -Xms735g -Xmx735g -Xmn681g -XX:SurvivorRatio=68 -XX:TargetSurvivorRatio=48 -XX:ParallelGCThreads=56 -XX:MaxTenuringThreshold=15 -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+UseRTMLocking -XX:InlineSmallCode=10k -XX:MaxGCPauseMillis=300

Cisco UCS C240 M5 1536GB/710GB jOPS:118551

-XX:+UseParallelOldGC -Xms710g -Xmx710g -Xmn690g -XX:-UsePerfData -server -XX:AllocatePrefetchInstr=2 -XX:LargePageSizeInBytes=2m -XX:+AggressiveOpts -XX:-UseAdaptiveSizePolicy -XX:+AlwaysPreTouch -XX:-UseBiasedLocking -XX:MaxMetaspaceSize=256m -XX:MetaspaceSize=256m -XX:+UseLargePages -XX:SurvivorRatio=48 -XX:TargetSurvivorRatio=90 -XX:ParallelGCThreads=56 -XX:MaxTenuringThreshold=15

从上面数据可以得知SPEC JBB2015都是为了达到吞吐量最大化,再优化响应时间性能,因此所有厂商都不约而同选择了-server 默认并行收集,同时关闭默认并行压缩算法,开启-XX:+UseParallelOldGC;垃圾收集并行线程数-XX:ParallelGCThreads 设置为服务器总核数 56 28,加快并行收集效率

在堆划分-XX:-UseAdaptiveSizePolicy 采用系统自动适应策略;-XX:SurvivorRatio=28 48 ,尽可能把堆留给年轻对象;-XX:MaxTenuringThreshold=15对象被计数15次才会分配到老年;-XX:TargetSurvivorRatio=95

测试机器都普遍内存多,因此都使用了XX:+UseLargePages -XX:LargePageSizeInBytes=2m 优化大内存

另外-XX:+AggressiveOpts -XX:+AlwaysPreTouch -XX:-UseBiasedLocking这3个指令所有厂商也都不约而同使用

HP惠普还使用-XX:MaxGCPauseMillis=300参数,限制最大一次垃圾收集停顿时间。

总结:JVM调优中最重要还是堆内存的准确预估,可以通过JVM监控来掌握,选择并行垃圾收集普通情况下优于其他串行和并发收集。通过SPEC测试分析可以了解JVM并行收集影响性能最重要的参数,大部分厂商使用的参数基本相同。

文章参考:

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

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

相关文章

Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)

2019独角兽企业重金招聘Python工程师标准>>> 互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的…

java clicked_关于java:JComponents在调用mouseClicked()之后消失

我正在用Swing编写Java GUI程序。该界面如下所示:当用户单击右侧的图片之一时,我希望它的一个小的预览显示在左上角的橙色区域中。我通过SwingWorker线程从计算机上的目录中提取所有图像文件。在SwingWorker的done()方法中,我向每个对象添加了…

vim简单命令教程-firstblood

你想以最快的速度学习人类史上最好的文本编辑器VIM吗?你先得懂得如何在VIM幸存下来,然后一点一点地学习各种戏法。 Vim the Six Billion Dollar editor Better, Stronger, Faster. 学习 vim 并且其会成为你最后一个使用的文本编辑器。没有比这个更好的文…

第三课、Qt的诞生和本质------------------狄泰软件学院

一、GUI用户界面元素 (1)、GUI应用程序是由固定的窗口元素所构成 (2)、操作系统提供了创建用户界面元素所需要的函数 (3)、各自功能不同的函数依次调用,从而创建出界面元素 (4&#…

java mapstring_ object 遍历_ListMapString,Object使用Java代码遍历以获取String,Object的值...

List>的结果集怎么使用Java代码遍历以获取String,Object的值?package excel;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class List1{public static void main(String[] args){Map map…

Linux tar命令高级用法——备份数据

Linux tar命令高级用法——备份数据 2015-12-31 Linux学习Linux上有功能强大的tar命令,tar最初是为了制作磁带备份(tape archive)而设计的,它的作用是把文件和目录备份到磁带中,然后从磁带中提取或恢复文件。现在我们可…

iOS uiviewcontroller 添加另外一个controller的View

需要 添加 [self addChildViewController:vc]; [_mainScrollView addSubview:vc.view];转载于:https://www.cnblogs.com/foolish-guo/p/6385288.html

mysql 即学a又学b_MySQL学习第一天

一、 数据库:*学习重点:创建数据库/向表添加记录/查询记录数据库概念:文件系统(存储和管理)数据库软件介绍:Oracle/MySQL/SQL server…分类:关系型数据库:关系模型组织数据非关系型数据库:键值对关系存储二、 mysql数据的存储方式:一台数据库服务器中会创建很多个数据库(一个项…

Intellij IDEA 快捷键(Mac)

编辑 格式化代码 AltCommandL 大小写切换 ShiftCommandU 包围 AltCommandT 选中代码抽取方法 AltCommandM 调试/运行查看 类关系视图 CommandAltU 查看所有的 TODO Command6 查询方法调用处 AltF7 搜索其它 隐藏 Intellij IDEA CommandH 自动提醒 Alt/(这是我自己设置的)…

Spark RDD算子介绍

Spark学习笔记总结 01. Spark基础 1. 介绍 Spark可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。 Spark是MapReduc…

java 写tb级文件_三管齐下!TB 级文件的上传性能瞬间被优化 100 倍!

作者 | 中华石杉责编 | 伍杏玲本文经授权转载石杉的架构笔记(ID:shishan100)这篇文章我们来看看,世界上最优秀的分布式文件系统HDFS,是如何对超大文件的上传做性能优化的?首先,我们还是通过一张图来看一下文件上传的大…

CentOS7下安装Redis — 单节点

2019独角兽企业重金招聘Python工程师标准>>> 1. 环境准备 安装编译所需要的包: yum install gcc tcl 2. 下载redis http://download.redis.io/releases/redis-3.2.7.tar.gz 3. 安装redis ## 创建redis的安装目录 mkdir /usr/local/redis## 解压redis tar…

笔记本中美化代码的方法

这里向大家推荐一个很好用的记笔记软件,微软的OneNote,这个笔记软件,支持分区和分区组的创建,而且入门简单,界面简洁,很适合从word过渡过来的人来记笔记! 不过如果直接记笔记,对于程序员来说,可能希望代码在笔记本上更好看一些,那么应该怎么办呢?下面提供了在OneNote中,让代码…

工具使用——印象(汇总)

作者:桂。 时间:2017-02-09 23:11:30 链接:http://www.cnblogs.com/xingshansi/articles/6384097.html 说明:转载请注明出处,谢谢。 前言 本文仅仅介绍印象笔记的使用,至于挖掘机哪家强,本文不…

java final修饰属性_Java final关键字用来修饰类、方法、属性

1.final修饰类:这个类不能被继承。如:String类、StringBuffer类、System类。2.final修饰方法:不能被重写。如:Object类的getClass()方法。3.final修饰属性:此属性就是一个常量,一旦初始化就不可再被赋值。习…

SQL SERVER 数据导出JSON

执行下面的存储过程: SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE PROCEDURE[dbo].[SerializeJSON](ParameterSQL AS VARCHAR(MAX))ASBEGINDECLARE SQL NVARCHAR(MAX)DECLARE XMLString VARCHAR(MAX)DECLARE XML XMLDECLARE Paramlist NVARCHAR(1000)SET …

JSP+Javabean+Servlet实现用户注册

在entity包下新建javabean 也就是实体类User 注意id用 Integer 而不用 int, 因为 int 自动初始化为0 public class User { private Integer id; private String username; private String password; 后面是set和get方法... 在Servlet包下创建servlet 右击Servlet…

main的方法是Java_Java中的main()方法

在Java中,main()方法是Java應用程序的入口方法,也就是說,程序在運行的時候,第一個執行的方法就是main()方法,這個方法和其他的方法有很大的不同,比如方法的名字必須是main,方法必須是public sta…

深入理解Python的logging模块:从基础到高级

在Python编程中,日志记录是一种重要的调试和错误追踪工具。Python的logging模块提供了一种灵活的框架,用于发出日志消息,这些消息可以被发送到各种输出源,如控制台、文件、HTTP GET/POST位置等。本文将深入探讨Python的logging模块…

http请求连接

1、在Info.plist中添加NSAppTransportSecurity类型Dictionary。2、在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES转载于:https://www.cnblogs.com/liuting-1204/p/5919233.html