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&#…

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 说明:转载请注明出处,谢谢。 前言 本文仅仅介绍印象笔记的使用,至于挖掘机哪家强,本文不…

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

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

centos7安装java6_CentOS7.6安装jdk1.8

2、登录Linux服务器,通过rz命令将jdk导入服务器如果没有rz命令 需要先安装lrzszyum install lrzsz -y3、将jdk压缩包解压到指定路径 -C 指定路径4、配置环境变量编辑/etc/profile文件 在末尾加上以下内容 wq保存退出source /etc/profile文件 使配置文件生效export J…

人生苦短,我用python——当我在玩python的时候我玩些什么 -

程序的基本思路 用一个txt文件记录电脑的一天内累计使用时间累计使用时间超过若干小时就会自动关机程序开机自动运行 为什么我最后选择了python 想着怎么写、搜资料的时候就发现Java并不适合,虽然不是不能实现,但有好几个问题解决起来都有点麻烦。对我这…

Twisted入门教程(5)

2019独角兽企业重金招聘Python工程师标准>>> 第五部分:由Twited支持的诗歌下载服务客户端 你可以从这里从头开始阅读这个系列 抽象地构建客户端 在第四部分中,我们构建了第一个使用Twisted的客户端。它确实能很好地工作,但仍有提高…

**print('人生苦短 我爱Python')**

print(‘人生苦短 我爱Python’) 一、变量 **""" 1.代码自上而下执行 2_运算符和表达式.一行一句,不要把多个语句写到一行上,可读性不好 3中文只能出现在引号里,其他地方不能出现中文 4不能随意缩进 """**pr…

笔记本(华硕UL80VT)软件超频setFSB

Warning !!!If you are a beginner, do not use this software. This software is for power users only. Use "SetFSB.exe" at your own risk.试了setfsb各种版本,基本不能打开。还有官网的免费版,居然不能用,真是很奇怪。 官网&a…

Node.js~在linux上的部署

我们以centOS为例来说说如何部署node.js环境 一 打开centos,然后开始下载node.js包 curl --silent --location https://rpm.nodesource.com/setup_6.x | bash - yum -y install nodejs 二 安装gcc环境 yum install gcc-c make 安装完成! 三 安装nodejs的npm,这是一个包程序工具…

LeetCode题解-3-Longest Substring Without Repeating Characters

2019独角兽企业重金招聘Python工程师标准>>> 解题思路 首先要读懂题目,它要求的是找到最长的子串,并且子串中没有出现重复的字符。 我的想法,是用一个map存储每个字符最后出现的位置,还要有个变量start,它用…

java从哪学到哪_Java JVM怎么学习啊?从哪方面入手?

叮当猫咪一、 JVM的生命周期  1. JVM实例对应了一个独立运行的java程序它是进程级别  a) 启动。启动一个Java程序时,一个JVM实例就产生了,任何一个拥有public static void main(String[] args)函数的class都可以作为JVM实例运行的起点  b) 运行。m…

JMeter处理Cookie与Session

cookie 和session 的区别: 1、cookie数据存放在客户的浏览器上,session数据放在服务器上。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗 考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当…

Maximum sum(poj 2479)

题意:给一段数列,将这个数列分成两部分,使两部分的最大子段和的和最大,输出和/*看数据没想到是(O)n的算法,求出从前向后的最大子段和和从后向前的最大子段和,然后枚举断点。 第一次提交不小心折在数组最小值…