随笔-314  评论-209  文章-0  trackbacks-0
JDK工具 java命令详解
一、查看用法
 
C:\>java -help
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 <class search path of directories and zip/jar files>
    -classpath <class search path of directories and zip/jar files>
                  A ; separated list of directories, JAR archives,
                  and ZIP archives to search for class files.
    -D<name>=<value>
                  set a system property
    -verbose[:class|gc|jni]
                  enable verbose output
    -version      print product version and exit
    -version:<value>
                  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[:<packagename>...|:<classname>]
    -enableassertions[:<packagename>...|:<classname>]
                  enable assertions
    -da[:<packagename>...|:<classname>]
    -disableassertions[:<packagename>...|:<classname>]
                  disable assertions
    -esa | -enablesystemassertions
                  enable system assertions
    -dsa | -disablesystemassertions
                  disable system assertions
    -agentlib:<libname>[=<options>]
                  load native agent library <libname>, e.g. -agentlib:hprof
                    see also, -agentlib:jdwp=help and -agentlib:hprof=help
    -agentpath:<pathname>[=<options>]
                  load native agent library by full pathname
    -javaagent:<jarpath>[=<options>]
                  load Java programming language agent, see java.lang.instrument
 
这个命令帮助是英文的,不知道JDK咋搞的,也不妨碍使用。
 
另外,这个命令的非标准选项也是很重要的,常常在JVM优化配置方面很关键,可以参看本人的JVM参数配置文章。
C:\myproject>java -X
    -Xmixed           mixed mode execution (default)
    -Xint             interpreted mode execution only
    -Xbootclasspath:<directories and zip/jar files separated by ;>
                      set search path for bootstrap classes and resources
    -Xbootclasspath/a:<directories and zip/jar files separated by ;>
                      append to end of bootstrap class path
    -Xbootclasspath/p:<directories and zip/jar files separated by ;>
                      prepend in front of bootstrap class path
    -Xnoclassgc       disable class garbage collection
    -Xincgc           enable incremental garbage collection
    -Xloggc:<file>    log GC status to a file with time stamps
    -Xbatch           disable background compilation
    -Xms<size>        set initial Java heap size
    -Xmx<size>        set maximum Java heap size
    -Xss<size>        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.
 
 
二、实践
 
老规矩,主要看看里面的参数(也叫开关)的使用。环境接着上篇javac的环境。
 
 
1、无参数情况
 
2、-cp
运行Java要使用类的全名来运行。如果遇到文件夹,则需要-cp设置到顶级包下面,例如
 
3、-D
设置一个系统属性,在运行时候,可以通过System.getProperties()来获取到。例如写一段代码:
package com.lavasoft;

import java.util.Properties;

/**
* 列举系统的属性
* User: leizhimin
* Date: 2008-11-12 21:25:08
*/

public class TestProperty {
        public static void main(String[] args) {
                //获取系统属性
                Properties prop = System.getProperties();
                //输出所有到一个流上,
                prop.list(System.out);
        }
}
 
 
如果在运行的时候加上一个参数-DmyProp=999999999,注意,中间不要添加任何空格。这样就相当于设置了一个系统属性myProp,其值为999999999。
 
一旦通过-DmyProp=999999999设置了这个系统属性,在程序中就可以获取到这个属性。
 
3、程序入参
是在运行的时候,给main方法传递参数。为了测试先写一个测试类。
package com.lavasoft;

/**
* 测试main方法的入参
* User: leizhimin
* Date: 2008-11-12 21:46:21
*/

public class TestMainVar {
        public static void main(String[] args) {
                System.out.println("入参列表如下:");
                for(String arg:args){
                        System.out.println(arg);
                }
        }
}
 
 
4、其他的选项
有关选择 客户端/服务端VM、版本、运行在哪个版本下、是否使用断言等一些不常用的选项。还可以查看
 
 
5、-verbose[:class|gc|jni]
查看虚拟机内部动作。
 
 
 
posted on 2009-12-04 17:15 xzc 阅读(17965) 评论(4)  编辑  收藏 所属分类: Java

评论:
# re: java命令详解 2009-12-04 17:24 | xzc
/bea/bea/jdk150_10/bin/java -server -Xms1024m -Xmx1024m -XX:MaxPermSize=256m -DIBSS_HOME=/bea/odsapp

-Xms1024m 初始化内存
-Xmx1024m 最大内存
-DIBSS_HOME=/bea/odsapp
IBSS_HOME属性,通System.getProperties()来可获得.
  回复  更多评论
  
# re: java命令详解 2009-12-04 17:24 | xzc
1.4.1 JVM堆大小的调整

Sun HotSpot 1.4.1使用分代收集器,它把堆分为三个主要的域:新域、旧域以及永久域。JVM生成的所有新对象放在新域中。一旦对象经历了一定数量的垃圾收集循环后,便获得使用期并进入旧域。

在永久域中JVM则存储class和method对象。就配置而言,永久域是一个独立域并且不认为是堆的一部分。下面介绍如何控制这些域的大小。可使用-Xms和-Xmx 控制整个堆的原始大小或最大值。

下面的命令是把初始大小设置为128M:



Java –Xms128m



–Xmx256m为控制新域的大小,可使用-XX:NewRatio设置新域在堆中所占的比例。下面的命令把整个堆设置成128m,新域比率设置成3,即新域与旧域比例为1:3,新域为堆的1/4或32M:



