本文主要和大家分享Java程序员必须知道的JVM命令行标志。帮助大家理解JVM的工作原理:任务分配和垃圾收集、转动线程、打开和关闭文件、中断和/或JIT编译Java字节码等等。希望大家通过这些命令行标志,更好的诊断和调优自己的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
并不是任何VM都支持所有命令行标志,Sun/Oracle的VM除外。查明一个标志是否被支持的最好方法是试用它,看它是否正常工作。倘若这些标志在技术上是不支持的,那么,使用它们您要承担全部责任。如果这些标志中的任何一个使您的代码、您的数据、您的服务器或您的一切消失得无影无踪,我、Sun/Oracle和IBM都将不负责任。为以防万一,建议先在虚拟(非常生产)环境中实验。
在这个时刻您想要的是,在JVM消亡之际捕获堆的一个快照--正好-XX:+HeapDumpOnOutOfMemoryError命令可以完成这一操作。
运行该命令通知JVM拍摄一个“堆转储快照”,并将其保存在一个文件中以便处理,通常使用jhat实用工具。您可以使用相应的-XX:HeapDumpPath标志指定到保存文件的实际路径。(不管文件保存在哪,务必确保文件系统和/或Java流程必须要有权限配置,可以在其中写入。)
3.bootclasspath
定期将一个类放入类路径是很有帮助的,这类路径与库存JRE附带的类路径或者以某种方式扩展的JRE类路径略有不同。。如果您想要扩展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
-Xint,在解释模式下运行JVM(对于测试JIT编译器实际上是否对您的代码起作用或者验证是否JIT编译器中有一个bug,这都很有用)。
-Xloggc:,和-verbose:gc做同样的事,但是记录一个文件而不输出到命令行窗口。
JVM命令行选项时常发生变化,因此,定期查看是一个好主意。
在实际工作中,命令行标志的出现并不是为了永久的使用。但是,如果将命令行标志作为工具来研究在其他方面完全不透明的虚拟机的内部工作,还是非常有用的。以上就是为大家分享的Java程序员必须知道的JVM命令行标志。
— 申请免费试学名额 —
在职想转行提升,担心学不会?根据个人情况规划学习路线,闯关式自适应学习模式保证学习效果
讲师一对一辅导,在线答疑解惑,指导就业!
相关推荐 更多
如何成长为Java架构师?Java架构师成长攻略
如何成长为Java架构师?Java架构师的成长攻略大概是这样的,首先需要大家完全掌握Java的基础知识,从Java程序员开始成长为Java架构师。然后在深入了解Java的架构知识,多练习一些架构设计的项目。最后还可以通过网课或其他渠道的学习课程,不断给自己充电,提高自身的职场竞争力。
1562
2019-10-10 17:50:18
怎么算一个合格的Java架构师?需要具备什么技能?
怎么算一个合格的Java架构师?需要具备什么技能?要从一名普通的Java程序员成长为一个合格的Java架构师并不容易,需要积累一定的项目经验,拓宽自己的视野,在工作中经常能够深度思考。具体需要掌握阅读、分析源码、掌握分布式架构、微服务架构、性能优化、并发编程等等技能。下面我们来详细看一看Java架构师的必备能力。
1306
2019-10-25 10:24:52
Java编码规范整理汇总
在Java的入门过程中,我们首先要养成一个良好的编写代码习惯。那么,了解清楚Java的编码规范就显得尤为必要了。编码格式不仅仅是美不美观的问题。这里我们可以试想一下,如果在Java开发中编码不规范,容易出现bug不说,而且后续还难以维护。因此,遵守编码规范可以让代码的风格好像是一个人写出来的,即使是有很多人参与这个开发项目。
1048
2020-03-06 15:13:29
Redis6.0引入多线程有哪些好处?
Redis6.0新版本在五月初重磅发布,我们可以清晰地发现Redis6.0新版本引入了多线程。相信大家一定都十分好奇,Redis6.0引入多线程究竟有哪些好处呢?下面我们就来逐一分析一下引入多线程的诸多好处~
1163
2020-05-29 18:52:04
Java程序的开发与运行原理解析
可能刚刚接触编程的初学者会发现,编写一个Java程序其实很简单,但是Java程序的运行过程却是非常复杂的。关于Java程序工作原理这部分知识,虽然不要求编程学习者完全掌握,你但是至少需要了解它的大致过程。下面小编将好好介绍一下Java程序的开发与运行原理,大致分为以下三步:编写源文件、编译以及运行。
627
2020-08-12 16:59:55
分布式发布订阅消息系统 Kafka架构设计
免费 基础 1058
基于RabbitMQ解决分布式事务问题
¥299 进阶 140
1小时精通Redis哨兵模式
免费 基础 885
微服务架构技术基础
¥129 进阶 382
Java学习路线及职业发展方向
免费 基础 1933
推荐课程
热门文章
- 5W2H数据分析方法及思维是什么?
- UI设计师要懂什么技术?掌握哪些知识?
- 哪里可以培训少儿编程老师?学什么?
- 软件测试方法和技术知识点有哪些?
- 2021年2月IT编程语言排行榜
- PHP从入门到精通需要多长时间?
- 产品经理需要的技能是什么?具备哪些能力?
- 新媒体运营是做什么的?工作内容有哪些?
- Java线上培训机构哪家好?靠不靠谱?
- 学Web技术前端培训机构哪家好? 查看更多
扫描二维码,了解更多信息
