不熟悉JVM将不仅会影响应用程序性能,而且当JVM出问题时,尝试修复也会很困难。

本文将介绍一些命令行标志,您可以使用它们来诊断和调优您的Java虚拟机性能。

1.DisableExplicitGC

我已记不清有多少次用户要求我就应用程序性能问题提供咨询了,其实只要跨代码快速运行grep,就会发现清单1所示的问题—原始Java性能反模式:

清单 1. System.gc;

// We just released a bunch of objects, so tell the stupid // garbage collector to collect them already! System.gc;

显式垃圾收集是一个非常糟糕的主意——就像将您和一个疯狂的×××犬锁在一个电话亭里。尽管调用的语法是依赖实现的,但如果您的JVM正在运行一个分代的垃圾回收器(大多数是)System.gc;强迫VM执行一个堆的“全部清扫”,虽然有的没有必要。全部清扫比一个常规GC操作要昂贵好几个数量级,这只是个简单数学问题。

您可以不把我的话放在心上—Sun的工程师为这个特殊的人工错误提供一个JVM标志;-XX:+DisableExplicitGC标志自动将System.gc调用转换成一个空操作,为您提供运行代码的机会,您自己看看System.gc对于整个JVM执行有害还是有利。

2.HeapDumpOnOutOfMemoryError

您有没有经历过这样的情况:JVM不能使用,不断抛出OutOfMemoryError,而您又不能为自己创建调试器来捕获它或查看出现了什么问题?像这类偶发和/或不确定的问题,通常使开发人员发疯。

买者自负

并不是任何VM都支持所有命令行标志,Sun/Oracle的VM除外。查明一个标志是否被支持的最好方法是试用它,看它是否正常工作。倘若这些标志在技术上是不支持的,那么,使用它们您要承担全部责任。如果这些标志中的任何一个使您的代码、您的数据、您的服务器或您的一切消失得无影无踪,我、Sun/Oracle和IBM都将不负责任。为以防万一,建议先在虚拟(非常生产)环境中实验。

在这个时刻您想要的是,在JVM消亡之际捕获堆的一个快照——正好-XX:+HeapDumpOnOutOfMemoryError命令可以完成这一操作。

运行该命令通知JVM拍摄一个“堆转储快照”,并将其保存在一个文件中以便处理,通常使用jhat实用工具(我在上一篇文章中介绍过)。您可以使用相应的-XX:HeapDumpPath标志指定到保存文件的实际路径。(不管文件保存在哪,务必确保文件系统和/或Java流程必须要有权限配置,可以在其中写入。)

3.bootclasspath

定期将一个类放入类路径是很有帮助的,这类路径与库存JRE附带的类路径或者以某种方式扩展的JRE类路径略有不同。(新Java Crypto API提供商就是一个例子)。如果您想要扩展JRE,那么您定制的实现必须可以使用引导程序ClassLoader,该引导程序可以加载rt.jar中的 java.lang.Object及其所有相关文件。

尽管您可以非法打开rt.jar并将您的定制实现或新数据包移入其中,但从技术上您就违反了您下载JDK时同意的协议了。

相反,使用JVM自己的-Xbootclasspath选项,以及皮肤-Xbootclasspath/p和-Xbootclasspath/a。

-Xbootclasspath使您可以设置完整的引导类路径(这通常包括一个对rt.jar的引用),以及一些其他JDK附带的(不是 rt.jar的一部分)JAR文件。-Xbootclasspath/p将值前置到现有bootclasspath中,并将 -Xbootclasspath/a附加到其中。

例如,如果您修改了库中的java.lang.Integer,并将修改放在一个子路径mods下,那么-Xbootclasspath/amods参数将新Integer放在默认的参数前面。

4.verbose

对于虚拟的或任何类型的Java应用程序,-verbose是一个很有用的一级诊断使用程序。该标志有三个子标志:gc、class和jni。

开发人员尝试寻找是否 JVM 垃圾收集器发生故障或者导致性能低下,通常首先要做的就是执行 gc。不幸的是,解释 gc 输出很麻烦 — 足够写一本书。更糟糕的是,在命令行中打印的输出在不同的 Java 版本中或者不在不同的 JVM 中会发生改变,这使得正确解释变得更难。

一般来说,如果垃圾收集器是一个分代收集器(多数“企业级”VMs都是)。某种虚拟标志将会出现,来指出一个全部清扫GC通路;在Sun JVM中,标志在GC输出行的开始以“[FullGC...]”形式出现。

想要诊断ClassLoader和/或不匹配的类冲突,class可以帮上大忙。它不仅报告类何时加载,还报告类从何处加载,包括到JAR的路径(如果来自JAR)。

jni很少使用,除了使用JNI或本地库时。打开时,它将报告各种JNI事件,比如,本地库何时加载,方法何时弹回;再一次强调,在不同JVM版本中,输出会发生变化。

5.Command-line-X

我列出了JVM中提供的我喜欢的命令行选项,但是还有一些更多的需要您自己发现,运行命令行参数-X,列出JVM提供的所有非标准(但大部分都是安全的)参数—例如:

-Xint,在解释模式下运行JVM(对于测试JIT编译器实际上是否对您的代码起作用或者验证是否JIT编译器中有一个bug,这都很有用)。

-Xloggc:,和-verbose:gc做同样的事,但是记录一个文件而不输出到命令行窗口。

JVM命令行选项时常发生变化,因此,定期查看是一个好主意。甚至,您深夜盯着监控器和下午5点回家和妻子孩子吃顿晚饭,(或者在Mass Effect 2中消灭您的敌人,根据您的喜好),它们都是不一样的。

