阅读更多

10顶
1踩

编程语言

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

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

本文是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字眼,感觉是好老的东西

发表评论

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

相关推荐

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

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

  • 模式简介

    什么是模式    每个模式描述了一个在我们周围不断重复发生的问题以及该问题解决方案的核心。这样,你就能一次有一次地使用这个方案而不必重复劳动。[Alexander et al]模式的核心是特定的解决方案,它有效而且有足够的通用性,能解决重复出现的问题。模式的关键点在于他们源于实践。必须观察人们的工作过程,发现其中好的设计,并找出“这些解决方案的核心”。面向对象编程与模式面向对象

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

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

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

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

  • 设计模式——装饰模式(Decorator)

    要想正确理解设计模式,首先必须明确它是为了解决什么问题而提出来的。 设计模式学习笔记 ——Shulin 转载请注明出处:http://blog.csdn.net/zhshulin 1、概念         装饰模式又名包装(Wrapper)模式。装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案。         但是纯粹的装饰模式很难找到,大多数的装饰模式的实现

  • Java设计(单例)模式+初涉线程+计算每个单词出现的次数+归并和效率

    大纲 一、设计(单例)模式 二、初涉线程 三、初涉异常 四、计算每个单词出现的次数 五、归并和效率

  • 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模式)等等 设计模式有哪些?工厂模式、适配器模式、策略模式等等 简而言之:框架模式是大智慧,用来对软件设计进行分工;设计模式是小技巧,对具体问题提出解决方案,使得代码复用率和耦合度降低。

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

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

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

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

  • 简述什么是框架

    框架(framework),简单来说就是可被开发者应用的骨架,好比框架是一个舞台,开发者就是演员,开发者借助舞台完成自己的表演。演员想要完成一场表演需要自己搭建舞台是很费工夫的,框架就为演员提供了很大的便利,演员只需要展现自己的技巧逻辑就可以了,一些基础的设施框架都会为演员提供。也可以理解为,框架就是某个应用的半成品,开发者只需把自己想表达的另一半展现出来即可。 为什么要用框架,因为现在要想真正

  • 二 模式概念

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

  • 数据模式(Schema)定义

    数据模式(Schema)定义 Created 星期一 24 十月 2016 模式(Schema)定义了一个多维数据库,它包一个含逻辑模型,并定义了逻辑模型到物理模型的映射。物理模型包含多维数据的存储方式:事实表、维表及其结构等。逻辑模型包含了用于MDX 查询的结构,如数据立方体、维度、层次、成员、度量等。Mondrian 使用一个XML 文件来描述模式。Mondrian 包含一个创建、修改模

  • 二、模式的定义

    1.   一个数据库实例:       a. 接下来的内容都是围绕该实例进行讲解的;       b. 实例内容:            i.   数据库为学生-课程数据库,命名为Student_Course;            ii.  数据库中定义一个学生-课程模式,命名为S-T;            iii. 模式中有三张表,分别为:                  *1

  • SIMPASS技术解析

    一、什么叫SIMPASS SIMpass技术融合了DI卡技术和SIM卡技术,或者称为双界面SIM卡。SIMpass是一种多功能的SIM卡,支持接触与非接触两个工作接口,接触界面实现SIM功能,非接触界面实现支付功能,兼容多个智能卡应用规范。 二、特点 从技术角度来讲SIMPASS就是NFC技术 应用上来讲,就是将NFC芯片集成到SIM卡里,将天线外置通过柔性PCB相

  • java获取微信用户openid

    按照惯例,先是官方传送门:https://developers.weixin.qq.com/miniprogram/dev/api/api-login.html1.登录流程介绍调用微信开放接口wx.login获取一个临时的登录凭证code微信小程序通过https请求访问自己的服务器,服务器携带登录凭证code以及小程序的appid和appsecret从微信服务器中获取openid和session_...

  • 各种模式的描述

    单例模式(Singleton):确保有且只有一个对象被创建。 抽象工厂模式(Abstract Factory):允许客户创建对象的家族,而无需指定他们的具体类。 工厂方法模式(Factory Method):由子类决定要创建的具体类是哪一个。 装饰者模式(Decorator):包装一个对象,以提供新的行为。 状态模式(State):封装了基于状态的行为,并使用委托在行为之间切换。 迭代器模式(Iterator):在对象的集合之中游走,而不暴露集合的实现。 外观模式(Facade):简

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

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

  • 设计模式详解之策略模式

    策略模式是一种应用广泛的行为型模式,核心思想是对算法进行封装,委派给不同对象来管理,本文将着眼于策略模式进行分享。

Global site tag (gtag.js) - Google Analytics