JVM启动参数

JVM

包括以下几个方面:

熟悉jvm 规范

熟悉jvm内存管理机制

熟悉jvm classloader机制

能够编写下列工具:

反编译java代码工具
混淆java代码工具
jvm内存监控工具
字节码生成工具



1.1 格式
java [jvmargs] class [arguments]

1.2 标准参数
1.-server

-client

虚拟机服务器模式/客户机模式,使用server模式可以提高性能,启动比client模式慢,长期运行则比client模式快。当该参数不指定时,虚拟机启动检测主机是否为服务器,如果是则以server模式启动,否则以client模式启动,J2SE5.0检测的根据是至少2个CPU和最低2GB内存

2.-agentlib:<lib-name>=<options>

-agentpath:<lib-path>=<options>

本地类库加载,当你的部分类包含一些本地方法时,需要自己编写本地代码并位于操作系统加载共享包(dll)的路径上,如果你不喜欢将该包放在操作系统识别的加载上,则可以通过指定这个参数来加载自己的本地共享包(dll)。不同之处在于-agentlib中仅指定包名,根据操作系统的不同虚拟机在一定路径上搜索该包,譬如对于windows平台虚拟机在PATH路径上搜索该包,而lib-path则是指定全路径,例如

-agentlib:hprof 在windows平台虚拟机会在启动时到PATH路径上搜索hprof.dll并加载

虚拟机在加载代理包之后有一个启动的操作(详细参见JDK参考),<options>指的是代理包的启动参数

3.-classpath classpath

   -c classpath

指定类路径,系统应用类加载器(ClassLoader)会到该路径下加载类

4.-Dproperty=value

设置系统属性,可以通过System.getProperty(property)获得

5.-enableassertions[:<package name>"..." | :<class name> ]

   -ea[:<package name>"..." | :<class name> ]

   -disableassertions[:<package name>"..." | :<class ; ]

   -da[:<package name>"..." | :<class name> ]

   启用和停用断言,默认是停用断言。断言指的是从JDK1.4开始在支持的关键字assert,assert(booleanvalue),当booleanvalue为false时,抛出java.lang.AssertionError,必须指出的是,代码编译必须是1.4及其以上顺从的,即编译时使用如下参数

java -source 1.4

   一般仅在开发阶段启用断言,而在运行阶段不使用

   其使用包括如下几种情况

   java -ea//启动断言

   java -ea:pkname... //在包pkname及其子包下起用断言

   java -ea:pkname.classname //对类 pkname.classname启用断言

   停用断言与启用设置类似

6.-enablesystemassertions

   -esa

   -disablesystemassertions

-dsa

   启用和停用系统类断言

7.-jar

   运行包含在一个jar包里的程序,一般在jar包的/META-INF/MANIFEST.MF文件中指定Main-Class值为要运行的主函数,譬如 Main-Class:ayufox.ejb3.Test

8.-javaagent:<classname>[<=options>]

   加载java语言代理,该功能是JDK5新增加的,可以通过该设置在JVM运行主函数(main)之前做一些预处理工作,其中classname中必须包含有静态方法

   public static void premain(String agentArgs, Instrumentation inst) { ... }

   上面的options即是传入该函数的代理参数agentArgs,关于Instrumentation详细参见包java.lang.instrument

9.-verbose

   -verbose:class

   -verbose:gc

   -verbose:jni

   在运行时

   class:将类加载情况在控制台中打印出来

   gc:将虚拟机的垃圾回收事件信息打印

   jni:放本地方法调用信息打印

   -verbose与-verbose:class一样

10.-version

-showversion

显示版本信息,不同在于第一种显示版本后虚拟机结束退出

11.-?

-help

显示帮助信息并退出

12.-X

显示非标准参数(见下面介绍)并退出

1.3 非标准参数(以-X开头)
1.-Xint

   所有字节码以解析模式运行。第一代虚拟机即是以这种方式运行,由于需要Java解析器解析运行,所以效率比较低;第二代虚拟机则采用将字节码编译成本地代码的方式,效率大大提高;第三代虚拟机也叫自适应(HotSpot)虚拟机,通过监测代码的执行情况检测出代码被频繁执行的部分,将其尽量优化成本地代码方式运行,而对于普通部分,则采用解析的模式运行。

2.-Xbatch

   禁止后台编译,一般HotSpot虚拟机在检测到一段代码为频繁执行代码需要将其编译成本地代码时,会启动一个后台线程完成这个工作,而同时采用解析的方式继续运行字节码。如果设置了该参数,则会停止继续执行字节码,先将其编译成本地代码,然后再继续执行。

3.-Xdebug

   -Xnoagent

   -Xrun

   -Xrunjdwp

启用调试模式,见前面的《利用JPDA构建调试平台》这篇文章,后面将在一个独立的文章中详细介绍

4.-Xbootclasspath:bootclasspath

   -Xbootclasspath/a:path

   -Xbootclasspath/p:path

设置启动根Classpath,即使启动类加载器将在何处加载对象,关于类启动加载器,参见《JVM类加载器体系结构》说明,分号后面的值指定路径,以分号隔开。其区别在于,-Xbootclasspath:bootclasspath将新的根加载路径覆盖默认的路径(\jre\lib\rt.jar),-Xbootclasspath/a:path将新的根加载路径和原有的根加载路径相结合,-Xbootclaspath/p:path将新的根加载路径与原有的根加载路径相结合,加载类时优先搜索该加载路径

5.-Xcheck:jni

   对本地调用(JNI)采用更严格的检测方式,在进行JNI调用之前检测数据和传入参数,如果碰到不合法的数据则强制结束掉虚拟机,对运行性能有损害

6.-Xfuture

   对类格式(class文件格式)采用更严格的检测方式,以便向后兼容,最好在开发时采用该参数

7.-Xnoclassgc

   不使用回收装载类的内存(转贴备注:按原文修改)

8.-Xloggc:file

   与-verbose:gc功能一样,不同在于-Xloggc:file将信息记录到一个文件,而-verbose:gc将其输出到控制台

9.-Xincgc

   -Xmsn

   -Xmxn

   -Xssn

跟内存分配和垃圾回收相关,-Xincgc表示采用渐进式垃圾回收,-Xmsn设置初始内存池大小,-Xmxn表示内存池允许的最大大小,-Xssn是线程栈大小,n是要设置的值,必须是1024的倍数,譬如

-Xms6291456 -Xmx83886080

-Xms6144k -Xmx81920k

-Xms6m -Xmx80m

该部分对虚拟机的性能非常重要,在后面将有独立的篇章详细介绍

10.-Xprof

-Xrunhprof[:help][:<suboption>=<value>,...]

在运行时剖析运行情况,并将剖析结果打印到控制台,其中后一个可以指定特定剖析对象,譬如cpu,堆(heap)等,可以运行java -Xrunhprof:help获得可以剖析的对象和取值

11.-Xrs

减少JVM对操作系统信号量的使用,J2SE1.3.1开始引入。

SUN在J2SE1.3.0中增加了Java应用程序关闭时的回调钩子(Hook),以便当JVM意外终止时用户可以做一些资源清除工作。JVM监视控制台事件以实现JVM意外终止时的回调。JVM明确地注册了一个控制台控制处理器,当JVM接收到CTRL_C_EVENT, CTRL_CLOSE_EVENT, CTRL_LOGOFF_EVENT, 或CTRL_SHUTDOWN事件时,该处理器介入关闭回掉钩子(HOOK)的处理。

如果虚拟机以服务的方式运行(譬如WEB服务器)当其收到CTRL_LOGOFF_EVENT事件,由于系统并不会因此终止JVM进程,故JVM不可以进行终止的操作,然而这与如上产生了冲突(不结束却又调用关闭回调钩子),为了避免这个问题,从J2SE1.3.1使用-Xrs以使JVM不再监测控制台事件。

参考:JDK5.0参考文档http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/java.html



