阅读更多

10顶
1踩

编程语言

原创新闻 你必须知道的5个JVM命令行标志

2013-06-26 11:13 by 见习编辑 html5_dev 评论(4) 有18681人浏览

本文是Neward & Associates的总裁Ted Neward为developerworks独家撰稿“你不知道5个……”系列中的一篇,JVM是多数开发人员视为理所当然的Java功能和性能背后的重负荷机器。然而,我们很少有人能理解JVM是如何进行工作的—像任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或JIT编译Java字节码,等等。

不熟悉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垃圾收集器的标志,没有一个非标准命令行标记是专用于生产使用的。但是,作为工具来刺探在其他方面完全不透明的虚拟机的内部工作,是非常有用的。

原文链接:http://wiki.itivy.com/?p=60

来自: 编程文库
10
1
评论 共 4 条 请登录后发表评论
4 楼 Wu_Jiang 2013-09-30 15:41
老外的东西一般写的都比较有意思,看得不爽主要是翻译问题,也有点文化不同导致的,所以试着多读原文吧
3 楼 obullxl 2013-06-29 09:45
semmy 写道
老外的文章怎么感觉看起来有点涩
翻译问题吧?
2 楼 semmy 2013-06-28 09:04
老外的文章怎么感觉看起来有点涩
1 楼 hardPass 2013-06-26 20:28
值得一顶,但要注意,不同厂商的jvm产品的参数不一样。文中一而再的出现Sun字眼,感觉是好老的东西

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 什么是模式?什么是框架?(简述)

                              什么是模式?什么是框架?(简述)                                        ――UB (UB5023@MSN.COM) 2003-6-6   现在软件设计里到处都是模式,框架。有次朋友问什么是模式?我也在学习中,就我的学习经验,给出以下小结。(注意:个人观点,仅供参考,欢迎指正。)1.什么是模式?模式,即p

  • 模式概念、作用和用法的深入理解

    用户的模式(Schema)指的是用户账号拥有的对象集,在概念上可将其看作是包含表、视图、索引和权限定义的对象。在 DM 中,一个用户可以创建多个模式,一个模式中的对象(表、视图等)可以被多个用户使用。模式不是严格分离的,一个用户可以访问他所连接的数据库中有权限访问的任意模式中的对象。

  • 翻译TIPatterns--模式概念(The pattern concept)

    模式概念 “设计模式帮助你从别人的成功经验而不是你自己的失败那里学到更多东西”.或许,面向对象设计领域迈出的最重要的一步就是“设计模式”运动,这一运动被记录整理成“设计模式”一书。那本书展示了23种针对特定类型问题的解决办法。本书将用例子来介绍设计模式的基本概念。这将会激起你阅读Gamma等人所著的《设计模式》一书的兴趣,该书已成为从事面相对象编程的程序员的重要的和几乎必需的“词汇表”

  • 什么是模式、什么是模式识别、模式识别的方法、过程

    学习目标: 提示:这里可以添加学习目标 例如:一周掌握 Java 入门知识 学习内容: 提示:这里可以添加要学的内容 例如: 1、 搭建 Java 开发环境 2、 掌握 Java 基本语法 3、 掌握条件语句 4、 掌握循环语句 学习时间: 提示:这里可以添加计划学习的时间 例如: 1、 周一至周五晚上 7 点—晚上9点 2、 周六上午 9 点-上午 11 点 3、 周日下午 3 点-下午 6 点 学习产出: 提示:这里统计学习计划的总量 例如: 1、 技术笔记 2 遍 2、CSDN 技术博客

  • 什么是模式?

    2019独角兽企业重金招聘Python工程师标准>>> ...

  • 什么是模式

    什么是模式?模式就是经过无数次的实践和失败总结出来的,解决特定场景下的特定问题的解决方案和最佳实践。   对于模式,Pattern Alexander给出了经典定义:   每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心,通过这种方式 你可以无数次地使用那些已有的解决方案 无需再重复相同的工作。   模式作为现实世界中的一个元素,都是以下这三者之间的关系,...

  • 什么是模式? 什么是框架?

    1.什么是模式? 模式,即pattern。其实就是解决某一类问题的方法论。你把解决某类问题的方法总结归纳到理论高度,那就是模式。 Alexander给出的经典定义是:每个模式都描述了一个在我们的环境中不断出现的问题,然后描述了该问题的解决方案的核心。通过这种方式,你可以无数次地使用那些已有的解决方案,无需在重复相同的工作。 模式有不同的领域,建筑领域有建筑模式,软件设计领域也有设计模式。当一个领域

  • 框架和模式有什么区别?

     在Java Web开发中经常看到关于框架和模式,框架和模式有什么区别?MVC是框架还是模式?Struts是模式还是框架?Struts和MVC是什么关系?

  • 框架、模型与模式的区别和意义

      所谓框架、模型与模式     看了这么久的论文,终于明白了这三个概念的区别和具体的意义。在和实验室的同学讨论的同时发现很多同学对这个问题也不是很明确,所以写个小文记录一下。    首先需要说明的是,这个所说的框架、模型和模式都是在看研究性论文的时候经常提到的概念,可能和软件工程领域的对应概念并不完全一致。并且因为水平有限,我的理解也可能是不正确的。首先说说框架。所

  • 模式的定义

    模式的定义: 模式是一种问题的解决思路,它已经适用于一个实践环境,并且可以适用于其他实践环境。 

  • 23种设计模式(概念、原则、场景、优点、缺点、应用)简述

    23种设计模式:简单工厂模式,策略模式、装饰模式、代理模式、工厂方法模式、原型模式、模板方法模式、外观模式、建造者模式、观察者模式、抽象工厂模式、状态模式、适配器模式、备忘录模式、组合模式、迭代器模式、单例模式、桥接模式、命令模式、职责链模式、中介者模式、享元模式、解释器模式、访问者模式。

  • 二 模式概念

    模式概念设计模式帮助你从其他人而非自己的失败中获取成功的经验。-------Mark Johnson或许,迈向OOD领域最重要的一步是设计模式的相关活动,在此基础上出现了GOF《设计模式》3,此书列举出了针对不同问题的23种解决...

  • UB内存池

    什么是BU呢?其实就是单元块,它的作用就是为了实现对频繁申请内存的高效的管理,才实现的一种内存使用的方法,可以很大程度的减少内存碎片,同时也能缩减申请时间,实时的任务使用这种方法相当的高效。 在实际的开发中,有时候我们会频繁的申请大小一定的内存,比如,64,128,256,512,1024,8192,那么我们就为这几种不同长度的内存分配UB块,根据实际需要,不同长度的分配不同数目的UB块,聚合在

  • 浅谈框架与模式的关系

    在javaEE中的开源框架太多了,其实每个框架大部分都是有一些经典的模式演变而来。对大家最熟悉了应该是Struts框架,我们知道它是典型的MVC设计模式的化身。还有我们最熟悉的,也是比较流行的框架Spring。它其实是工厂模式和单例模式的充分应用。框架和模式到底有什么关系呢? 框架是一组相互协作的类,它构成了某类特定软件的可复用设计。框架规定...

  • 框架和模式的区别

    框架模式有哪些?MVC、MTV、MVP等等; 框架有哪些?C++语言的QT、MFC、gtk,Java语言的SSH,php语言的 smarty(MVC模式),python语言的django(MTV模式)等等 设计模式有哪些?工厂模式、适配器模式、策略模式等等 简而言之:框架模式是大智慧,用来对软件设计进行分工;设计模式是小技巧,对具体问题提出解决方案,使得代码复用率和耦合度降低。

  • 构架、框架和设计模式的理解

    一个 架构师 构架了一个框架,约束框架使用者只能使用规定的结构来进行二次开发。架构是指软件结构的专用名词,构架只是架构的另一种叫法。框架是半成品。典型地,框架是系统或子系统的半成品。1、设计模式php编程里,模式,也成为设计模式,主要有工厂模式,单例模式,观察者模式等等,这些模式的理解可以看我博客写的《PHP设计模式》系列。这些设计模式解决了一个问题,就是代码的复用,并且易于扩展。另外还有大家都知...

  • 框架技术概述

        框架的又是就在于:(1) 不用在考虑公共问题,框架已经帮我没做好了 ; (2) 可以专心在业务逻辑上,保证核心业务逻辑的开发质量 ; (3) 结构统一,便于学习,维护; (4) 框架集成了千人的经验,可以帮助"新手"写出稳健,性能优良而且结构优美的高质量程序 .    框架是一个提供了可重用的公共结构的半成品.    Struts 2.0 的作者和JBoss的创始人说:"框架的强大值处不是

Global site tag (gtag.js) - Google Analytics