java虚拟机常用命令工具

java虚拟机常用命令工具

  • 博客分类:
  • 虚拟机
虚拟机jvmjava 
一、概述   
        程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统日志、堆dump文件、线程dump文件、GC日志等。通过虚拟机监控和诊断工具可以帮忙我们快速获取、分析需要的数据,进而提高问题解决速度。 本文将介绍虚拟机常用监控和问题诊断命令工具的使用方法,主要包含以下工具:
jps显示系统中所有Hotspot虚拟机进程
jstat收集Hotspot虚拟机各方面运行数据
jstack显示虚拟机的线程栈信息
jinfo显示虚拟机的配置信息
jmap用于生成虚拟机的内存快照信息

以上工具的官方文档地址: http://docs.oracle.com/javase/1.5.0/docs/tooldocs/
图形化工具如jconsole,jvisualvm将另文介绍。

二、示例代码
为方便大家使用各工具进行实战,提供样例代码如下:

Java代码  收藏代码
  1. package com.leanworld;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5.   
  6. /** 
  7.  * 虚拟机常用工具使用示例代码 启动参数: -Xmn10m -Xms40m -Xmx40m 
  8.  *  
  9.  * @author learnworld 2012-1-30 下午01:37:14 
  10.  */  
  11. public class JVMTools {  
  12.   
  13.     public static void createList(int count) throws InterruptedException {  
  14.         for (int j = 0; j < count; j++) {  
  15.             List<_1MObject> list = new ArrayList<_1MObject>();  
  16.             Thread.sleep(100);  
  17.             list.add(new _1MObject());  
  18.         }  
  19.     }  
  20.   
  21.     public static void main(String[] args) throws InterruptedException {  
  22.         createList(5000);  
  23.     }  
  24.   
  25. }  
  26.   
  27. /** 
  28.  * 一个大约1M的对象 
  29.  */  
  30. class _1MObject {  
  31.   
  32.     public byte[] _1M = new byte[1024 * 1024];  
  33. }  


三、工具介绍
1.  jps
JVM Process Status Tool,该命令用于列出正在运行的虚拟机进程,显示main类的名称和虚拟机进程id。该命令受当前用户的访问权限影响,比如linux下非root用户只列出当前用户启动的虚拟机进程。

命令格式:
jps  [options]  [hostid]

执行示例:
$ jps -l
3733 sun.tools.jps.Jps
3700 com.leanworld.JVMTools

com.leanworld.JVMTools即为上面的示例代码执行类。

常用参数:
-l输出主类全名
-v输出虚拟机进程启动的jvm参数
-m输出启动时传递给main函数的参数


2.  jstat
JVM Statistics Monitoring Tool,用于监控各种运行状态信息的命令。在只有文本控制台的环境中(如企业中的生产环境),该工具非常有用。 可以用来显示系统中类装载、垃圾回收、运行期编译状况等运行数据。

命令格式:
jstat [ generalOption | outputOptions vmid [interval[s|ms] [count]] ]
vmid表示虚拟机唯一标识符,如果是本地虚拟机进程,与LVMID一致,通常为本地虚拟机进程号。 interval表示查询间隔时间,count表示查询次数。如果省略interval和count参数,表示查询一次。

执行示例:
$ jstat -gcutil 3700 500 4
  S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT  
50.00   0.00  60.78   0.50  12.76    214    0.049     0    0.000    0.049
  0.00  25.00  20.27   0.50  12.76    215    0.049     0    0.000    0.049
  0.00  25.00  70.91   0.50  12.76    215    0.049     0    0.000    0.049
50.00   0.00  20.27   0.50  12.76    216    0.049     0    0.000    0.049

S0和S1表示Survivor0和Survivor1,E表示新生代Eden,O表示老年代Old,P表示持久代Permanent,以上各参数值表示已使用空间占比。 YGC表示young gc次数,YGCT表示young gc总耗时。FGC表示Full gc次数,FGCT表示full gc总耗时。GCT表示所有gc总耗时时间。

