编译执行相关
javac
编译 Java 文件,生成 .class 二进制文件
1 | public class HelloWorld { |
编译并生成:
1 | // -d 参数表示指定目录,默认为当前目录 |
java
执行 .class 文件,先判断 HelloWorld.java 文件中是包含包名:
不包含包名,直接执行
1
2xmt@server005:~/test/java$ java HelloWorld
HelloWorld!包含包名,需要显示指定包路径
比如包名为:com.company.department1
2xmt@server005:~/test/java$ java com/company/department/HelloWorld
HelloWorld!执行
jar包中的某个.class文件java -cp jarPath com.***.Test,其中jarPath为jar包完整路径名,.class文件需要完整包名加类名。
注意: 包名之间是反斜杠
/,特别是Windows环境中。
javap
反汇编器,可以查看编译器为我们生成的字节码
1 | // -c -v 命令为反编译 |
调试
jps
jps(Java Virtual Machine Process Status Tool) 是 JDK 1.5 提供的一个显示当前所有 java 进程 pid 的命令,简单实用,非常适合在 linux/unix 平台上简单察看当前 java 进程的一些简单情况。命令路径:JAVA_HOME/bin/java 程序在启动以后,会在 java.io.tmpdir 指定的目录下,就是临时文件夹里,生成一个类似于 hsperfdata_User 的文件夹,这个文件夹里(在 Linux 中为 /tmp/hsperfdata_{userName}/)的文件,名字就是进程的 pid。因此列出当前运行的 java 进程,只是把这个目录里的文件名列一下而已。 至于系统的参数等,就可以解析这几个文件获得。
遇到的问题
现象:用ps -ef|grep java能看到启动的java进程,但是用jps查看却不存在该进程的id,jconsole、jvisualvm可能无法监控该进程,其他java自带工具也可能无法使用
分析:jps、jconsole、jvisualvm等工具的数据来源就是这个文件(/tmp/hsperfdata_userName/pid)。所以当该文件不存在或是无法读取时就会出现jps无法查看该进程号,jconsole无法监控等问题。可以检查该文件权限,或者确定文件是否异常示例
1 | xmt@server005:/tmp/hsperfdata_xmt$ jps |
jstack
语法格式: jstack <pid> 可以用 jps 查看 java 进程 idjstack 可以定位到线程堆栈,根据堆栈信息我们可以定位到具体代码,所以它在JVM性能调优中使用得非常多。
我们能看到:
* 线程的状态: waiting on condition
* 线程的调用栈
* 线程的当前锁住的资源: <0x*>
1 | xmt005:/tmp/hsperfdata_xmt$ jps |
JVM 常见参数
| 选项 | 描述 |
|---|---|
| -XX:+TraceClassLoading | 打印类加载日志,别名 -verbose:class |
| -Xms | 初始堆大小。如:-Xms256m |
| -Xmx | 最大堆大小。如:-Xmx512m |
| -Xmn | 新生代大小。通常为最大堆的 1/3 或 1/4。新生代 = Eden + 2 个 Survivor 空间。实际可用空间为 = Eden + From,即 90% 的空间 |
| -XX:NewRatio | 新生代与老年代的比例,如 –XX:NewRatio=2,则新生代占整个堆空间的 1/3,老年代占 2/3 |
| -XX:SurvivorRatio | 新生代中 Eden 与 Survivor 的比值。默认值为 8。即 Eden 占新生代空间的 8/10,另外两个 Survivor 各占 1/10 |
| -XX:PretenureSizeThreshold | 老年代门限值,大小大于这个值的对象直接分配进老年代,这个参数只对 Serial 和 ParNew 收集器生效 |
| -XX:MaxTenuringThreshold | 对象从新生代晋升到老年代的年龄阀值,默认为 15 |
| -XX:+PrintGC | 开启 GC 打印简单信息,别名 -verbose:gc |
| -XX:+PrintGCDetails | 打印 GC 详细信息,通常默认会包含 -XX:+PrintGC 的信息 |
| -XX:+PrintHeapAtGC | 打印 GC 前后的堆信息 |
| -Xss | JDK1.5+ 每个线程堆栈大小为 1M 。如果超出抛出 StackOverflowError |
| -XX:PermSize | 永久代(方法区)的初始大小,Java 8 中已经使用元空间,降级 |
| -XX:MaxPermSize | 永久代(方法区)的最大值,Java 8 中已经使用元空间,降级 |
| -XX:+HeapDumpOnOutOfMemoryError | 让虚拟机在发生内存溢出时 Dump 出当前的内存堆转储快照,以便分析用 |
| -XX:+UseSerialGC | 使用 Serial + Serial Old 收集器组合回收内存 |
| -XX:+UseParNewGC | 使用 ParNew + Serial Old 收集器组合回收内存 |
| -XX:+UseConcMarkSweepGC | 使用 ParNew + CMS + Serial Old 收集器组合回收内存,Serial Old 作为 CMS 失败时的备用收集器 |
| -XX:+UseParallelGC | 使用 Parallel Scavenge 收集新生代 |
| -XX:+UseParallelOldGC | 使用 Parallel Old 收集老年代,默认同时开启 -XX:+UseParallelGC |
其他常见命令
javadoc
javadoc 用来生成 Java 注释和 API 文档。
格式:javadoc -d targetDirectory package.name 。
示例:javadoc -d mydoc com.android.mycode 。
1 | xmt@server005:~/$ javadoc -d mydoc annotation.subdir |