java命令行运行参数

简介: java命令行运行参数

Java在运行已编译完成的类时,是通过java虚拟机来装载和执行的,java虚拟机通过操作系统命令JAVA_HOME"bin/"java -option来启动,option为虚拟机参数, JAVA_HOME为JDK安装路径,通过虚拟机参数可对虚拟机的运行状态进行调整,掌握参数的含义可对虚拟机的运行模式有更深入的理解。

如何查看参数列表

虚拟机参数分为基本和扩展两类,在命令行中输入JAVA_HOME"bin/"java就可得到基本的参数列表,在命令行中输入JAVA_HOME"bin/"java -X就可以得到扩展参数列表。

基本参数说明

-client/-server

这两个参数用于设置虚拟机使用何种运行模式,client模式启动比较快,但运行时性能和内存管理效率不如server模式,通常用于客户端应用程序。相反,server模式启动稍慢,但可获得更高的运行性能。

在win上,缺省的虚拟机类型为client模式,如果要使用server模式就需要在启动虚拟机时加上-server参数,以获得更高性能。对服务器应用,推荐采用server模式,尤其是多个cpu的系统。

在Linux,Solaris上缺省采用的是server模式。

-hotspot

含义与client相同,jdk1.4以前使用的参数,现在已经不再使用,取而代之的是client

-classpath/-cp

虚拟机在运行一个类时需要将其装入内存,搜索类的方式和顺序如下:

  1. Bootstrap classes
  2. Extension Classes
  3. User Classes

Bootstrap中的路径是虚拟机自带的jar或zip文件,虚拟机首选搜索这些包文件,用下面这种方式可得到虚拟机搜索的路径:

System.getProperty("sun.boot.class.path")

Extension位于jre的lib/ext目录下的jar文件,虚拟机在搜索完Bootstrap后就搜索该目录下的jar文件,用下面这种方式可得到虚拟机使用的Extension搜索路径:

System.getProperty("java.ext.dirs")

User类搜索顺序为:

  1. -classpath指定的路径
  2. 环境变量CLASSPATH
  3. 当前目录

在使用-classpath/-cp时,多个目录之间用分号分隔。推荐使用该命令来指定虚拟机要搜索的类路径,而不是依赖环境变量,以减少多个项目同时使用环境变量时存在的潜在冲突(多版本库)。

可在运行时通过下面的代码获取虚拟机查找类的路径:

System.getProperty("java.class.path")

-D=value

在虚拟机的系统属性中设置属性名/值对,运行在此虚拟机上的应用程序可用:

System.getProperty("属性名")

得到value的值。

如果value中有空格,则需要用双引号将该值括起来,如:-Dname="kazaf f"

该参数通常用于设置系统级全局变量值,如配置文件路径,保证该属性在程序中任何地方都可访问。

-verbose[:class|gc|jni]

在输出设备上显示虚拟机运行信息。 -verbose-verbose:class含义相同,表示输出虚拟机装入的类的信息,格式如下:

[Loaded java.io.FilePermission$1 from shared objects file]

当虚拟机报告类找不到或类冲突时,用此参数来查看虚拟机装入类的情况。

-verbose:gc用于在虚拟机发生内存回收时在输出设备上显示信息,格式如下:

[Full GC 268K->168K(1984K), 0.0187390 secs]

-verbose:jni用于在虚拟机调用native方法时在设备上输出显示信息,格式如下:


[Dynamic-linking native method HelloNative.sum ... JNI]

该参数用于监视虚拟机调用本地方法的情况,在发生jni错误时可以为诊断提供便利。

-ea[:...|:]/-enableassertions[:...|:]

从jdk1.4开始,java可支持断言机制,用于诊断运行时问题。通常在测试阶段使断言有效,在线上运行时不需要运行断言。断言后的表达式的值是一个逻辑值,为true时断言不运行,为false时断言抛出java.lang.AssertionError错误。

这个参数就是用来设置虚拟机是否启动断言机制,缺省时虚拟机关闭断言机制,用-ea可打开断言机制,不加packagenameclassname表示运行所有包和类中的断言,如果希望只是运行某些包或类中的断言,可将包名或类名加到-ea之后,例如:-ea:com.foo.util

-da[:...|:]/-disableassertions[:...|:]
用来设置虚拟机关闭断言处理,用法与-ea类似。

-esa/-enablessystemassertions

设置虚拟机开启系统类的断言。

-dsa/-disablesystemassertions

设置虚拟机关闭系统类的断言。

-agentlib:[=]

该参数是jdk5新引入的,用于虚拟机装载本地代理库。其中libname为本地代理库文件名,虚拟机的搜索路径为环境变量path中的路径,options为传给本地库启动时的参数,多个参数之间用逗号分隔。

在win平台中,虚拟机搜索本地库后缀名名为.dll,在Unix上则为.so文件。例如可以用-agentlib:hprof来获取虚拟机的运行情况。可用-agentlib:hprof=help来得到使用帮助列表(确保在win平台下的jre的lib目录下存在hprof.dll文件)。

-agentpath:[=]

设置虚拟机按全路径装载本地库,不再搜索PATH中的路径,其他功能同-agentlib

-javaagent:[=]

虚拟机启动时装入java语言设备代理。jarpath文件中的mainfest文件必须有Agent-Class属性。代理类要实现

public static void premain(String agentArgs, Instrumentation inst)

方法。当虚拟机初始化时,将按照代理类的说明顺序调用premain方法。

扩展参数说明

-Xmixed

设置-client模式虚拟机对使用频率高的方法进行Just-In-Time编译和执行,对其他方法使用解释方式执行,该方式是虚拟机缺省模式。

-Xint

设置-client模式下运行的虚拟机以解释方式执行类的字节码,不将字节码编译为本机码。

-Xbootclasspath[/a|/p]:path

改变虚拟机装载缺省系统运行包rt.jar的路径,从-Xbootclasspath中设定的搜索路径中装载运行类。除非你自己能写一个运行时,否则不会用到这个参数。

其中/a将在缺省搜索路径后加上path中的搜索路径,而/p在缺省路径前先搜索path中的路径。

-Xnoclassgc

关闭虚拟机对class的垃圾回收功能。

-Xincgc

启动增量垃圾收集器,缺省是关闭的。增量垃圾收集器能减少偶尔发生的长时间的垃圾回收造成的暂停时间。但增量垃圾收集器和应用程序并发执行,因此会占用部分CPU在应用程序上的功能。

-Xloggc:

将虚拟机每次垃圾回收的信息写到日志文件中,文件名由file指定,内容和-verbose:gc输出内容相同。

-Xbatch

虚拟机的缺省运行方式是在后台编译类代码,然后在前台执行代码,使用该参数将关闭虚拟机后台编译,在前台编译完成后再执行。

-Xms

设置虚拟机可用内存堆的初始大小,缺省单位为字节。该大小为1024的整数倍并且要大于1MB,可用k(K)或m(M)为单位来设置较大的内存数。初始堆的大小为2MB。例如:-Xms6400K-Xms256M

-Xmx

设置虚拟机内存堆的最大可用大小,缺省单位为字节,缺省堆最大值为64MB。该值必须为1024整数倍并且要大于2MB,可用k(K)或m(M)为单位来设置较大的内存数。

当应用程序申请了大内存,运行时虚拟机抛出java.lang.OutOfMemoryError: Java heap space错误,就需要用改参数设置更大的内存数。

-Xss

设置线程栈的大小,缺省单位为字节,通常操作系统分配给线程栈的缺省大小为1MB。另外,也可以在java中创建线程对象时设置栈的大小,构造函数原型为:

Thread(ThreadGroup group, Runnable target, String name, long stackSzie)

-Xprof

输出CPU运行时的诊断信息。

