java自带命令工具

jstat,这个工具很强大,可以监测Java虚拟机GC多方面的状态,具体参数含义参见此链接:
- ./jstat -gc 84012 1000 3
- S0C S1C S0U S1U EC EU OC OU PC PU YGC YGCT FGC FGCT GCT
- 2112.0 2112.0 0.0 0.0 17024.0 0.0 63872.0 1319.9 21248.0 4728.1 743416 209.646 5 0.046 209.692
- 2112.0 2112.0 0.0 0.0 17024.0 0.0 63872.0 1319.9 21248.0 4728.1 743849 209.755 5 0.046 209.801
- 2112.0 2112.0 0.0 0.0 17024.0 0.0 63872.0 1319.
jmap,这大概是最常用的命令。下面这个命令不但可以列出类的实例数量,还有强制进行一次full GC的“副作用”,这样的副作用对于定位某些问题很有帮助,参见《使用堆外内存》:
- ./jmap -histo:live 84012
- num #instances #bytes class name
- ----------------------------------------------
- 1: 824 1177656 [B
- 2: 8096 1106672
- ...
使用-heap参数,则可以打印堆的使用情况:
- ./jmap -heap 84012
- Attaching to process ID 84012, please wait...
- Debugger attached successfully.
- Server compiler detected.
- JVM version is 20.65-b04-462
- using parallel threads in the new generation.
- using thread-local object allocation.
- Concurrent Mark-Sweep GC
- Heap Configuration:
- MinHeapFreeRatio = 40
- MaxHeapFreeRatio = 70
- MaxHeapSize = 132120576 (126.0MB)
- NewSize = 21757952 (20.75MB)
- MaxNewSize = 174456832 (166.375MB)
- OldSize = 65404928 (62.375MB)
- NewRatio = 7
- SurvivorRatio = 8
- PermSize = 21757952 (20.75MB)
- MaxPermSize = 85983232 (82.0MB)
- Heap Usage:
- New Generation (Eden + 1 Survivor Space):
- capacity = 19595264 (18.6875MB)
- used = 16785688 (16.008079528808594MB)
- free = 2809576 (2.6794204711914062MB)
- 85.66196403375837% used
- Eden Space:
- capacity = 17432576 (16.625MB)
- used = 16785688 (16.008079528808594MB)
- free = 646888 (0.6169204711914062MB)
- 96.28920017328477% used
- From Space:
- capacity = 2162688 (2.0625MB)
- used = 0 (0.0MB)
- free = 2162688 (2.0625MB)
- 0.0% used
- To Space:
- capacity = 2162688 (2.0625MB)
- used = 0 (0.0MB)
- free = 2162688 (2.0625MB)
- 0.0% used
- concurrent mark-sweep generation:
- capacity = 65404928 (62.375MB)
- used = 1390576 (1.3261566162109375MB)
- free = 64014352 (61.04884338378906MB)
- 2.126102791520541% used
- Perm Generation:
- capacity = 21757952 (20.75MB)
- used = 4852336 (4.6275482177734375MB)
- free = 16905616 (16.122451782226562MB)
- 22.301437194088855% used
使用-permstat参数,查看永久区:
- ./jmap -permstat 84012
- Attaching to process ID 84012, please wait...
- Debugger attached successfully.
- Server compiler detected.
- JVM version is 20.65-b04-462
- 1239 intern Strings occupying 104312 bytes.
- finding class loader instances ..Warning: skipping invalid TLAB for thread t@59779
- Warning: skipping invalid TLAB for thread t@59527
- Warning: skipping invalid TLAB for thread t@59907
- Warning: skipping invalid TLAB for thread t@60163
- Warning: skipping invalid TLAB for thread t@60419
- Warning: skipping invalid TLAB for thread t@60675
- 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
- 590 3973048 null live
- 0x00000007f44cace0 0 0 null live sun/misc/Launcher$ExtClassLoader@0x00000007faff8a40
- 0x00000007f44c1478 8 143928 0x00000007f44cace0 live sun/misc/Launcher$AppClassLoader@0x00000007fb056e88
- total = 3 598 4116976 N/A alive=3, dead=0 N/A
把内存中的堆dump成一个镜像文件:
- ./jmap -dump:live,format=b,file=/Users/xiongyi/Documents/dump.core 84012
jstack,线程堆栈打印。注意waiting to lock <xxx>在等待锁,比如进入临界区时;locked <xxx>表示当前同步操作,线程锁住了某资源;而waiting on <xxx>指的是在同步块内,wait方法的执行中暂时地释放了该锁的占用,等唤醒的时候需要重新获取:
- ./jstack 84012
- 2013-11-11 18:30:35
- Full thread dump Java HotSpot(TM) 64-Bit Server VM (20.65-b04-462 mixed mode):
- "Attach Listener" daemon prio=9 tid=7ff64e206800 nid=0x117782000 waiting on condition [00000000]
- java.lang.Thread.State: RUNNABLE
- "Low Memory Detector" daemon prio=5 tid=7ff64c80f000 nid=0x117c96000 runnable [00000000]
- java.lang.Thread.State: RUNNABLE
- "C2 CompilerThread1" daemon prio=9 tid=7ff64c80e800 nid=0x117b93000 waiting on condition [00000000]
- java.lang.Thread.State: RUNNABLE
- "C2 CompilerThread0" daemon prio=9 tid=7ff64c80d800 nid=0x117a90000 waiting on condition [00000000]
- java.lang.Thread.State: RUNNABLE
- "Signal Dispatcher" daemon prio=9 tid=7ff64c80d000 nid=0x11798d000 runnable [00000000]
- java.lang.Thread.State: RUNNABLE
- "Surrogate Locker Thread (Concurrent GC)" daemon prio=5 tid=7ff64c80c000 nid=0x11788a000 waiting on condition [00000000]
- java.lang.Thread.State: RUNNABLE
- "Finalizer" daemon prio=8 tid=7ff64e13d800 nid=0x11767f000 in Object.wait() [11767e000]
- java.lang.Thread.State: WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- - waiting on <7f44c0ed0> (a java.lang.ref.ReferenceQueue$Lock)
- at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:118)
- - locked <7f44c0ed0> (a java.lang.ref.ReferenceQueue$Lock)
- at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:134)
- at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:171)
- "Reference Handler" daemon prio=10 tid=7ff64e13c800 nid=0x11757c000 in Object.wait() [11757b000]
- java.lang.Thread.State: WAITING (on object monitor)
- at java.lang.Object.wait(Native Method)
- - waiting on <7f44c0018> (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 <7f44c0018> (a java.lang.ref.Reference$Lock)
- "main" prio=5 tid=7ff64c800800 nid=0x10f709000 runnable [10f708000]
- java.lang.Thread.State: RUNNABLE
- at test.Test.main(Test.java:7)
- "VM Thread" prio=9 tid=7ff64e138000 nid=0x117479000 runnable
- "Gang worker#0 (Parallel GC Threads)" prio=9 tid=7ff64e000000 nid=0x112b0f000 runnable
- "Gang worker#1 (Parallel GC Threads)" prio=9 tid=7ff64e001000 nid=0x112c12000 runnable
- "Gang worker#2 (Parallel GC Threads)" prio=9 tid=7ff64e001800 nid=0x112d15000 runnable
- "Gang worker#3 (Parallel GC Threads)" prio=9 tid=7ff64e002000 nid=0x112e18000 runnable
- "Gang worker#4 (Parallel GC Threads)" prio=9 tid=7ff64e002800 nid=0x112f1b000 runnable
- "Gang worker#5 (Parallel GC Threads)" prio=9 tid=7ff64e003800 nid=0x11301e000 runnable
- "Gang worker#6 (Parallel GC Threads)" prio=9 tid=7ff64e004000 nid=0x113121000 runnable
- "Gang worker#7 (Parallel GC Threads)" prio=9 tid=7ff64e004800 nid=0x113224000 runnable
- "Concurrent Mark-Sweep GC Thread" prio=9 tid=7ff64e0e2000 nid=0x1170f0000 runnable
- "Gang worker#0 (Parallel CMS Threads)" prio=9 tid=7ff64e0e0800 nid=0x1166ea000 runnable
- "Gang worker#1 (Parallel CMS Threads)" prio=9 tid=7ff64e0e1800 nid=0x1167ed000 runnable
- "VM Periodic Task Thread" prio=10 tid=7ff64c820800 nid=0x117d99000 waiting on condition
- "Exception Catcher Thread" prio=10 tid=7ff64c801800 nid=0x10f936000 runnable
- JNI global references: 963
jinfo,可以打印JVM执行的参数信息,有一个非常大的作用在于,部分JVM参数在执行过程中是可以修改的,请参见这篇《通过jinfo工具在full GC前后做heap dump》,通过jinfo改变参数HeapDumpBeforeFullGC和HeapDumpAfterFullGC,输出heap dump后,再改回来。
jhat,可以比对core文件之间的对象变化,支持对象查询语言(OQL),请参见这里。
- ./jhat -stack true -refs true -port 8080 -baseline /xxx/dump-baseline.core -debug 1 /Users/xiongyi/Documents/dump-newer.core
javap,用于反编译class文件,对于JVM指令集,这里有完整的文档。
- javap -c -v ./Test.class
- Classfile xxx/Test.class
- Last modified Nov 11, 2013; size 441 bytes
- MD5 checksum 69488187cc8a8f166bc6dd0d517fb4cb
- Compiled from "Test.java"
- public class test.Test
- SourceFile: "Test.java"
- minor version: 0
- major version: 50
- flags: ACC_PUBLIC, ACC_SUPER
- Constant pool:
- #1 = Methodref #6.#16 // java/lang/Object."":()V
- #2 = Integer 1048576
- #3 = Fieldref #17.#18 // java/lang/System.out:Ljava/io/PrintStream;
- #4 = Methodref #19.#20 // java/io/PrintStream.println:(Ljava/lang/Object;)V
- #5 = Class #21 // test/Test
- #6 = Class #22 // java/lang/Object
- #7 = Utf8
- #8 = Utf8 ()V
- #9 = Utf8 Code
- #10 = Utf8 LineNumberTable
- #11 = Utf8 main
- #12 = Utf8 ([Ljava/lang/String;)V
- #13 = Utf8 StackMapTable
- #14 = Utf8 SourceFile
- #15 = Utf8 Test.java
- #16 = NameAndType #7:#8 // "":()V
- #17 = Class #23 // java/lang/System
- #18 = NameAndType #24:#25 // out:Ljava/io/PrintStream;
- #19 = Class #26 // java/io/PrintStream
- #20 = NameAndType #27:#28 // println:(Ljava/lang/Object;)V
- #21 = Utf8 test/Test
- #22 = Utf8 java/lang/Object
- #23 = Utf8 java/lang/System
- #24 = Utf8 out
- #25 = Utf8 Ljava/io/PrintStream;
- #26 = Utf8 java/io/PrintStream
- #27 = Utf8 println
- #28 = Utf8 (Ljava/lang/Object;)V
- {
- public test.Test();
- flags: ACC_PUBLIC
- Code:
- stack=1, locals=1, args_size=1
- 0: aload_0
- 1: invokespecial #1 // Method java/lang/Object."":()V
- 4: return
- LineNumberTable:
- line 4: 0
- public static void main(java.lang.String[]);
- flags: ACC_PUBLIC, ACC_STATIC
- Code:
- stack=2, locals=2, args_size=1
- 0: ldc #2 // int 1048576
- 2: newarray byte
- 4: astore_1
- 5: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
- 8: aload_1
- 9: invokevirtual #4 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
- 12: goto 0
- LineNumberTable:
- line 7: 0
- line 8: 5
- line 9: 12
- StackMapTable: number_of_entries = 1
- frame_type = 0 /* same */
- }
java自带命令工具的更多相关文章
- java自带BASE64工具进行图片和字符串转换
java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...
- java自带BASE64工具进行图片和字符串转换【转】
java自带BASE64工具进行图片和字符串转换 import java.io.File; import java.io.FileInputStream; import java.io.FileOut ...
- Java自带命令详解
1. 背景 给一个系统定位问题的时候,知识.经验是关键基础,数据(运行日志.异常堆栈.GC日志.线程快照[threaddump / javacore文件].堆转储快照[heapdump / hprof ...
- 常用java自带命令概览
ref:http://www.hollischuang.com/archives/308 一.常用命令 jps: 查看本机的Java中进程信息. jstack: 打印线程的执行栈信息. jmap: 打 ...
- java jvm常用命令工具
[尊重原创文章出自:http://www.chepoo.com/java-jvm-command-tools.html] 一.概述 程序运行中经常会遇到各种问题,定位问题时通常需要综合各种信息,如系统 ...
- java 自带的工具
前辈说,java的基本功的好坏,一个方面要看是否能熟练使用jdk bin下的工具使用情况. 自己整理一下使用的工具. ■ javac 一个编译java的工具,进入java所在文件的路径后,javac ...
- 如何用java自带的工具生成证书
一.keytool的概念 keytool 是个密钥和证书管理工具.它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务.在 ...
- java自带dom工具使用实例
代码参考自 黄亿华大神的<<1000行代码读懂Spring(一)- 实现一个基本的IoC容器>> 原网页如下 http://my.oschina.net/flashsword/ ...
- Java内存泄露分析和解决方案及Windows自带查看工具
Java内存泄漏是每个Java程序员都会遇到的问题,程序在本地运行一切正常,可是布署到远端就会出现内存无限制的增长,最后系统瘫痪,那么如何最快最好的检测程序的稳定性,防止系统崩盘,作者用自已的亲身经历 ...
随机推荐
- 【转载】JS获取屏幕大小
前些日子需要给项目的弹窗上面罩,因为项目左侧是树形菜单,右侧嵌套的iframe ,iframe 的内容不是固定大小,那么,面罩的大小也就不是固定的 因此,用到了JQuery获取当前页面的窗口大小,于是 ...
- easyui-简单用法寄一些属性
Easyui 总结 优点: A.简单易用 继承 jQuery 简易使用特性,提供高度抽象接口,短期改善网站易用性. B.开源免费 采用 MIT & GPL 双协议授权,轻松满足自由产品至企业产 ...
- js禁止复制页面文字
做项目的时候有客户提出要求,不能用用户浏览他发表的文章时复制他的文章 一种比较简单的方法,禁止用户选中页面的文字和禁止用户右键菜单 document.oncontextmenu = new Funct ...
- SqlServer定时备份数据库和定时杀死数据库死锁解决
上周五组长对我说了一句要杀死数据库的死锁进程,有时候同一时刻不停写入数据库会造成这种情况的发生,因为自己对数据库不是很熟悉,突然组长说了我也就决定一定要倒腾一下,不然自己怎么提高呢?现在不研究,说不定 ...
- 平衡二叉树---Shaolin
Description Shaolin temple is very famous for its Kongfu monks.A lot of young men go to Shaolin temp ...
- 经典实用jQuery soChange幻灯片实例演示
soChange一款多很经典的幻灯片的jQuery插件. 实例预览 引入文件 <link rel="stylesheet" type="text/css" ...
- 初学Node(二)package.json文件
package.json简介 package.json在Node项目中用于描述项目的一些基本信息,以及依赖的配置,一般每一个Node项目的根目录下都有一个package.json文件. 在项目的根目录 ...
- KindEditor编辑器在ASP.NET中的使用
KindEditor编辑器在ASP.NET中的使用 最近做的项目中都有用到富文本编辑器,一直在寻找最后用的富文本编辑器,之前用过CKEditor,也用过UEditor,这次打算用 一下KindEdit ...
- SQL2012 提示评估已过期 解决方案- sql server问题
SQL2012 提示评估已过期 解决方案提示评估已过期的解决方法和 sql2008一样 第1步:进入SQL2012配置工具中的安装中心第2步:再进入维护界面,选择版本升级第3步:进入产品密钥,输入密钥 ...
- 破解入门【OllyDebug爆破程序】
逆向破解这块我也是个刚起步的小菜,入门都还算不上吧,看了点基础教程,先动手练习一下增加点兴趣.嘿嘿 工具: peid //查壳工具 OllyDebug //反汇编.动态调试工具 ...