您的位置:首页 > 编程语言 > Java开发

【知了堂学习笔记】java中的编译命令和JVM性能调优监控工具

2017-10-19 19:24 1081 查看

一.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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: