您是否应该信任JVM中的默认设置?

如今,JVM被认为是智能的。 预期不会进行太多配置–只需设置要在启动脚本中使用的最大堆,您就可以进行了。 所有其他默认设置都很好。 大概我们当中有些人误以为。 实际上,在运行时期间发生了很多事情,无法自动调整性能,因此,在我最近面对的一个案例研究中,我将带您逐步了解要调整的内容和时间。

但是在讨论案例本身之前,先介绍了有关JVM内部的一些背景知识。 以下所有内容均与Oracle Hotspot 7有关。 其他供应商或更早版本的Hotspot JVM很有可能带有不同的默认值。

JVM默认选项

第一站 :JVM尝试确定是否 JVM configuration 它正在客户端环境的服务器上运行。 它通过查看体系结构和OS组合来做到这一点。 简单总结:

建筑 CPU /内存 操作系统 默认
i586 任何 微软视窗 客户
AMD64 任何 任何 服务器
64位SPARC 任何 的Solaris 服务器
32位SPARC 2个以上内核和> 2GB RAM 的Solaris 服务器
32位SPARC 1核或<2GB RAM 的Solaris 客户
i568 2个以上内核和> 2GB RAM Linux或Solaris 服务器
i568 1核或<2GB RAM Linux或Solaris 客户

例如,如果您在32位Linux上的Amazone EC2 m1.medium实例上运行,则默认情况下,您将被视为在客户端计算机上运行。

这很重要,因为JVM在客户端和服务器上的优化方式完全不同-在客户端计算机上,它尝试减少启动时间,并在启动过程中跳过一些优化。 在服务器环境上,会牺牲一些启动时间来稍后实现更高的吞吐量。

第二组默认值 :堆大小。 如果您的环境被认为是根据先前准则确定的服务器,则分配的初始堆将是计算机上可用内存的1/64。 在4G机器上,这意味着您的初始堆大小将为64MB。 如果在极低的内存条件下(<1GB)运行,它可能会更小,但是在这种情况下,我将严重怀疑您在做任何合理的事情。 在这个千年中,还没有看到内存少于千兆字节的服务器。 如果有的话,我会提醒您,如今1 GB的DDR成本不到20美元……

但这将是初始堆大小。 最大堆大小将是可用总内存的¼或1GB中的最小值。 因此,在我们的1.7GB Amazon EC2 m1.small实例中,可用于JVM的最大堆大小约为435MB。

下一步 :使用默认垃圾收集器。 如果认为您正在客户端JVM上运行,则JVM所应用的默认值为串行GC( -XX:+ UseSerialGC )。 在服务器级计算机上(同样,请参见第一部分),默认值为并行GC( -XX:+ UseParallelGC )。

默认值还有很多其他事情,例如PermGen的大小,不同的世代调整,GC暂停限制等。但是为了使帖子的大小受到控制,请坚持使用上述配置。 对于好奇的用户-您可以从以下材料中进一步了解默认值:

  • http://www.oracle.com/technetwork/java/javase/tech/vmoptions-jsp-140102.html
  • http://docs.oracle.com/javase/7/docs/technotes/guides/vm/gc-ergonomics.html
  • http://docs.oracle.com/javase/7/docs/technotes/guides/vm/server-class.html

案例分析

现在让我们看一下案例研究的行为。 以及我们是否应该凭借决策信任JVM还是跳入我们自己。

我们手头的应用程序是一个问题跟踪器。 即JIRA 。 这是一个在后端具有关系数据库的Web应用程序。 部署在Tomcat上。 在我们的一种客户端环境中表现不佳。 并不是由于任何泄漏,而是由于部署中的不同配置问题。 由于GC暂停时间特别长,这种行为不当的配置导致吞吐量和延迟方面的重大损失。 我们设法帮助了客户,但是出于隐私考虑,我们将不在此处介绍确切的详细信息。 但是案例很好,因此我们继续下载了JIRA ,以演示我们从此实际案例研究中发现的一些概念。

Atlassian的特别之处在于,这些家伙已经附带了一些打包好的负载测试 。 因此,我们有一个基准可用于我们的配置。

我们仔细拆箱了我们新收购的JIRA的包装,并将其安装在64位Linux Amazon EC2 m1.medium实例上。 并进行捆绑测试 。 无需更改默认值。 Atlassian小组将其设置为-Xms256m -Xmx768m -XX:MaxPermSize = 256m

在每次运行期间,我们使用-XX:+ PrintGCTimeStamps -Xloggc:/tmp/gc.log -XX:+ PrintGCDetails收集了GC日志,并在GCViewer的帮助下分析了此统计信息。

结果实际上还不错。 我们将测试运行了一个小时,然后由于垃圾收集暂停而损失了仅151秒 。 占总运行时间的4.2%。 在最坏的情况下,gc的暂停时间为2秒 。 因此,GC暂停会影响此特定应用程序的吞吐量和延迟。 但不要太多。 但是足以作为本案例研究的基准–在我们的实际客户中,GC暂停时间长达25秒。

挖掘GC日志浮出了水面。 Full GC的大多数运行都是由PermGen大小随时间扩展而引起的。 日志显示,测试期间总共使用了大约155MB的PermGen。 因此,通过在启动脚本中添加-XX:PermSize = 170m ,我们将PermGen的初始大小增加到比实际使用的大小更多。 这使总的暂停时间从151秒减少到134秒 。 并将最大等待时间从2,000ms减少到1300ms

然后我们发现了完全出乎意料的事情。 我们的JVM使用的GC实际上是串行GC。 如果您认真地遵循了我们的文章,则情况并非如此-64位Linux机器应始终被视为服务器级机器,并且所使用的GC应该是并行GC。 但显然并非如此。 到目前为止,我们最好的猜测是–即使JVM以服务器模式启动,它仍然会根据可用的内存和内核来选择所使用的GC。 由于此m1.medium实例具有3.75GB内存,但只有一个虚拟内核,因此所选的GC仍是串行的。 但是,如果你们对这个话题有更多的见解,我们渴望找到更多。

尽管如此,我们将算法更改为-XX:+ UseParallelGC并重新运行测试。 结果–累积的停顿进一步减少到92秒最坏情况的延迟也减少到了1200ms

对于最终测试,我们尝试尝试并发标记和扫描模式。 但是该算法对我们完全失败了–暂停时间增加到300秒,延迟增加到5,000毫秒以上。 在这里,我们放弃了,决定叫它一个晚上。

因此,仅使用两个JVM启动参数并花费几个小时来配置和解释结果,我们就有效地提高了应用程序的吞吐量和延迟。 绝对数字听起来并不令人印象深刻– GC暂停从151秒减少到92秒,最坏情况下的延迟从2,000ms减少到1200ms ,但是请记住,这只是一个只有两个配置设置的小型测试。 从%的角度来看–嘿,我们都提高了与GC暂停相关的吞吐量,并将延迟减少了40%

无论如何,我们现在再有一个案例向您展示,性能调整就是关于设定目标,进行测量,调整和重新测量。 也许您和我们一样幸运,只需更改两个配置选项就可以使您的用户更快乐40%……

参考: 您是否应该信任JVM中的默认设置? 由我们的JCG合作伙伴 Nikita Salnikov Tarnovski在Plumbr Blog博客上获得。

翻译自: https://www.javacodegeeks.com/2012/12/should-you-trust-the-default-settings-in-jvm.html

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

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

相关文章

【翻译】A Next-Generation Smart Contract and Decentralized Application Platform

原文链接&#xff1a;https://github.com/ethereum/wiki/wiki/White-Paper 当中本聪在2009年1月启动比特币区块链时&#xff0c;他同时向世界引入了两种未经测试的革命性的新概念。第一种就是比特币&#xff08;bitcoin&#xff09;&#xff0c;一种去中心化的点对点的网上货币…

SAS Fuctions

1. monotonic(), 单调递增函数。返回一列变量的序列等&#xff0c;类似于_N_ 。 2. index v indexw: INDEX Function Searches a character expression for a string of characters, and returns the position of the string’s first character for the first occurrence of t…

循环内的局部变量和性能

总览 有时会出现一个问题&#xff0c;即分配一个新的局部变量需要花费多少工作。 我的感觉一直是&#xff0c;代码已优化到成本为静态的程度&#xff0c;即一次执行&#xff0c;而不是每次运行时都执行。 最近&#xff0c; Ishwor Gurung建议考虑将一些局部变量移出循环。 我怀…

CSS3伪元素、伪类选择器

伪元素选择器&#xff1a; ::first-letter:为某个元素中的文字的首字母或第一个字使用样式。 ::first-line:为某个元素的第一行文字使用样式。 ::before:在某个元素之前插入一些内容。 ::after:在某个元素之后插入一些内容 ::selection:匹配元素中被用户选中或处于高亮状态的部…

bzoj1212: [HNOI2004]L语言

这又是什么神题啊。 这题一眼AC机。然后呢企鹅也是这么想的。 写完发现企鹅看错题了。然后其实建字典树就行了。 弄个v数组表示能否匹配到第i个位置。然后因为字典里的串很短&#xff0c;就判一下前面L&#xff08;表示字典里最长那个串的长度&#xff09;个位置能否匹配&#…

css小随笔(二)与通用样式

51先在学校HTML5已经有半个多月了&#xff0c;然后这个星期做了一个京东的手机网站&#xff0c;接触到了通用样式&#xff0c;下面以京东的手机站为例 这两个就是京东手机站了的不同的两个板块&#xff0c;因为HTML5仅仅只是学完了基本标签跟css的标签&#xff0c;所以在没有接…

增加堆大小–谨防眼镜蛇效应

“眼镜蛇效应”一词源于英国殖民印度统治英国时所产生的轶事。 英国政府担心毒蛇眼镜蛇的数量。 因此&#xff0c;政府对每条死蛇给予悬赏。 最初&#xff0c;这是一个成功的策略&#xff0c;因为大量蛇被杀死以获取奖励。 最终&#xff0c;印度人开始养殖眼镜蛇以赚取收入。 …

label 标签里面元素点击事件

想做一个单击显示&#xff0c;单击消失的效果&#xff0c;两个元素都在label标签里面&#xff0c;通过打log发现&#xff0c;当点击消失的时候&#xff0c;先执行了消失的单击事件&#xff0c;有执行了出现的单击事件&#xff0c;所以元素并没有消失&#xff0c;这个出现的原因…

java contenttype_POST不同提交方式对应的Content-Type,及java服务器接收参数方式

简介:Content-Type(MediaType)&#xff0c;即是Internet Media Type&#xff0c;互联网媒体类型&#xff1b;也叫做MIME类型&#xff0c;在Http协议消息头中&#xff0c;使用Content-Type来表示具体请求中的媒体类型信息.参考response.Header里常见Content-Type一般有以下四种&…

Java 进程占用 VIRT 虚拟内存超高的问题研究

一、现象说明 最近发现线上机器java 7(openjdk)进程的 VIRT 虚拟内存使用达到了 50G&#xff0c;如下所示&#xff1a; PID    USER  PR NI VIRT  RES SHR S   %CPU   %MEM   TIME   COMMAND 3130   tomcat  20 0 9128m  1.4g 6544 S…

如何创建可扩展的Java应用程序

开放的扩展使许多应用程序受益。 这篇文章描述了两种在Java中实现这种可扩展性的方法。 可扩展的应用 可扩展应用程序是可以扩展其功能而不必重新编译它们 &#xff0c;有时甚至不必重新启动它们的应用程序。 只需将jar添加到类路径中&#xff0c;或通过更复杂的安装过程来实现…

聊聊一直困扰前端程序员的浏览器兼容-【css】

1.为什么会出现浏览器兼容问题&#xff1f; 由于各大主流浏览器由不同的厂家开发&#xff0c;所用的核心架构和代码也很难重和&#xff0c;这就为各种莫名其妙的Bug(代码错误&#xff09;提供了温床。再加上各大厂商出于自身利益考虑而设置的种种技术壁垒&#xff0c;让CSS应用…

权限提升

UACMe – Defeat Windows User Account Control (UAC) https://github.com/hfiref0x/UACME MiniHook Lib project https://github.com/TsudaKageyu/minhook CrackMapExec – Active Directory Post-Exploitation Tool https://www.darknet.org.uk/2017/07/crackmapexec-active-…

java getrealpath_JavaEE路径陷阱之getRealPath

绝对不要使用ServletContext的getRealPath方法获取Web应用的路径&#xff01;应该使用ServletContext的getResource()方法&#xff0c;直接使用相对于Web应用根目录的相对路径来获取资源。ServletContext接口中定位资源的方法getResourcejava.net.URL getResource(java.lang.St…

与客户患难与共

在採訪Werner Vogels&#xff08;亚马逊的首席技术官&#xff09;的过程中&#xff0c;他描写叙述了亚马逊的开发者是怎样跟他们的用户保持沟通的&#xff1a;记住。我们的大部分开发者都跟客户保持着良好的接触&#xff0c;因此他们对“客户喜欢什么”、“客户不喜欢什么”、“…

Camel 2.11 –没有Spring的Camel Web应用程序

在撰写本文时&#xff0c;我们刚刚向即将到来的Apache Camel 2.11添加了一个新组件&#xff0c;该组件允许使用Camel运行Web应用程序&#xff0c;而不必依赖Spring Framework来加速Camel。 或与此相关的任何其他第三方框架。 有点as愧地说&#xff0c;在2013年&#xff0c;我们…

关于盒模型的一点总结

标准w3c盒模型图示 关于怪异盒模型和标准盒模型的对比 关于怪异盒模型盒标准盒模型之间的转换

Day 9 函数的初识1

def my_len(): l1 [1,2,3,5,6] print(111) print(222) return print(333)print(my_len())一、函数的定义1.遇到return &#xff0c;此函数结束&#xff0c;if 不在向下进行:2.return 的返回值 1. 不写return 返回为none 2. return non &#xff0c;和1 …

java 反射机制性能_Java反射机制的用途和缺点

Java反射机制的用途和缺点反射的用途 Uses of ReflectionReflection is commonly used by programs which require the ability toexamine or modify theruntime behavior of applications running in the Java virtual machine. Thisis a relatively advancedfeature and shou…

最近的生活

这个暑假主要时间都在公司实习&#xff0c;没有去自己学习很新的一些技术&#xff0c;因为现在这个公司的技术栈不是特别的新&#xff0c;不过实习了一段时间发现&#xff0c;其实技术栈新不新和你一个新手根本就没有半毛钱关系&#xff0c;根基不牢学什么白搭是吧 举个例子&am…