-Xfuture

对类文件进行严格格式检查,以保证类代码符合类代码规范。为保证向后兼容,虚拟机缺省不进行严格的格式检查。

-Xrs

减少虚拟机中操作系统的信号的使用。该参数通常在虚拟机以后台服务方式运行时使用(如Serlet)。

-Xcheck:jni

对jni函数执行检查。

-Xshare:off

不尝试使用共享类的数据

-Xshare:auto

在可能的情况下使用共享类的数据,默认值。

-Xshare:on

要求使用共享类的数据,否则运行失败。

相关文章
|
1月前
|
Java 编译器 C++
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
这篇文章解释了Java能够实现“一次编写,到处运行”的原因,主要归功于Java虚拟机(JVM),它能够在不同平台上将Java源代码编译成的字节码转换成对应平台的机器码,实现跨平台运行。
【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?
|
26天前
|
Java 容器
【Azure Function App】Java Function在运行中遇见内存不足的错误
【Azure Function App】Java Function在运行中遇见内存不足的错误
|
27天前
|
Java
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
【Azure 应用服务】如何查看App Service Java堆栈JVM相关的参数默认配置值?
|
20天前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
68 0
|
20天前
|
C# 开发者 Windows
震撼发布:全面解析WPF中的打印功能——从基础设置到高级定制,带你一步步实现直接打印文档的完整流程,让你的WPF应用程序瞬间升级,掌握这一技能,轻松应对各种打印需求,彻底告别打印难题!
【8月更文挑战第31天】打印功能在许多WPF应用中不可或缺,尤其在需要生成纸质文档时。WPF提供了强大的打印支持,通过`PrintDialog`等类简化了打印集成。本文将详细介绍如何在WPF应用中实现直接打印文档的功能,并通过具体示例代码展示其实现过程。
79 0
|
27天前
|
Java Maven C++
【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
【Azure Developer】记录一次使用Java Azure Key Vault Secret示例代码生成的Jar包,单独运行出现 no main manifest attribute, in target/demo-1.0-SNAPSHOT.jar 错误消息
|
27天前
|
Java Spring
【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
【Azure 应用服务】一个 App Service 同时部署运行两个及多个 Java 应用程序(Jar包)
|
27天前
|
缓存 前端开发 Java
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
【Azure 应用服务】App Service 使用Tomcat运行Java应用,如何设置前端网页缓存的相应参数呢(-Xms512m -Xmx1204m)?
|
28天前
|
运维 监控 Java
【JVM 调优秘籍】实战指南:JVM 调优参数全解析,让 Java 应用程序性能飙升!
【8月更文挑战第24天】本文通过一个大型在线零售平台的例子,深入探讨了Java虚拟机(JVM)性能调优的关键技术。面对应用响应延迟的问题,文章详细介绍了几种常用的JVM参数调整策略,包括堆内存大小、年轻代配置、垃圾回收器的选择及日志记录等。通过具体实践(如设置`-Xms`, `-Xmx`, `-XX:NewRatio`, `-XX:+UseParallelGC`等),成功降低了高峰期的响应时间,提高了系统的整体性能与稳定性。案例展示了合理配置JVM参数的重要性及其对解决实际问题的有效性。
48 0
|
28天前
|
Java 编译器 开发工具
JDK vs JRE:面试大揭秘,一文让你彻底解锁Java开发和运行的秘密!
【8月更文挑战第24天】JDK(Java Development Kit)与JRE(Java Runtime Environment)是Java环境中两个核心概念。JDK作为开发工具包,不仅包含JRE,还提供编译器等开发工具,支持Java程序的开发与编译;而JRE仅包含运行Java程序所需的组件如JVM和核心类库。一个简单的"Hello, World!"示例展示了两者用途:需借助JDK编译程序,再利用JRE或JDK中的运行环境执行。因此,开发者应基于实际需求选择安装JDK或JRE。
38 0