jvm默认的初始化参数

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

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

JVM默认选项

第一站 :JVM尝试确定是否 它正在客户端环境的服务器上运行。 它通过研究体系结构和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

jvm默认的初始化参数

jvm默认的初始化参数_您是否应该信任JVM中的默认设置?相关推荐

  1. delphi 异步 调用 带参数_如何在 Spring 异步调用中传递上下文

    什么是异步调用? 异步调用是相对于同步调用而言的,同步调用是指程序按预定顺序一步步执行,每一步必须等到上一步执行完后才能执行,异步调用则无需等待上一步程序执行完即可执行.异步调用指,在程序在执行时,无 ...

  2. sql数据库备份默认路径_在Linux上SQL Server中更改默认数据库文件和备份路径

    sql数据库备份默认路径 In a previous article, we explored the process to change default SQL dump file location ...

  3. java小数的数据类型_【填空题】Java 中小数默认的数据类型为 ,如果要指定为 类型,要在小数后面加F或f。...

    [填空题]Java 中小数默认的数据类型为 ,如果要指定为 类型,要在小数后面加F或f. 更多相关问题 - Your plan is perfect and I believe that it wil ...

  4. linux更改默认版本,linux - 将某个软件版本设为ubuntu中的默认版本 - Ubuntu问答

    问题描述 我目前在Ubuntu 12.04上安装了2个版本的php. 一个用于使用apt-get安装的php 5.3,另一个用于xampp与php 5.5一起安装 当我执行这些命令时: > wh ...

  5. bn层初始化参数_神经网络参数初始化方式

    看了文章<Understanding the difficulty of training deep feedforward neural networks>,里面提出了两种参数初始化的方 ...

  6. java 初始化参数_我们如何在Java中的对象参数中初始化数组?

    您可以使用构造函数或使用setter方法来初始化与其他任何值一样在类内部声明的数组变量. 示例 在下面的Java示例中,我们声明一个数组类型的实例变量,并从构造函数中对其进行初始化.public cl ...

  7. jsp select初始化赋值_分别在javascript和JSP中动态设置下拉列表默认值

    一.JavaScript中动态设置select标签中选项的默认值: 比如,要完成下边这个下拉列表的动态显示,并且当进行前后翻页时,下拉列表中的值自动更新为当前页码: 图1 jsp部分代码如下: 图2 ...

  8. python函数如何实现可变参数_【已解决】Python中实现可变参数的函数

    [问题] Python中,希望实现一个可变参数的函数. [解决过程] 相关代码如下:(extractOK, extractedBlogUser, generatedBlogEntryUrl) = ca ...

  9. python类方法需要传入cls参数_如何从Python 3.x中的类定义传递参数到元类?

    这是如何从类定义向元类传递参数的python 3.x版本?问题,根据请求单独列出,因为答案与python 2.x明显不同. 在python 3.x中,如何将参数传递给元类的__prepare__.__ ...

最新文章

  1. three.js两个点给线条加宽度_108m2家里镶金线条,就是不一样,装出大宅范!太美了!晒晒...
  2. MongoDB警告信息
  3. c语言随机产生四位数,习题:随机产生N个四位正整数,将其中的素数选出,并升序排列之输…...
  4. 暴风影音xp版本_暴风影音黯然退市!怀念那些年用过的播放器
  5. getch函数的使用与说明
  6. iso 9000下载_ISO 9000 | 软件工程
  7. web前端设计必备网页特效案例 - 轮播图
  8. Linux网络编程必学的TCP/IP协议——图解分层(通俗易懂)【建议新手收藏】
  9. 基于STM32的医院呼叫系统设计
  10. 数据的展现技巧——数据透视表(一)
  11. shell中变量截取
  12. 多行文字内容溢出显示点点点(...)省略号
  13. python把两个图片合成一张图
  14. java里equal与equals_Java中关于==与equal和equals的区别
  15. 阿里巴巴 暑假实习 笔试题(2014年3月29日)
  16. php木马导致服务器流出流量很高的排查及临时解决方法
  17. python高分书籍推荐_史上最全的Python书排行榜|你想知道的都在这里
  18. WinForm控件之【NotifyIcon】
  19. Avast创始人:杀毒软件都将免费
  20. 浙江省计算机二级题库excel,2014年浙江省计算机二级题库Excel03

热门文章

  1. Java经典面试题一
  2. JVM菜鸟进阶高手之路
  3. 接口 Closeable
  4. 用指针完成函数参数的调用
  5. 祝我们的所有女孩子,女生节快乐~
  6. 2018蓝桥杯省赛---java---C---4( 第几个幸运数)
  7. c# 向mysql插入数据_C#连接mysql数据库 及向表中插入数据的方法
  8. MySQL日志:binlog、事务日志(redo、undo)
  9. Java8 Lambda总结
  10. java oca_OCA第6部分中的Java难题