常用参数:
class类装载相关信息.
compilerJIT编译器编译过的方法、耗时等.
gcjava堆信息和垃圾回收状况.
gccapacity关注java堆各个区的最大和最小空间.
gccause类似gcutil,额外输出导致上一次gc的原因.
gcnew新生代gc状况.
gcnewcapacity关注新生代gc使用的最大和最小空间.
gcold老年代gc状况.
gcoldcapacity关注老年代gc使用的最大和最小空间.
gcpermcapacity关注持久代gc使用的最大和最小空间.
gcutil关注已使用空间占总空间比例.
printcompilation输出已经被JIT编译的方法.


3.  jstack
Stack Trace for Java,用于生成虚拟机当前的线程快照信息,包含每一条线程的堆栈信息。该命令通常用于定位线程停顿原因,当出现线程停顿时,可通过stack查看每个线程的堆栈信息,进而分析停顿原因。
命令格式:
jstack [ option ] pid

执行示例:
$ jstack 3700
2012-01-30 16:36:05
Full thread dump Java HotSpot(TM) Server VM (17.0-b16 mixed mode):

"Attach Listener" daemon prio=10 tid=0xaca16c00 nid=0x1384 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Low Memory Detector" daemon prio=10 tid=0xaca00c00 nid=0x1366 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread1" daemon prio=10 tid=0x08e58800 nid=0x1365 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"CompilerThread0" daemon prio=10 tid=0x08e56800 nid=0x1364 waiting on condition [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Signal Dispatcher" daemon prio=10 tid=0x08e54c00 nid=0x1363 runnable [0x00000000]
   java.lang.Thread.State: RUNNABLE

"Finalizer" daemon prio=10 tid=0x08e39000 nid=0x1361 in Object.wait() [0xac943000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- locked <0xb10e0230> (a java.lang.ref.ReferenceQueue$Lock)
at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:159)

"Reference Handler" daemon prio=10 tid=0x08e34400 nid=0x1360 in Object.wait() [0xacb94000]
   java.lang.Thread.State: WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0xb10e30d0> (a java.lang.ref.Reference$Lock)
at java.lang.Object.wait(Object.java:485)
at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:116)
- locked <0xb10e30d0> (a java.lang.ref.Reference$Lock)

"main" prio=10 tid=0x08d7bc00 nid=0x135a waiting on condition [0xb6a8a000]
   java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(Native Method)
at com.leanworld.JVMTools.createList(JVMTools.java:23)
at com.leanworld.JVMTools.main(JVMTools.java:29)

"VM Thread" prio=10 tid=0x08e31c00 nid=0x135f runnable

"GC task thread#0 (ParallelGC)" prio=10 tid=0x08d83800 nid=0x135b runnable

"GC task thread#1 (ParallelGC)" prio=10 tid=0x08d85000 nid=0x135c runnable

"GC task thread#2 (ParallelGC)" prio=10 tid=0x08d86400 nid=0x135d runnable

"GC task thread#3 (ParallelGC)" prio=10 tid=0x08d87c00 nid=0x135e runnable

"VM Periodic Task Thread" prio=10 tid=0xaca02c00 nid=0x1367 waiting on condition

JNI global references: 854

通过输出信息可以看出当前main线程处于TIMED_WAITING状态,因为执行到示例代码中Thread.sleep(100);这行的缘故。

常用参数:
-l除堆栈外,显示锁的附加信息
-F当请求不被响应时,强制输出线程堆栈
-m混合模式,打印java和本地C++调用的堆栈信息


4. jinfo
Configuration Info for Java,用于查看和修改虚拟机的各项参数信息。
命令格式:
jinfo [ option ] pid

执行示例:
$jinfo 3700
Attaching to process ID 5081, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
Java System Properties:

java.runtime.name = Java(TM) SE Runtime Environment
sun.boot.library.path = /home/learnworld/software/jdk1.6.0_21/jre/lib/i386
java.vm.version = 17.0-b16
java.vm.vendor = Sun Microsystems Inc.
java.vendor.url = http://java.sun.com/
path.separator = :
java.vm.name = Java HotSpot(TM) Server VM
file.encoding.pkg = sun.io
sun.java.launcher = SUN_STANDARD
user.country = CN
sun.os.patch.level = unknown
java.vm.specification.name = Java Virtual Machine Specification
user.dir = /home/learnworld/workspace/concurrency
java.runtime.version = 1.6.0_21-b06
java.awt.graphicsenv = sun.awt.X11GraphicsEnvironment
java.endorsed.dirs = /home/learnworld/software/jdk1.6.0_21/jre/lib/endorsed
os.arch = i386
java.io.tmpdir = /tmp
line.separator =

...

VM Flags:
-Xmn10m -Xms40m -Xmx40m -Dfile.encoding=GBK -Xbootclasspath:/home/learnworld/software/jdk1.6.0_21/lib/tools.jar:/home/learnworld/software/jdk1.6.0_21/lib/sa-jdi.jar:/home/learnworld/software/jdk1.6.0_21/lib/jconsole.jar:/home/learnworld/software/jdk1.6.0_21/lib/htmlconverter.jar:/home/learnworld/software/jdk1.6.0_21/lib/dt.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/rt.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/resources.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/plugin.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/management-agent.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/jsse.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/jce.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/javaws.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/deploy.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/charsets.jar:/home/learnworld/software/jdk1.6.0_21/jre/lib/alt-rt.jar

可以看出,该命令可以方便我们查找需要的虚拟机信息,包含System.getProperties()信息。

常用参数:
-flag name打印虚拟机该参数对应的值.
-flag [+\-]name使该参数生效或失效.
-flag name=value修改相应参数的值.
-flags打印传给jvm的参数值.
-sysprops打印System.getProperties()信息.


5. jmap
Memory Map for Java,可以产生堆dump文件,查询堆和持久代的详细信息等。
命令格式:
jmap [ option ] pid

执行示例:
$ jmap -dump:format=b,file=dump.tmp 3700
Dumping heap to /home/learnworld/dump.tmp ...
Heap dump file created

上面这个命令生成了dump.tmp这个dump文件。生成的dump文件可以使用Eclipse Memory Analyzer/jhat等工具进行分析。

$ jmap -permstat 3700
Attaching to process ID 3700, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 17.0-b16
1355 intern Strings occupying 183024 bytes.
finding class loader instances ..Finding object size using Printezis bits and skipping over...
done.
computing per loader stat ..done.
please wait.. computing liveness....done.
class_loader classes bytes parent_loader alive? type

<bootstrap> 320 1437208   null  live <internal>
0xb1170250 10 77120 0xb11706b8 live sun/misc/Launcher$AppClassLoader@0xad34eb70
0xb11706b8 0 0   null  live sun/misc/Launcher$ExtClassLoader@0xad303d40

total = 3 330 1514328     N/A    alive=3, dead=0     N/A


常用参数:
-dump生成堆dump文件,格式为: -dump:[live,]format=b,file=<filename>
-heap显示java堆的详细信息,包括垃圾回收期、堆配置和分代信息等
-histo显示堆中对象的统计信息,包括类名称,对应的实例数量和总容量
-permstat统计持久代中各ClassLoader的统计信息。


四、遇到的问题
我的操作系统为ubuntu10.10,初次使用jinfo和jmap时出现以下错误:
引用
Attaching to process ID 3538, please wait...
Error attaching to process: sun.jvm.hotspot.debugger.DebuggerException: Can't attach to the process

解决方法:
1. echo 0 | sudo tee /proc/sys/kernel/yama/ptrace_scope
该方法在下次重启前有效。

2. 永久有效方法
sudo vi /etc/sysctl.d/10-ptrace.conf
编辑下面这行:
kernel.yama.ptrace_scope = 1
修改为:
kernel.yama.ptrace_scope = 0
重启系统,使修改生效。
该bug详细信息请参考官方文档: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7050524

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/353750.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Zuul –编写过滤器