结束语

在生产环境中,命令行标志不是为永久使用而设计的——事实上,除了您终止用来调优JVM垃圾收集器的标志,没有一个非标准命令行标记是专用于生产使用的。但是,作为工具来刺探在其他方面完全不透明的虚拟机的内部工作,是非常有用的。

转载于:https://blog.51cto.com/lucifer119/1623461

每个Java程序员必须知道的5个JVM命令行标志相关推荐

  1. Java程序员必须知道的Java10特性

    在上一篇我们对Java 9的特性进行了一些回顾,今天接着来看看Java 10带来了什么特性.之所以需要把Java 8 到Java 17的特性归纳一遍,因为Java社区对Java 17的重视程度前所未有 ...

  2. 程序员必须知道的HTML常用代码有哪些?

    HTML即超文本标记语言,是目前应用最为广泛的语言之一,是组成一个网页的主要语言.在现今这个HTML5华丽丽地占领了整个互联网的时候,如果想要通过网页抓住浏览者的眼球光靠因循守旧是不行的,程序猿们需要 ...

  3. 有理想的程序员必须知道的15件事

    作为程序员,要取得非凡成就需要记住的15件事. 1.走一条不一样的路 在有利于自己的市场中竞争,如果你满足于"泯然众人矣",那恐怕就得跟那些低工资国家的程序员们同场竞技了. 2.了 ...

  4. 程序员必须知道的15件事(转)

    1.走一条不一样的路 在有利于自己的市场中竞争,如果你满足于"泯然众人矣",那恐怕就得跟那些低工资国家的程序员们同场竞技了. 2.了解自己的公司 以我在医院.咨询公司.物流企业以及 ...

  5. 程序员必须知道的Oracle索引知识

    关系数据库的精髓就是通过关系表进行规范化的数据存储,通过各种表连接技术和各种类型的索引技术来进行信息的检索和处理.合理的索引是保证各种操作快速.高效的关键.据统计,与数据库有关的性能问题,70%是因为 ...

  6. 新人程序员必须知道的,不然等你回过神来的时候,一切已晚矣。

    引言 看到这个标题的时候,相信大部分人的第一反应一定是:卧槽!标题党来了! 是的,你猜对了,-_-. 其实之所以写这篇文章,是因为有一个读者,遇到了人生中一次比较重要的抉择,因而来咨询LZ,而LZ恰好 ...

  7. 程序员必须知道的:除了那些离职的神理由

    又到了过年,一年的工作让有些人开始对自己的工作逐渐的不满,新的一年希望有一个新的工作环境.这个时间就会有一部分的朋友开始想要准备辞职了,每年的离职报告大家的理由都会给人一种啼笑皆非的感觉.程序员,一个 ...

  8. 程序员必须知道的25个网站

    一.技术提升 GitHub 程序员托管代码的平台,很多开发者都会在上面找各种各样的开源项目来学习.阿里.腾讯.字节跳动.美团.Google.Micosoft等国内外大厂都有自己的Github开源库. ...

  9. 工具推荐|程序员必须知道的11款新型编程工具

    对于开发人员来说,工具是至关重要的.工具可以使开发人员的日常工作更加轻松.高效,因为只要关注最重要的事情即可.对于开发人员来说,想要寻找到更好的替代工具往往比坚持使用熟悉的.过时的工具要困难得多. 在 ...

最新文章

  1. 算法在ros中应用_烟火检测算法——中伟视界人工智能算法AI在智慧工地、石油中的应用_腾讯新闻...
  2. python3 socks.wrap_module方法 针对单个模块进行代理设置
  3. 带有Java和Axis2的JSON Web服务
  4. 特别慢_背什么都特别慢,该怎么提高记忆力?
  5. 计算机网络安全-RSA加密原理
  6. H5实现俄罗斯方块(一)
  7. vue页面按钮点击后,呈现loading加载状态
  8. src refspec xxx does not match any
  9. 用C#写XML类型的配置文件:
  10. 【天梯选拔月赛】寻宝路线(dp)
  11. 爱好-超级IP:超级IP
  12. OLD:用于单变量和多变量异常值检测的SPSS宏
  13. 阿里云 ADAM 迁移工具测试问题记录
  14. 对本课程的期望以及教学建议
  15. linux 下搭建portal服务器搭建,Linux环境下IBM WebSphere Portal v8.5独立服务器安装记录...
  16. 超硬核万字!web前端学霸笔记,学完就去找工作吧
  17. 安徽省2019c语言二级答案,安徽省计算机等级二级考试真题C语言.doc
  18. spring cloud服务之间的调用Fegin
  19. 我不得不离开字节跳动
  20. PDF虚拟打印机怎么打印成PDF文件

热门文章

  1. 顶尖黑客集结令 | GeekPwn2018上海站邀你“决战AI安全”
  2. 7天速成、免费学习,这套Python入门课我收藏了丨资源帖
  3. 谷歌有只AI,自动给黑白视频上色,走到哪它都认识你
  4. 震惊!腾讯要建AI鹅厂,百度让狗刷脸购物,锤子R-1真机披露
  5. 马化腾最新演讲谈机遇:让所有企业在云端利用AI处理大数据
  6. opencv进行5种图像变化:
  7. 数组常用方法:是否改变原数组
  8. PHP的分页原理和简单实例
  9. 湖南卫视小年夜春晚-2013湖南卫视小年夜直播【直播视频现场高清完整版____
  10. RedHat Linux 加入域