sun黑科技之动态添加jvm参数
2017-03-21 18:11
246 查看
原文链接: JavaCodeGeeks 翻译: ImportNew.com - elviskang
译文链接: http://www.importnew.com/15722.html
转自:http://www.importnew.com/15722.html点击打开链接
[ 转载请保留原文出处、译者和译文链接。]
我们经常会遇到JVM运行时出错的情况。若能在启动时加入一些启动选项(startup option),便可以获取与bug相关的重要线索,从而有希望根治它们。但在实际操作时,我们总是忘记添加
每当面对如此窘境,我们只能关闭JVM,修改启动参数(startup parameter),然后默默祈祷,希望问题场景(problematic situation)能在重启之后得以重现。这种方法偶尔奏效,在场景重现后你或许还能收集到足够的证据,以便动手根治潜在的问题。
不难看出,前文所述的方法问题显著——你必须执行一次额外的重启才能加入那烦人的debug选项,而不能借助中断(outage)实现。事实上,JDK bundle提供了一种可行的变通方案,如果将之收入麾下,偶尔还能从中获益。
在JDK bundle中隐藏着一个精悍的小工具——jinfo。作为一个命令行工具,jinfo用于收集正在运行的Java进程的配置信息。jinfo吸引眼球的地方在于,它能通过
flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:
通过选项
management interface(-XX:+PrintFlagsFinal)动态修改。虽然在JConsole中也能查到与其十分相似的MBean。但在我看来,以命令行的方式查看它们更加的便捷。
让我们通过实战来学习如何使用jinfo。在下面的例子中,我们将在一个正在运行的JVM中动态开启GC日志功能:
在jinfo中需要打开
script)来设置参数,仅需
不过,从standard output的结果来看,PID为12278的进程的GC日志的确能够滚动地显示出来:
同理,若想关闭GC日志功能,只需要执行
在我看来,学会使用jinfo,只能让你在故障排除的工作中少花一到两天的时间。若打一开始就使用Plumbr这类性能监控工具,你可能从未有过这样的烦恼。
译文链接: http://www.importnew.com/15722.html
转自:http://www.importnew.com/15722.html点击打开链接
[ 转载请保留原文出处、译者和译文链接。]
我们经常会遇到JVM运行时出错的情况。若能在启动时加入一些启动选项(startup option),便可以获取与bug相关的重要线索,从而有希望根治它们。但在实际操作时,我们总是忘记添加
-XX:+HeapDumpOnOutOfMemoryError或
-XX:+PrintGCDetails这样必要的flag。
每当面对如此窘境,我们只能关闭JVM,修改启动参数(startup parameter),然后默默祈祷,希望问题场景(problematic situation)能在重启之后得以重现。这种方法偶尔奏效,在场景重现后你或许还能收集到足够的证据,以便动手根治潜在的问题。
不难看出,前文所述的方法问题显著——你必须执行一次额外的重启才能加入那烦人的debug选项,而不能借助中断(outage)实现。事实上,JDK bundle提供了一种可行的变通方案,如果将之收入麾下,偶尔还能从中获益。
jinfo
在JDK bundle中隐藏着一个精悍的小工具——jinfo。作为一个命令行工具,jinfo用于收集正在运行的Java进程的配置信息。jinfo吸引眼球的地方在于,它能通过-flag选项动态修改指定的Java进程中的某些JVM
flag的值。虽然这样的flag数量有限,但它们偶尔能够帮助到你。通过以下的命令你便能看到JVM中哪些flag可以被jinfo动态修改:
my-precious me$ java -XX:+PrintFlagsFinal -version|grep manageable intx CMSAbortablePrecleanWaitMillis = 100 {manageable} intx CMSWaitDuration = 2000 {manageable} bool HeapDumpAfterFullGC = false {manageable} bool HeapDumpBeforeFullGC = false {manageable} bool HeapDumpOnOutOfMemoryError = false {manageable} ... cut for brevity ... bool PrintGC = false {manageable} bool PrintGCDateStamps = false {manageable} bool PrintGCDetails = false {manageable} bool PrintGCTimeStamps = false {manageable}
通过选项
-XX:+PrintFlagsFinal可以列出所有的JVM flag,而其中的标注为
manageable的flag则是值得我们关注的部分。这些flag可通过JDK
management interface(-XX:+PrintFlagsFinal)动态修改。虽然在JConsole中也能查到与其十分相似的MBean。但在我看来,以命令行的方式查看它们更加的便捷。
如何使用jinfo
让我们通过实战来学习如何使用jinfo。在下面的例子中,我们将在一个正在运行的JVM中动态开启GC日志功能:my-precious me$ jps 12278 HighAllocationRate 12279 Jps 12269 JConsole my-precious me$ jinfo -flag +PrintGCDetails 12278 my-precious me$ jinfo -flag +PrintGC 12278 my-precious me$
在jinfo中需要打开
-XX:+PrintGC和
-XX:+PrintGCDetails两个选项才能开启GC日志,这与用命令行参数的方式实现有着细微的差别——如果你通过启动脚本(startup
script)来设置参数,仅需
-XX:+PrintGCDetails即可,因为
-XX:+PrintGC会被自动打开。
不过,从standard output的结果来看,PID为12278的进程的GC日志的确能够滚动地显示出来:
... [GC (Allocation Failure) [PSYoungGen: 876416K->102624K(909312K)] 1094420K->320820K(1161216K), 0.2173131 secs] [Times: user=0.74 sys=0.00, real=0.22 secs] ... [GC (Allocation Failure) [PSYoungGen: 890304K->102240K(917504K)] 1108924K->320956K(1169408K), 0.2446639 secs] [Times: user=0.82 sys=0.01, real=0.25 secs] ...
同理,若想关闭GC日志功能,只需要执行
jinfo -flag -PrintGCDetails 12278和
jinfo -flag -PrintGC 12278命令即可。
在我看来,学会使用jinfo,只能让你在故障排除的工作中少花一到两天的时间。若打一开始就使用Plumbr这类性能监控工具,你可能从未有过这样的烦恼。
相关文章推荐
- 动态向OjbectDataSource添加参数(转eddie005)
- 解决使用AJax往DropDownList中动态添加数据时发生,回发或回调参数无效 的问题
- JS动态添加方法并绑定参数
- JS自定义功能函数实现动态添加网址参数修改网址参数值
- 在Maven2中运行单个测试用例并添加JVM参数(转)
- 为ActionForward添加动态参数
- js动态添加事件并可传参数示例代码
- dwz jui 表格数据参数传递 点击时动态添加了个input
- 存储过程中动态条件的添加 where条件 in条件中字符串参数
- Ext.data.Store添加动态参数
- 用js脚本动态添加带参数的事件
- 给command动态添加参数:
- javascript 动态添加参数后再执行的方法
- Jvisualvm 远程监控添加JVM参数
- GridView 动态添加模板列并绑定数据 实现从外部直接传入控件 和 绑定字段参数
- 用js脚本如何动态添加带参数的事件
- 在各浏览器中动态添加事件-参数篇
- 存储过程中动态条件的添加 where条件 in条件中字符串参数
- 动态table添加colspan\rowspan 参数的方法(通过Js)
- Rhino gha开发如何添加动态参数