Netflix OSS项目Zuul充当后端服务的网关&#xff0c;并支持添加安全性&#xff0c;路由等边缘功能。 在Zuul世界中&#xff0c;称为Zuul过滤器的组件提供了特定的边缘功能&#xff0c;为基于Spring Cloud的项目编写这种过滤器非常简单。 此处提供了添加过滤器的良好参考。 在这…

嵌入式基础篇 - 第2章 Systick系统定时器

2.1 STM32 的时钟系统 STM32 芯片为了实现低功耗&#xff0c;设计了一个功能完善但却非常复杂的时钟系统。普通的MCU 一般只要配置好 GPIO 的寄存器就可以使用了&#xff0c;但 STM32 还有一个步骤&#xff0c;就是开启外设时钟。 图2-1 STM32的时钟树在 STM32 中&#xff0c;…

kill所有java进程

kill所有java进程 ps -ef | grep java | grep -v grep |awk {print $2} | xargs -p kill -9如果不需要询问&#xff0c;把xargs后面 -p 参数去掉Aix 通过shell脚本kill杀指定进程&#xff0c;比如杀所有java进程 2012-11-16 15:31, Tags: 127人阅读----脚本杀进程-------------…

sqa计划

一、sqa计划 本计划是对“生活在长大”项目的流程规范和约定&#xff0c;本次计划包括质量保证、质量控制、数据收集和统计报告四部分。 质量保证&#xff1a; 保证项目的完整和运行&#xff0c;没有重大BUG。 计划进度 任务      时间        结果       …

正确地kill java历程

正确地kill java历程 www.MyException.Cn 发布于&#xff1a;2012-06-27 14:20:08 浏览&#xff1a;4次正确地kill java进程在linux/unix下&#xff0c;你会怎么中止一个java进程&#xff1f; 你可能会回答 kill -9 pid&#xff0c;这是一种在多数情况下正确的做法。不过&a…

并发加对象锁_通用并发对象池

并发加对象锁在本文中&#xff0c;我们将介绍如何在Java中创建对象池。 近年来&#xff0c;JVM的性能成倍增加&#xff0c;大多数类型的对象几乎都变得多余&#xff0c;从而提高了对象池的性能。 从本质上讲&#xff0c;对象的创建不再像以前那样昂贵。 但是&#xff0c;有些对…

SpringAOP02 自定义注解

1 自定义注解 1.1 创建自定义注解 从java5开始就可以利用 interface 来定义自定义注解 技巧01&#xff1a;注解不能直接干扰程序代码的运行&#xff08;即&#xff1a;注解的增加和删除操作后&#xff0c;代码都可以正常运行&#xff09; 技巧02&#xff1a;Retention 用来声明…

MFC处理回车窗口消失

MFC处理回车窗口消失 2011-04-24 12:21:31| 分类&#xff1a; C&C&VC | 标签&#xff1a;对话框 回车 mfc 消失 |字号大中小 订阅 我的方法是&#xff1a;找到自己设计的按钮&#xff0c;在属性-风格中选择default button&#xff1b;如果没有自己设计的but…

您的框架有多可扩展性?

在参加会议时&#xff0c;我们总是会见到高素质的决策者&#xff0c;他们经常问同样的问题&#xff1a; 您的框架有多可扩展性&#xff1f;如果我需要比您开箱即用的功能更多的东西怎么办&#xff1f; 。 这个问题是非常合理的&#xff0c;因为他们只是不想被卡在开发曲线的中间…

linux常用命令:touch 命令

linux的touch命令不常用&#xff0c;一般在使用make的时候可能会用到&#xff0c;用来修改文件时间戳&#xff0c;或者新建一个不存在的文件。 1&#xff0e;命令格式&#xff1a; touch [选项]... 文件... 2&#xff0e;命令参数&#xff1a; -a 或--timeatime或--timeacces…

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果(转)