Java –Xms128m –Xmx128m



–XX:NewRatio =3可使用-XX:NewSize和-XX:MaxNewsize设置新域的初始值和最大值。

下面的命令把新域的初始值和最大值设置成64m:



Java –Xms256m –Xmx256m –Xmn64m



永久域默认大小为4m。运行程序时,JVM会调整永久域的大小以满足需要。每次调整时,JVM会对堆进行一次完全的垃圾收集。

使用-XX:MaxPerSize标志来增加永久域搭大小。在WebLogic Server应用程序加载较多类时,经常需要增加永久域的最大值。当JVM加载类时,永久域中的对象急剧增加,从而使JVM不断调整永久域大小。为了避免调整,可使用-XX:PerSize标志设置初始值。下面把永久域初始值设置成32m,最大值设置成64m。



Java -Xms512m -Xmx512m -Xmn128m

-XX:PermSize=32m

-XX:MaxPermSize=64m



默认状态下,HotSpot在新域中使用复制收集器。该域一般分为三个部分。第一部分为Eden,用于生成新的对象。另两部分称为救助空间,当Eden充满时,收集器停止应用程序,把所有可到达对象复制到当前的from救助空间,一旦当前的from救助空间充满,收集器则把可到达对象复制到当前的to救助空间。

From和to救助空间互换角色。维持活动的对象将在救助空间不断复制,直到它们获得使用期并转入旧域。使用-XX:SurvivorRatio可控制新域子空间的大小。

同NewRation一样,SurvivorRation规定某救助域与Eden空间的比值。比如,以下命令把新域设置成64m,Eden占32m,每个救助域各占16m:



Java -Xms256m -Xmx256m -Xmn64m

-XX:SurvivorRation =2



如前所述,默认状态下HotSpot对新域使用复制收集器,对旧域使用标记-清除-压缩收集器。在新域中使用复制收集器有很多意义,因为应用程序生成的大部分对象是短寿命的。理想状态下,所有过渡对象在移出Eden空间时将被收集。

如果能够这样的话,并且移出Eden空间的对象是长寿命的,那么理论上可以立即把它们移进旧域,避免在救助空间反复复制。但是,应用程序不能适合这种理想状态,因为它们有一小部分中长寿命的对象。

最好是保持这些中长寿命的对象并放在新域中,因为复制小部分的对象总比压缩旧域廉价。为控制新域中对象的复制,可用-XX:TargetSurvivorRatio控制救助空间的比例(该值是设置救助空间的使用比例。

如救助空间位1M,该值50表示可用500K)。该值是一个百分比,默认值是50。当较大的堆栈使用较低的sruvivorratio时,应增加该值到80至90,以更好利用救助空间。用-XX:maxtenuring threshold可控制上限。

为放置所有的复制全部发生以及希望对象从eden扩展到旧域,可以把MaxTenuring Threshold设置成0。设置完成后,实际上就不再使用救助空间了,因此应把SurvivorRatio设成最大值以最大化Eden空间,设置如下:



Java … -XX:MaxTenuringThreshold=0

–XX:SurvivorRatio=50000 …

  回复  更多评论
  
# re: java命令详解 2009-12-04 17:25 | xzc
众所周知,java的JVM有一套自己的垃圾回收机制。因此在许多情况下并不需要java程序开发人员操太多的心。然而也许也因为这样,往往会造成java程序员的过分依赖而致使开发出来的程序得不到很好的优化,或者说性能尚能提高。
问题的关键在于,不论JVM的垃圾回收机制做得多好,计算机的硬件资源是有限的。内存更是一项紧张资源。因此虽然JVM为我们完成了大部分的垃圾回收。但适当地注意编码过程中的内存管理还是很必要的。这样能让JVM回收得更顺利更高效。最大限度地提高程序的效率。

mark-1:避免在循环体内创建对象。

……

Object obj = null;//方式一

for(int i =0; i 91k(1984k),0.0027537 secs]

……

可以看到总共有1984kb的内存被回收,耗时0.0027537秒。

JVM内存相关的参数

-XX:NewSize(Set the Newgeneralnation heap size)

-XX:MaxNewSize(Set the Maximum Newgeneralnation heap size)

-XX:SurvivorRatio(Set New heap size ratios)

-Xms(Set minimum heap size)

-Xmx(Set maximum heap size)

-Xnoclassgc(取消垃圾回收)

-Xss(设置栈内存的大小)

例:java -XX:NewSize = 128m -XX:MaxNewSize = 128m - XX:SurvivorRatio = 8 -Xms 512m -Xmx 512m MyApplication

mark-8:不同编译方法的类大小

(1)默认编译方式:javac K.java

长度=代码+源文件信息+代码行序号表

(2)调试编译方式:javac -g K.java

长度=代码+源文件信息+代码行序号表+本地变量表

(3)代码编译方式:javax -g:none K.java

长度=代码

mark-9:经验之谈

1.尽早释放无用对象的引用(XX = null; )

2.尽量少使用finalize函数。

3.注意集合数据类型,如数组,树,图,链表等数据结构,这些数据结构对GC来说回收更复杂。

4.避免在类的默认构造器中创建大量的,初始化大量的对象。

5.避免强制系统做垃圾内存回收。

6.避免显式申请数组空间,不得不显式申请时,尽量准确估计其合理值。

  回复  更多评论
  
# re: java命令详解 2015-10-30 08:15 | 黄浩
大家好才是真的好  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航: