一.windows命令行编译命令java和javac、javap
首先我们需要编译一段java程序
public class JavaTest{
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
然后打开windows命令行界面win+R,打开:cmd
默认位置C盘下Users\dell文件夹下
可输入G(盘符): 进入指定的盘符 cd 文件夹路径 进入希望的文件夹
注意:使用java、javac和javap等命令,需要安装JDK,且需要jdk的bin目录添加到环境变量path下。
1.javac
Javac命令用来编译.java文件并生成.class文件
除了直接使用,还可以添加参数
javac -d destdir srcFile (destdir:目标文件夹;srcFile :需要编译的文件)
-d destdir是用来指定存放编译生成的.class文件的路径。(若此选项省略,那么默认在当前目录下生成.class文件,并且没有生成包文件夹;当前目录可以用“.”来表示,即:javac -d . srcFile )
注意:添加-d选项除了可以指定编译生成的.class文件的路径外,最大的区别是可以将源文件首行的package关键字下的包名在当前路径下生成文件夹。
package com.practice;
public class JavaTest{
public static void main(String[] args) {
System.out.println("Hello World!");
}
}
使用命令javac –d . JavaTest.java 会将pacage中的目录结构同时生成并将生成的.class文件放入该目录结构中
2.java
Java命令是运行该类的命令
如果在同级目录结构中编译.java文件,则可以直接运行该类;但是如果使用了javac -d destdir srcFile或编译的.class文件与当前文件不在同一级目录,则不能运行
必须要在之前加上包名
3.javap
javap主要用于帮助开发者深入了解Java编译器的机制,主要选项有:
-c 分解方法代码,即显示每个方法具体的字节码
-public | protected | package | private 用于指定显示哪种级别的类成员
-verbose 指定显示更进一步的详细信息
输入 javap -c com/practice/ JavacTest,显示如图:
二.JVM性能调优监控工具jps,jstack,jmap,jhat,jstat,hprof
JDK本身提供了很多方便的JVM性能调优监控工具,除了自带的集成式的VisualVM和jConsole外,还有jps、jstack、jmap、jhat、jstat、hprof等小巧的工具
VisualVM和jConsole等在jdk安装目录下的lib目录中
以下工具的使用要安装JDK(1.5及以后版本)且JDK的bin要配置到classpath中
1.jps
jps主要用来输出JVM中运行的进程状态信息。语法格式如下:
jps [options] [hostid]
如果不指定hostid就默认为当前主机或服务器。
命令行参数选项说明如下:
-q 不输出类名、Jar名和传入main方法的参数
-m 输出传入main方法的参数
-l 输出main类或Jar的全限名
-v 输出传入JVM的参数
2.jstack
jstack主要用来查看某个Java进程内的线程堆栈信息。语法格式如下:
jstack [option] pid
jstack [option] executable core
jstack [option][server-id@]remote-hostname-or-ip
命令行参数选项说明如下:
-l long listings,会打印出额外的锁信息,在发生死锁时可以用jstack -l pid来观察锁持有情况
-m mixed mode,不仅会输出Java堆栈信息,还会输出C/C++堆栈信息(比如Native方法)
jstack是java虚拟机自带的一种堆栈跟踪工具。jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的jstack使用方式只支持以下的这种方式:
jstack [-l] pid
jstack用于生成java虚拟机当前时刻的线程快照。线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。线程出现停顿的时候通过jstack来查看各个线程的调用堆栈,就可以知道没有响应的线程到底在后台做什么事情,或者等待什么资源。如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。
因此jstack命令主要用来查看Java线程的调用堆栈的,可以用来分析线程问题(如死锁)。
可以参考下面博客中的内容,加深理解
http://www.cnblogs.com/chenpi/p/5377445.html
3.jmap
jmap用来查看堆内存使用状况,一般结合jhat使用。
打印进程的类加载器和类加载器加载的持久代对象信息,输出:类加载器名称、对象是否存活(不可靠)、对象地址、父类加载器、已加载的类大小等信息。
可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。
jmap语法格式如下:
jmap [option] pid
jmap [option] executable core
jmap [option][server-id@]remote-hostname-or-ip
如果运行在64位JVM上,可能需要指定-J-d64命令选项参数。
jmap -permstat pid
1)、options:
executable Java executable from which thecore dump was produced.
(可能是产生core dump的java可执行程序)
core 将被打印信息的core dump文件
remote-hostname-or-IP 远程debug服务的主机名或ip
server-id 唯一id,假如一台主机上多个远程debug服务
2)、基本参数:
-dump:[live,]format=b,file=<filename>使用hprof二进制形式,输出jvm的heap内容到文件=. live子选项是可选的,假如指定live选项,那么只输出活的对象到文件.
-finalizerinfo 打印正等候回收的对象的信息.
-heap 打印heap的概要信息,GC使用的算法,heap的配置及wise heap的使用情况.
-histo[:live] 打印每个class的实例数目,内存占用,类全名信息. VM的内部类名字开头会加上前缀”*”. 如果live子参数加上后,只统计活的对象数量.
-permstat 打印classload和jvm heap长久层的信息. 包含每个classloader的名字,活泼性,地址,父classloader和加载的class数量. 另外,内部String的数量和占用内存数也会打印出来.
-F 强迫.在pid没有相应的时候使用-dump或者-histo参数. 在这个模式下,live子参数无效.
-h | -help 打印辅助信息
-J 传递参数给jmap启动的jvm.
pid 需要被打印配相信息的java进程id,创业与打工的区别 - 博文预览,可以用jps查问.
可以参考下面博客中的内容,加深理解
http://blog.csdn.net/sxb0841901116/article/details/46591807
4.jhat
是用来分析java堆的命令,可以将堆中的对象以html的形式显示出来,包括对象的数量,大小等等,并支持对象查询语言
可以参考下面博客中的内容,加深理解
http://blog.csdn.net/gtuu0123/article/details/6039474
5.jstat
jstat(JVM统计监测工具):个区内存和GC的情况
语法格式如下:
jstat [ generalOption | outputOptions vmid[interval[s|ms] [count]] ]
vmid是Java虚拟机ID,在Linux/Unix系统上一般就是进程ID。interval是采样时间间隔。count是采样数目。
可以参考下面博客中的内容,加深理解
http://blog.csdn.net/zhaozheng7758/article/details/8623549
6.hprof
hprof能够展现CPU使用率,统计堆内存使用情况。
语法格式如下:
java -agentlib:hprof[=options]ToBeProfiledClass
java -Xrunprof[:options] ToBeProfiledClass
javac -J-agentlib:hprof[=options]ToBeProfiledClass
可以参考下面博客中的内容,加深理解
http://geek.csdn.net/news/detail/90509
7.其它
Javah:用于根据JAVA本地方法,生成对应的c语言头文件及相应的stub文件的命令.
jdb:re文件和正在运行的Java进程进行实时地调试.
Jinfo:以输出并修改运行时的java 进程的opts.
可以参考下面博客中的内容,加深理解
http://blog.csdn.net/fenglibing/article/details/6411924