用回车键实现MFC对话框中TAB键控件输入焦点在控件中跳转的效果&#xff08;转&#xff09; 版权声明&#xff1a;转载时请以超链接形式标明文章原始出处和作者信息及本声明 http://hcq11.blogbus.com/logs/54217707.html 近日在为一个数据应用写数据输入界面&#xff0c;大量…

python-面向对象编程设计与开发

编程范式 1、对不同类型的任务&#xff0c;所采取不同的解决问题的思路。 2、编程范式有两种 1、面向过程编程 2、面向对象编程 面向过程编程 什么是面向过程编程&#xff1f; 过程——解决问题的步骤 要解决一个大的问题 1、先把大问题拆分成若干小问题或子过程。 2、然后子过…

MFC下列表控件的使用

MFC下列表控件的使用 2012-11-09 16:46:57| 分类&#xff1a; 程序VC相关 | 标签&#xff1a; |字号大中小 订阅 1、应该加入头文件 #include <Atlbase.h>2、示例m_list.SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT|LVS_EX_ONECLICKACTIVATE);m_lis…

jbehave_使用JBehave,Gradle和Jenkins的行为驱动开发(BDD)

jbehave行为驱动开发 &#xff08;BDD&#xff09;是一个协作过程 &#xff0c;产品所有者&#xff0c;开发人员和测试人员可以合作交付可为业务带来价值的软件。 BDD是 测试驱动开发 &#xff08;TDD&#xff09; 的合理下一步 。 行为驱动的发展 本质上&#xff0c;BDD是一…

Confluence 6 考虑使用自定义 CSS

CSS 的知识储备 如果你没有有关 CSS 的相关知识&#xff0c;请参考页面 CSS Resources section 中的内容。当你打算开始对 Confluence 的样式表进行修改之前&#xff0c;你应该对 CSS 有一些相关的了解和知识储备。 安全 自定义 CSS 有可能被在页面中注入脚本&#xff0c;有跨…

MFC--CColorDialog的使用

MFC--CColorDialog的使用 2012-05-07 11:05:32| 分类&#xff1a; 学习mfc/c | 标签&#xff1a; |字号大中小 订阅 要在类中定义一个存储颜色的变量COLORREF m_color; 创建一个按钮&#xff0c;用来调用CColorDialog&#xff0c;用以改变静态文本的颜色&#xff0c;&a…

嵌入式 开发——DMA内存到外设

学习目标 加强理解DMA数据传输过程加强掌握DMA的初始化流程掌握DMA数据表查询理解源和目标的配置理解数据传输特点能够动态配置源数据学习内容 需求 串口发送数据 uint8_t data = 0x01; 串口发送(data); 实现串口的发送数据, 要求采用dma的方式 数据交互流程 CPU配置好DM…

使用Java第2部分查询DynamoDB项

在上一篇文章中&#xff0c;我们有机会发布了一些基本的DynamoDB查询操作。 但是&#xff0c;除了基本操作之外&#xff0c;DynamoDB api还为我们提供了一些额外的功能。 投影是具有类似选择功能的功能。 您选择应从DynamoDB项中提取哪些属性。 请记住&#xff0c;使用投影不…

XSS

1.什么是xss XSS攻击全称跨站脚本攻击&#xff0c;是为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆&#xff0c;故将跨站脚本攻击缩写为XSS&#xff0c;XSS是一种在web应用中的计算机安全漏洞&#xff0c;它允许恶意web用户将代码植入到提供给其它用户使用的页面中…

C++中引用传递与指针传递区别(进一步整理)

C中引用传递与指针传递区别&#xff08;进一步整理&#xff09; 博客分类&#xff1a; C/C CCC#J# 从概念上讲。指针从本质上讲就是存放变量地址的一个变量&#xff0c;在逻辑上是独立的&#xff0c;它可以被改变&#xff0c;包括其所指向的地址的改变和其指向的地址中所存放的…