在Java、J2EE大型应用中,JVM非标准参数的配置直接关系到整个系统的性能。特别是一些大型的BT网站。
JVM非标准参数指的是JVM底层的一些配置参数,这些参数在一般开发中默认即可,不需要任何配置。但是在生产环境中,为了提高性能,往往需要调整这些参数,以求系统达到最佳新能。
另外这些参数的配置也是影响系统稳定性的一个重要因素,相信大多数Java开发人员都见过“OutOfMemory”类型的错误。呵呵,这其中很可能就是JVM参数配置不当或者就没有配置没意识到配置引起的。

为了说明这些参数,还需要说说JDK中的命令行工具一些知识做铺垫。

首先看如何获取这些命令配置信息说明:
假设是windows平台,你安装了J2SDK,那么现在你从cmd控制台窗口进入J2SDK安装目录下的bin目录,然后运行java命令,出现如下结果,这些就是包括java.exe工具的和JVM的所有命令都在里面。

-----------------------------------------------------------------------
D:\j2sdk15\bin>java
Usage: java [-options] class [args...]
(to execute a class)
or java [-options] -jar jarfile [args...]
(to execute a jar file)

where options include:
-client to select the "client" VM
-server to select the "server" VM
-hotspot is a synonym for the "client" VM [deprecated]
The default VM is client.

-cp
-classpath
A ; separated list of directories, JAR archives,
and ZIP archives to search for class files.
-D=
set a system property
-verbose[:class|gc|jni]
enable verbose output
-version print product version and exit
-version:
require the specified version to run
-showversion print product version and continue
-jre-restrict-search | -jre-no-restrict-search
include/exclude user private JREs in the version search
-? -help print this help message
-X print help on non-standard options
-ea[:...|:]
-enableassertions[:...|:]
enable assertions
-da[:...|:]
-disableassertions[:...|:]
disable assertions
-esa | -enablesystemassertions
enable system assertions
-dsa | -disablesystemassertions
disable system assertions
-agentlib:[=]
load native agent library , e.g. -agentlib:hprof
see also, -agentlib:jdwp=help and -agentlib:hprof=help
-agentpath:[=]
load native agent library by full pathname
-javaagent:[=]
load Java programming language agent, see java.lang.instrument
-----------------------------------------------------------------------
在控制台输出信息中,有个-X(注意是大写)的命令,这个正是查看JVM配置参数的命令。

其次,用java -X 命令查看JVM的配置说明:
运行后如下结果,这些就是配置JVM参数的秘密武器
-----------------------------------------------------------------------
D:\j2sdk15\bin>java -X
-Xmixed mixed mode execution (default)
-Xint interpreted mode execution only
-Xbootclasspath:
set search path for bootstrap classes and resources
-Xbootclasspath/a:
append to end of bootstrap class path
-Xbootclasspath/p:
prepend in front of bootstrap class path
-Xnoclassgc disable class garbage collection
-Xincgc enable incremental garbage collection
-Xloggc: log GC status to a file with time stamps
-Xbatch disable background compilation
-Xms set initial Java heap size
-Xmx set maximum Java heap size
-Xss set java thread stack size
-Xprof output cpu profiling data
-Xfuture enable strictest checks, anticipating future default
-Xrs reduce use of OS signals by Java/VM (see documentation)
-Xcheck:jni perform additional checks for JNI functions
-Xshare:off do not attempt to use shared class data
-Xshare:auto use shared class data if possible (default)
-Xshare:on require using shared class data, otherwise fail.

The -X options are non-standard and subject to change without notice.
-----------------------------------------------------------------------

JVM配置参数中文说明:
-----------------------------------------------------------------------
1、-Xmixed mixed mode execution (default)
混合模式执行

2、-Xint interpreted mode execution only
解释模式执行

3、-Xbootclasspath:
set search path for bootstrap classes and resources
设置zip/jar资源或者类(.class文件)存放目录路径

3、-Xbootclasspath/a:
append to end of bootstrap class path
追加zip/jar资源或者类(.class文件)存放目录路径

4、-Xbootclasspath/p:
prepend in front of bootstrap class path
预先加载zip/jar资源或者类(.class文件)存放目录路径

5、-Xnoclassgc disable class garbage collection
关闭类垃圾回收功能

6、-Xincgc enable incremental garbage collection
开启类的垃圾回收功能

7、-Xloggc: log GC status to a file with time stamps
记录垃圾回日志到一个文件。

8、-Xbatch disable background compilation
关闭后台编译

9、-Xms set initial Java heap size
设置JVM初始化堆内存大小

10、-Xmx set maximum Java heap size
设置JVM最大的堆内存大小

11、-Xss set java thread stack size
设置JVM栈内存大小

12、-Xprof output cpu profiling data
输入CPU概要表数据

13、-Xfuture enable strictest checks, anticipating future default
执行严格的代码检查,预测可能出现的情况

14、-Xrs reduce use of OS signals by Java/VM (see documentation)
通过JVM还原操作系统信号

15、-Xcheck:jni perform additional checks for JNI functions
对JNI函数执行检查

16、-Xshare:off do not attempt to use shared class data
尽可能不去使用共享类的数据

17、-Xshare:auto use shared class data if possible (default)
尽可能的使用共享类的数据

18、-Xshare:on require using shared class data, otherwise fail.
尽可能的使用共享类的数据,否则运行失败

The -X options are non-standard and subject to change without notice.
-----------------------------------------------------------------------

怎么用这这些参数呢?其实所有的命令行都是这么用,下面是一个简单的HelloWorl的例子来演示这个参数的用法

HelloWorld.java
-----------------------------------------------
public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello World!");
}
}

编译并运行:
D:\j2sdk15\bin>javac HelloWorld.java

D:\j2sdk15\bin>java -Xms256M -Xmx512M HelloWorld
Hello World!

呵呵,这下满足了吧!

实践:在大型系统或者应用中配置JVM参数
比如配置IDE工具的参数,常见的有IDEA、Eclipse,这个是在一个配置文件中指定即可。
如果要在J2EE环境中配置这些参数,那么需要在J2EE应用服务器或者Servlet容器相关启动参数设置处指定,其启动文件中来配置,Tomcat是在catalina.bat中配置,weblogic和websphere是在其他地方

几个Java命令行说明,以供参考:

(1)、javac
用法:javac <选项> <源文件>
其中,可能的选项包括:
-g 生成所有调试信息
-g:none 不生成任何调试信息
-g:{lines,vars,source} 只生成某些调试信息
-nowarn 不生成任何警告
-verbose 输出有关编译器正在执行的操作的消息
-deprecation 输出使用已过时的 API 的源位置
-classpath <路径> 指定查找用户类文件的位置
-cp <路径> 指定查找用户类文件的位置
-sourcepath <路径> 指定查找输入源文件的位置
-bootclasspath <路径> 覆盖引导类文件的位置
-extdirs <目录> 覆盖安装的扩展目录的位置
-endorseddirs <目录> 覆盖签名的标准路径的位置
-d <目录> 指定存放生成的类文件的位置
-encoding <编码> 指定源文件使用的字符编码
-source <版本> 提供与指定版本的源兼容性
-target <版本> 生成特定 VM 版本的类文件
-version 版本信息
-help 输出标准选项的提要
-X 输出非标准选项的提要
-J<标志> 直接将 <标志> 传递给运行时系统

(2)、jar
用法:jar {ctxu}[vfm0Mi] [jar-文件] [manifest-文件] [-C 目录] 文件名 ...
选项:
-c 创建新的存档
-t 列出存档内容的列表
-x 展开存档中的命名的(或所有的〕文件
-u 更新已存在的存档
-v 生成详细输出到标准输出上
-f 指定存档文件名
-m 包含来自标明文件的标明信息
-0 只存储方式;未用ZIP压缩格式
-M 不产生所有项的清单(manifest〕文件
-i 为指定的jar文件产生索引信息
-C 改变到指定的目录,并且包含下列文件:
如果一个文件名是一个目录,它将被递归处理。
清单(manifest〕文件名和存档文件名都需要被指定,按'm' 和 'f'标志指定的相同顺序。

示例1:将两个class文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvf classes.jar Foo.class Bar.class
示例2:用一个存在的清单(manifest)文件 'mymanifest' 将 foo/ 目录下的所有
文件存档到一个名为 'classes.jar' 的存档文件中:
jar cvfm classes.jar mymanifest -C foo/ .

(3)、javadoc
javadoc: 错误 - 未指定软件包或类。
用法:javadoc [选项] [软件包名称] [源文件] [@file]
-overview <文件> 读取 HTML 文件的概述文档
-public 仅显示公共类和成员
-protected 显示受保护/公共类和成员(默认)
-package 显示软件包/受保护/公共类和成员
-private 显示所有类和成员
-help 显示命令行选项并退出
-doclet <类> 通过替代 doclet 生成输出
-docletpath <路径> 指定查找 doclet 类文件的位置
-sourcepath <路径列表> 指定查找源文件的位置
-classpath <路径列表> 指定查找用户类文件的位置
-exclude <软件包列表> 指定要排除的软件包的列表
-subpackages <子软件包列表> 指定要递归装入的子软件包
-breakiterator 使用 BreakIterator 计算第 1 句
-bootclasspath <路径列表> 覆盖引导类加载器所装入的
类文件的位置
-source <版本> 提供与指定版本的源兼容性
-extdirs <目录列表> 覆盖安装的扩展目录的位置
-verbose 输出有关 Javadoc 正在执行的操作的消息
-locale <名称> 要使用的语言环境,例如 en_US 或 en_US_WIN
-encoding <名称> 源文件编码名称
-quiet 不显示状态消息
-J<标志> 直接将 <标志> 传递给运行时系统

通过标准 doclet 提供:
-d <目录> 输出文件的目标目录
-use 创建类和软件包用法页面
-version 包含 @version 段
-author 包含 @author 段
-docfilessubdirs 递归复制文档文件子目录
-splitindex 将索引分为每个字母对应一个文件
-windowtitle <文本> 文档的浏览器窗口标题
-doctitle 包含概述页面的标题
-header 包含每个页面的页眉文本
-footer 包含每个页面的页脚文本
-bottom 包含每个页面的底部文本
-link 创建指向位于 的 javadoc 输出的链接
-linkoffline 利用位于 的软件包列表链接至位于
的文档
-excludedocfilessubdir <名称 1>:..排除带有给定名称的所有文档文件子目录。
-group <名称> :.. 在概述页面中,将指定的软件包分组
-nocomment 抑止描述和标记,只生成声明。
-nodeprecated 不包含 @deprecated 信息
-noqualifier <名称 1>:<名称 2>:...从输出中排除限定符的列表。
-nosince 不包含 @since 信息
-notimestamp 不包含隐藏时间戳
-nodeprecatedlist 不生成已过时的列表
-notree 不生成类分层结构
-noindex 不生成索引
-nohelp 不生成帮助链接
-nonavbar 不生成导航栏
-serialwarn 生成有关 @serial 标记的警告
-tag <名称>:<位置>:<标题> 指定单个变量自定义标记
-taglet 要注册的 Taglet 的全限定名称
-tagletpath Taglet 的路径
-charset <字符集> 用于跨平台查看生成的文档的字符集。
-helpfile <文件> 包含帮助链接所链接到的文件
-linksource 以 HTML 格式生成源
-sourcetab <制表符长度> 指定源中每个制表符占据的空格数
-keywords 使软件包、类和成员信息附带 HTML 元标记
-stylesheetfile <路径> 用于更改生成文档的样式的文件
-docencoding <名称> 输出编码名称

(4)、rmid
rmid: 非法选项:-?
用法:rmid
其中, 包括:
-port 指定供 rmid 使用的端口
-log 指定 rmid 将日志写入的目录
-stop 停止当前的 rmid 调用(对指定端口)
-C 向每个子进程传递参数(激活组)
-J 向 java 解释程序传递参数

你可能感兴趣的:(jvm,应用服务器,虚拟机,配置管理,jni)