最近在学习Gradle相关的知识。下载Gradle源码后,未能成功导入IDEA运行。所以想另辟蹊径,通过命令行来调试运行Gradle程序。经过一番搜索和思考。发现Java通过jdwp可以远程调试java程序的。在实践的过程中,对一些命令行参数的含义不是特别清楚。故有此篇文章。
1. java命令 Oracle官方文档链接
java命令是用来启动一个Java程序的。
2. 概览
java [ options ] class [ arguments ]
java [ options ] -jar file.jar [ arguments ]
options
Command-line options. See Options.
class
The name of the class to be called.
file.jar
The name of the JAR file to be called. Used only with the -jar command.
arguments
The arguments passed to the main function.
3. 命令参数详解
java命令通过启动Java运行时环境,加载指定的类并调用该类的main方法来启动一个Java应用程序
指定的class需要声明一个main方法,格式如下:
public static void main(String[] args)
如果java命令后面没有option参数,那么紧跟其后的第一个参数就是Class的全路径二进制名。例如 java com.test.Test。如果指定了-jar。那么-jar后面跟的就是个包含了main方法的JAR文件,例如 java -jar Test.jar
Java虚拟机启动的时候需要加载启动类和其他需要用到的类。查找的顺序分别是启动类路径,扩展类路径,以及用户类路径。可以通过java -verbose:class查看类加载的顺序
Options
当前的Java虚拟机支持的Options分成Standard Options和NonStandard Options
1. Standard Options
-client
-server
两种java虚拟机的启动方式,默认是用server模式
-agentlib:libname[=options]
加载Native agent library,举例说明: -agentlib:hprof dump堆栈 -agentlib:jdwp=help 命令行调试帮助 -agentlib:hprof=help dump堆栈的帮助
-agentpath:pathname[=options]
通过library的全路径名加载
-cp classpath
这个参数是用来指定类加载的路径。可以指定一个或者多个目录,JAR文件,或者ZIP文件,类加载会从指定的文件中查找。如果有多个文件用:隔开 如果-classpath或-cp和CLASSPATH都没有指定,那么默认会从执行java命令的当前目录查找类 为了方便,我们还可以用通配符*来代替多个路径 例如,如果目录mydir包含a.jar和b.JAR,则类路径元素mydir / *将扩展为A.jar:b.JAR,但不指定jar文件的顺序。列表中包含指定目录中的所有jar文件,包括隐藏的文件。一个仅包含*的类路径条目 展开为当前目录中所有jar文件的列表。定义的CLASSPATH环境变量将被类似地扩展。任何类路径通配符扩展都在Java VM启动之前发生。除了通过查询环境外,没有任何Java程序会看到没有扩展的通配符。例如,通过调用System.getenv(“CLASSPATH”)。
-Dproperty=value设置系统属性.
设置系统属性.
-d32
-d64
在32位或64位模式下运行
-disableassertions[:package name”…” | :class name ] -da[:package name”…” | :class name ]
禁用断言
-enableassertions[:package name”…” | :class name ] -ea[:package name”…” | :class name ]
开启断言
-verbose
-verbose:class
显示类加载的信息
-verbose:gc
打印GC信息
-verbose:jni
打印jni相关信息
2. NonStandard Options
-X
打印出NonStandard Options(非标准参数)的帮助信息,并退出jvm
-Xint
让虚拟机只在解释型模式下运行,不允许生成本地指令(就是禁用JIT)。有可能会损失性能
-Xbatch
禁止后台编译。通常jvm编译方法是在后台进行的。
-Xnoclassgc
禁止Class常量被垃圾回收器回收。有可能会导致OutOfMemoryError
-Xincgc
开启增量垃圾回收。可以降低GC暂停时间
-Xloggc:file
打印GC log到指定文件。和-verbose:gc一起使用
-Xmnsize or -XX:NewSize
指定年轻代的大小
-Xmsn
指定java堆的初始大小
例子:
-Xms6291456
-Xms6144k
-Xms6m
-Xmxn
指定java堆的最大大小
例子:
-Xmx83886080
-Xmx81920k
-Xmx80m
-Xprof
分析正在运行的程序,并将分析数据发送到标准输出。该选项作为一个在程序开发中很有用的实用程序提供,并不打算用于生产系统。
-Xssn
设置java线程栈大小
-Xverify:mode
是否校验字节码格式。mode有如下三种
remote 默认方式。校验所有非bootstrap class loader加载类的字节码
all 校验所有的字节码
none 不校验字节码。但是目前没有支持
-XX:+|-DisableAttachMechanism
是否允许Java VM被命令attach。默认是关闭的。如果要开启可以如下命令
java -XX:+DisableAttachMechanism
-XX:+|-FlightRecorde
性能分析工具。
-XXLargePageSizeInBytes=n
Specifies the maximum size for large pages.
-XX:MaxGCPauseMillis=n
设置最大的GC 暂停时间
-XX:NewSize
同-Xmnsize.
-XX:ParallelGCThreads=n
设置并行垃圾回收的线程数量
-XX:+UseConcMarkSweepGC or -XX:+UseG1GC
开启Concurrent Mark Sweep (CMS) 或 G1 垃圾回收器.
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps
打印带时间戳的垃圾回收日志