`
yanguz123
  • 浏览: 555967 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ JDK工具、命令

 
阅读更多

JDK命令

 

 

一) 引言: 
   当我们安装完JDK时,除了必须的编译运行以外,它就已经自带了很多辅助工具。正所谓“工欲善其事,必先利其器。”如果能用好这些工具,它们将大大方便你的开发。它们的实用和方便有时甚至会使你惊讶的发现:JDK的这些自带的辅助工具将会是IDE的一个很好的补充。了解了这些命令你也就知道了IDE理论上能做些什么不能做些什么(不管你用的是什么IDE),因为归根结底IDE调用的就是这些命令啦。 
   BTW: 在实践这些命令前请先确认你成功安装了JDK。如果只是安装了JRE,那么很可惜,除了编译运行外很多辅助工具命令你可找不到喽~~。 

二)不可或缺:javac, java 
   不管你安装的是jre还是jdk。javac, java这两个命令都会包括其中。原因么也很简单,这两个命令分别是用来编译和运行java程序的啦。可以说是java基础的基础,相信大家都已很熟悉了。在此多啰嗦一下,简介如下: 
   编译:javac  
   1)最简单的例子  javac d:\Java1.6\HelloWorld.java 
      这样会在d:\Java1.6目录下编译生成一个HelloWorld.class文件 

   2) 进一步: javac -g d:\Java1.6\HelloWorld.java 
      先看看帮助文件怎么说的: 
       -g                         生成所有调试信息 
       -g:none                    不生成任何调试信息 
       -g:{lines,vars,source}     只生成某些调试信息(源码行号,变量,源文件信息) 
      在class文件中嵌入调试信息。比较一下两者生成的class文件的大小就知道区别了。IDE工具debug时十分需要这些信息噢,对于程序的正常运行没什么影响。 

    3)再加一点:  javac -verbose d:\Java1.6\HelloWorld.java 
       -verbose    输出有关编译器正在执行的操作的消息 
       -version    版本信息 
       -d <目录>   指定存放生成的类文件的根目录 
       这个不多说,试打一下马上知道。 

    4)非常关键参数: -classpath <目录>   -sourcepath <目录> 
       先从字面上理解下这两个字段的意思:classpath,当然是指定可供使用的class文件的路径集喽。 那sourcepath,指的就是可供使用的源文件的路径集喽。 
       先说 -classpath, 它有缩写形式 -cp ,默认值就是安装jdk时在系统变量里设置的classpath的值,如果使用-classpath, 它将覆盖默认值。但这里注意哦,编译是用到的classpath可不止系统变量里设置的这么点噢。那完整的classpath到底长什么样呢? -verbose 看看吧 ^.^ 。 噢,还有一点,当使用-classpath而没有使用-sourcepath时,设置的classpath值还将同时作为sourcepath的值。 
       好了,说完classpath说sourcepath。 它用到的情况相对比较少。举个例子说明吧: 
假设源文件结构如下: 
      src-| 
             |-foo-| 
                       |-Testfoo.java 
             |-baz-| 
                       |-Testbaz.java 
并且package的跟目录是src/(即:在Testbaz.java中像这样 import foo.Testfoo;) 
那我现在非要在/目录下一次编译这两个有依赖的文件怎么办呢?这时-soucrepath该出场了: javac -sourcepath src src/baz/*.java 
再次注意,-sourcepath指定的是根目录噢 

     5)-target <版本>     生成特定 VM 版本的类文件(向下兼容) 

   运行:java  
   先列举一下和javac共性的参数: -version -verbose -classpath -cp,原理一样,不多说了。 
   1)最简单的例子: java  com.thaIm.HelloWorld 
   2)如果你机子上有多个jdk版本,那么可以指定一下想使用的版本: java -version:1.6  com.thaIm.HelloWorld 
   3)运行jar: java -jar HelloWord.jar 

三) 实用的 jar javadoc jdb serialver javah javap htmlConverter native2ascii 
1)jar 打架包,查看架包 
   详细参数可以查看help文档啦,这里就举几个例子: 
   打包: jar cvf hello.jar com 
   更新: jar uvf hello.jar com 
   查看: jar tf hello.jar 

2)javadoc 生成文档 
   javadoc注释以"/**"开始,以"*/"结束,里面可以包含普通文本、HTML标记和javadoc标记。javadoc只处理源文件中在类/接口定义、方法、域、构造器之前的注释,忽略位于其他地方的注释。 
/** 
*Demo--<b>Helloworld</b> 
*@author thaIm 
*@version 1.0 2012/01/01 
*/ 
public class HelloWorld 

/** 
*在main( )方法中使用的显示用字符串 
*@see #main(java.lang.String[]) 
*/ 
static String SDisplay; 
/** 
*显示HelloWorld 
*@param args 从命令行中带入的字符串 
*@return 无 
*/ 
public static void main(String args[]) 

SDisplay = "Hello World " ; 
System.out.println( SDisplay ); 



输入命令:javadoc -private -d doc -author -version com\thaIm\HelloWorld.java 
    在doc目录下生成HelloWorld类的说明文档,内容包括私有成员在内的所有类和成员,作者信息,版本信息。运行一下,看看结果就知道文档和代码注释怎么对应了。 

3)jdb 用来debug 
     还是用例子说明吧: 
         jdb com.thaIm.HelloWorld 
         运行: run 
         退出: exit 
     详细命令列表如下: 
     connectors                -- 列出此 VM 中可用的连接器和传输器  
     run [类 [参数]]        -- 开始执行应用程序的主类  
     threads [线程组]     -- 列出线程  
     thread <线程 ID>        -- 设置默认线程  
     suspend [线程 ID]    -- 暂停线程(默认值为 all)  
     resume [线程 ID]     -- 恢复线程(默认值为 all)  
     where [<线程 ID> | all] -- 转储线程的堆栈  
     wherei [<线程 ID> | all] -- 转储线程的堆栈以及 pc 信息  
     up [n 帧]             -- 向上移动线程的堆栈  
     down [n 帧]           -- 向下移动线程的堆栈  
     kill <线程 ID> <表达式>   -- 中止具有给定的异常对象的线程  
     interrupt <线程 ID>     -- 中断线程  
  
     print <表达式>              -- 输出表达式的值  
     dump <表达式>               -- 输出所有对象信息  
     eval <表达式>               -- 计算表达式的值(与 print 作用相同)  
     set <lvalue> = <表达式>     -- 为字段/变量/数组元素指定新值  
     locals                    -- 输出当前堆栈帧中的所有本地变量  
  
     classes                   -- 列出当前已知的类  
     class <类 ID>          -- 显示已命名类的详细信息  
     methods <类 ID>        -- 列出类的方法  
     fields <类 ID>         -- 列出类的字段   
     threadgroups              -- 列出线程组  
     threadgroup <名称>        -- 设置当前线程组  
     stop in <类 ID>.<方法>[(参数类型,...)]     -- 在方法中设置断点  
     stop at <类 ID>:<行> -- 在行中设置断点  
     clear <类 ID>.<方法>[(参数类型,...)]       -- 清除方法中的断点  
     clear <类 ID>:<行>   -- 清除行中的断点  
     clear                -- 列出断点  
     catch [uncaught|caught|all] <类 ID>|<类模式>   -- 出现指定的异常时中断  
     ignore [uncaught|caught|all] <类 ID>|<类模式>  -- 对于指定的异常,取消 'catch'  
     watch [access|all] <类 ID>.<字段名>     -- 监视对字段的访问/修改  
     unwatch [access|all] <类 ID>.<字段名>   -- 停止监视对字段的访问/修改  
     trace [go] methods [thread]    -- 跟踪方法的进入和退出。  
                                    -- 除非指定 'go',否则所有线程都将暂停  
     trace [go] method exit | exits [thread]  -- 跟踪当前方法的退出或所有方法的退出  
                                              -- 除非指定 'go',否则所有线程都将暂停  
     untrace [方法]         -- 停止跟踪方法的进入和/或退出  
     step                      -- 执行当前行  
     step up                   -- 执行到当前方法返回其调用方  
     stepi                     -- 执行当前指令  
     next                      -- 跳过一行(跨过调用)  
     cont                      -- 从断点处继续执行  
     list [line number|method] -- 输出源代码  
     use(或 sourcepath)[源文件路径]   -- 显示或更改源路径  
     exclude [<类模式>, ...|“无”]     -- 不报告指定类的步骤或方法事件  
     classpath                 -- 从目标 VM 输出类路径信息  
     monitor <命令>         -- 每次程序停止时执行命令  
     monitor                   -- 列出监视器  
     unmonitor <监视器号>      -- 删除某个监视器  
     read <文件名>           -- 读取并执行某个命令文件  
     lock <表达式>               -- 输出对象的锁信息  
     threadlocks [线程 ID]   -- 输出线程的锁信息  
     pop                       -- 弹出整个堆栈,且包含当前帧  
     reenter                   -- 与 pop 作用相同,但重新进入当前帧  
     redefine <类 ID> <类文件名>    -- 重新定义类代码  
     disablegc <表达式>          -- 禁止对象的垃圾回收  
     enablegc <表达式>           -- 允许对象的垃圾回收  
     !!                        -- 重复执行最后一个命令  
     <n> <命令>             -- 将命令重复执行 n 次  
     # <命令>               -- 放弃(不执行)  
     help(或 ?)               -- 列出命令  
     version                   -- 输出版本信息  
     exit(或 quit)            -- 退出调试器  
  
<类 ID>: 带有软件包限定符的完整类名  
<类模式>: 带有前导或后缀通配符 (*) 的类名  
<线程 ID>: 'threads' 命令中所报告的线程号  
<表达式>: Java(TM) 编程语言表达式。 

4)serialver 返回 serialVersionUID 
     命令: serialver -show 
     至于什么是 serialVersionUID,看看序列化的概念吧~~ 

5)javah 产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件 (没怎么用过,以后补充了...) 

6)javap  Java反汇编器,显示编译类文件中的可访问功能和数据,同时显示字节代码含义  
    看个例子啦:javap com.thaIm.HelloWorld ,让后就把HelloWorld.class反编译的结果返回给你了。很好用吧~~。 

7)htmlConverter 命令转换工具 
    applet的html页面的转换工具。用起来超方便输入htmlConverter,回车。图形化界面一看便知啦~~ 

8)native2ascii 将含有不是Unicode或Latinl字符的的文件转换为Unicode编码字符的文件。  
    格式超简单啦:  native2ascii [options] [inputfile [outputfile]] 
    options的参数也只有一个: -reverse 执行相反的操作:将含 Latin-1 和/或 Unicode 编码字符的文件转换成含本地编码字符的文件。

 

 

 

 

 

 

 

 

 

 

jar   

功能说明 :  
  Java归档工具

语法 :  
  jar [ 命令选项 ] [manifest] destination input-file [input-files]

补充说明 :  
  jar工具是个java应用程序,可将多个文件合并为单个JAR归档文件。jar是个多用途的存档及压缩工具,它基于ZIP和ZLIB压缩格式。然而,设计jar的主要目的是便于将java applet或应用程序打包成单个归档文件。将applet或应用程序的组件(.class 文件、图像和声音)合并成单个归档文件时,可以用java代理(如浏览器)在一次HTTP事务处理过程中对它们进行下载,而不是对每个组件都要求一个新连接。这大大缩短了下载时间。jar还能压缩文件,从而进一步提高了下载速度。此外,它允许applet的作者对文件中的各个项进行签名,因而可认证其来源。jar工具的语法基本上与tar命令的语法相同。

命令选项   
  -c 在标准输出上创建新归档或空归档。

  -t 在标准输出上列出内容表。

  -x[file] 从标准输入提取所有文件,或只提取指定的文件。如果省略了file,则提取所有文件;否则只提取指定文件。

  -f 第二个参数指定要处理的jar文件。在-c(创建)情形中,第二个参数指的是要创建的jar文件的名称(不是在标准输出上)。在-t(表(或-x(抽取)这两种情形中,第二个参数指定要列出或抽取的jar文件。

  -v 在标准错误输出设备上生成长格式的输出结果。

  -m 包括指定的现有清单文件中的清单信息。用法举例:“jar cmf myManifestFile myJarFile *.class”

  -0 只储存,不进行 ZIP 压缩。

  -M 不创建项目的清单文件。

  -u 通过添加文件或更改清单来更新现有的 JAR 文件。例如:“jar -uf foo.jar foo.class”将文件 foo.class 添加到现有的JAR文件foo.jar中,而“jar umf manifest foo.jar”则用manifest中的信息更新foo.jar的清单。

  -C 在执行 jar 命令期间更改目录。例如:“jar -uf foo.jar -C classes *”将classes目录内的所有文件加到foo.jar中,但不添加类目录本身。

程序示例   
  1:将当前目录下所有CLASS文件打包成新的JAR文件:  
  jar cf file.jar *.class

  2:显示一个JAR文件中的文件列表  
  jar tf file.jar

  3:将当前目录下的所有文件增加到一个已经存在的JAR文件中  
  jar cvf file.jar * 

javadoc   

功能说明   
  Java API文档生成器从Java源文件生成API文档HTML页。

语法 :  
  javadoc [ 命令选项 ] [ 包名 ] [ 源文件名 ] [ @files ]  
  其中[ 包名 ]为用空格分隔的一系列包的名字,包名不允许使用通配符,如(*)。[ 源文件名 ]为用空格分隔的一系列的源文件名,源文件名可包括路径和通配符,如(*)。[ @files ]是以任何次序包含包名和源文件的一个或多个文件。

补充说明   
  Javadoc解析Java源文件中的声明和文档注释,并产生相应的HTML页缺省),描述公有类、保护类、内部类、接口、构造函数、方法和域。

  在实现时,Javadoc要求且依赖于java编译器完成其工作。Javadoc调用部分javac编译声明部分,忽略成员实现。它建立类的内容丰富的内部表示,包括类层次和“使用”关系,然后从中生成HTML。Javadoc还从源代码的文档注释中获得用户提供的文档。

  当Javadoc建立其内部文档结构时,它将加载所有引用的类。由于这一点,Javadoc必须能查找到所有引用的类,包括引导类、扩展类和用户类。

 

命令选项   
  -overview i>path/filename 指定javadoc应该从path/filename所指定的“源”文件中获取概述文档,并将它放到概述页中(overview-summary.html)。其中path/filename 是相对于-sourcepath的相对路径名。

  -public 只显示公有类及成员。

  -protected 只显示受保护的和公有的类及成员。这是缺省状态。

  -package 只显示包、受保护的和公有的类及成员。

  -private 显示所有类和成员。

  -help 显示联机帮助,它将列出这些javadoc和doclet命令行选项。

  -doclet class 指定启动用于生成文档的docle 的类文件。该doclet定义了输出的内容和格式。如果未使用-doclet选项,则javadoc使用标准doclet生成缺省HTML格式。该类必须包含start(Root)法。该启动类的路径由 -docletpath选项定义。

  -docletpath classpathlist 指定doclet类文件的路径,该类文件用-doclet选项指定。如果doclet已位于搜索路径中,则没有必要使用该选项。

  -1.1 生成具有用Javadoc 1.1生成的文档的外观和功能的文档。也就是说,页的背景为灰色,用图像做页眉,使用bullet列表而不是表格,具有单层目的目录结构,不包含继承 API,不使?*** TML框架,并且不支持内部类。该选项还自动将索引分割成每个字母一个文件。如果想要这种外观,则该选项比javadoc 1.1优越之处等于修正了一些错误。

  -sourcepath sourcepathlist  
  当将包名传递到javadoc命令中时,指定定位源文件(.java)的搜索路径。注意只有当用 javadoc命令指定包名时才能使用sourcepath选项 -- 它将不会查找传递到javadoc命令中的.java文件。如果省略-sourcepath,则javadoc使用类路径查找源文件。

  -classpath classpathlist 指定javadoc将在其中查找引用类的路径 -- 引用类是指带文档的类加上它们引用的任何类。Javadoc将搜索指定路径的所有子目录。classpathlist可以包括多个路径,彼此用逗号分隔。

  -bootclasspath classpathlist 指定自举类所在路径。它们名义上是Java平台类。这个bootclasspath是Javadoc将用来查找源文件和类文件的搜索路径的一部分。在 classpathlist中用冒号(:)分隔目录。

  -extdirs dirlist 指定扩展类所在的目录。它们是任何使用Java扩展机制的类。这个 extdirs是Javadoc将用来查找源文件和在文件的搜索路径的一部分。在dirlist中用冒号(:)分隔目录。

  -verbose 在javadoc运行时提供更详细的信息。不使用verbose选项时,将显示加载源文件、生成文档(每个源文件一条信息)和排序的信息。verbose选项导致打印额外的信息,指定解析每个java源文件的毫秒数。

  -locale language_country_variant 指定javadoc在生成文档时使用的环境。

  -encoding name 指定源文件编码名,例如EUCJIS/SJIS。如果未指定该选项,则使用平台缺省转换器。

  -J[flag] 将flag直接传递给运行javadoc的运行时系统java。注意在J和flag之间不能有空格。  
标准 Doclet 提供的选项

  -d directory 指定javadoc保存生成的HTML件的目的目录。省略该选项将导致把文件保存到当前目录中。其中directory可以是绝对路径或相对当前工作目录的相对路径。

  -use 对每个带文档类和包包括一个“用法”页。该页描述使用给定类或包的任何 API 的包、类、方法、构造函数和域。对于给定类 C,使用类 C 的任何东西将包括 C 的子类、声明为 C 的域、返回 C 的方法以及具有 C 类型参数的方法和构造函数。

  -version 在生成文档中包括 @version 文本。缺省地将省略该文本。

  -author 在生成文档中包括 @author 文本。

  -splitindex 将索引文件按字母分割成多个文件,每个字母一个文件,再加上一个包含所有以非字母字符开头的索引项的文件。

  -windowtitle[title] 指定放入 HTML

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

JDK工具

 

 

一、JDK命令行工具
  1.jps:虚拟机进程状况工具
  列出正在运行的虚拟机进程,显示虚拟机执行祝列的名称,已经这些进程的本地虚拟机的唯一ID。此命令虽然功能单一,但它是使用频率最高的JDK命令工具。
  Jps 命令格式:
  jps  [options] [hostid]
  2. jstat:虚拟机统计信息监视工具
  jstat(JVM Statistics Monitoring Tool)是用于监视虚拟机各种运行状态信息的命令行工具。它可以显示本地或远程虚拟机进程中的类装载、内存、垃圾收集、JIT编译等运行数据。在没有GUI图形界面,只提供了纯文本控制台环境服务器上,它将是运行期定位虚拟机性能问题的首选工具。
  jstat命令格式:
  jstat [option vmid [ interval [s|ms] [count] ] ]
  参数interval和count代表查询的间隔和次数,如果省略这两个参数,说明只查询一次。
  例如:jstat –gc 3232 500 20
  命令含义为:每500ms查询一次进行3232垃圾收集器的状况,一共查询20次。
  选项option代表用户希望查询虚拟机信息,主要分为3类;类装载、垃圾收集和运行期编译状况。
  3. jinfo:Java配置信息工具
  jinfo(Configuration Info for Java)实时查看和调整虚拟机的各项参数。想知道未被显示指定的参数的系统默认值,可以使用jinfo的-flag选项进行查询,jinfo还可以使用-sysprops选项把虚拟机进行的System.getProperties()的内容打印出来。
  jinfo命令格式:
  jinfo [option] pid
  4.jmap:Java内存映像工具
  jmap(Memory Map for Java)于生成堆转储快照,查询finalize执行队列,Java堆和永久代的详细信息等。
  jmap命令格式:
  jmap [option] vmid
  5.jstack:Java堆栈跟踪工具
  jstack(Stack Trace for Java)用于生成虚拟机当前时刻的线程快照,定位线程出现长时间停顿的原因。
  jstack命令格式:
  jstack [option] vmid

  二、 JDK可视化工具
  1. Jconsole:java监视与管理控制台
  JConsole可以说是前面介绍的所有功能性JDK工具的一个可视化版本,几乎实现了JVM Manage API中提供的所有的功能。
  通过JDK/bin目录下的“jconsole.exe”启动JConsole。如图1,双击其中一个进程即可开始监控,也可以使用“远程进程”功能来连接远程服务器,对远程虚拟机进行监控。

  

图1


  图2


 1)图2“概述”页显示整个虚拟机主要运行数据的概览。
  2)内存监控
  “内存”页签相当于可视化的jstat命令,用于监视收集器管理的虚拟机内存(java堆和永久代)的变化趋势。
  3)线程监控
  “线程”页签的功能相当于可视化的jstack命令,遇到线程停顿的时候可以时候线程监控进行分析
  2.VisualVM:多合一故障处理工具
  VisualVM它除了运行监视、故障处理外,还提供了很多其他方面的功能。如性能分析(profiling),VisualVM的性能分析功能甚至比起JProfiler专业且收费工具都不会逊色多少,而且VisualVM还有一个很大的优点:不需要被监视的程序基于特殊的Agent运行,因此它对应用程序的实际性能影响很小,使得他可以直接应用在生产环境中。
  1)启动VisualVM
  通过JDK/bin目录下的“jvisualvm”启动VisualVM,可以根据需要给VisualVM装扩展插件,点击“工具”-->“插件”菜单。
  2)生成和浏览堆转储快照
  可以通过以下2种方式生成:
  在“应用程序”窗口中右键单机应用程序节点,然后选择“堆dump”;
  在“应用程序”窗口双击应用晨曦节点打开应用程序标签,然后再“监视”标签中单击“堆dump”。
  生成了dump文件之后,应用程序页签将在堆的应用程序下增加以[heapdump]开头的子节点,并在主页签中打开该转储快照,如图3。


  “摘要”面板可以看到应用程序dump时运行的参数、线程堆栈等信息。
  “类”面板以类为统计口径统计的类的实例数量和容量信息。
  “实例”面板需要通过“类”面板进去,在“类”中选择关系的类后点击,即可在实例中查看此类的实例信息。
  3)分析程序性能
  在Profiler页签中,提供了程序运行期间方法级的CPU执行时间分析及内存烦心,进行profiling肯定会对程序运行性能有比较大的影响,所以一般不在生产环境中使用这项功能。
  选择“cpu”或“内存”,VisualVM会记录这段时间中应用程序执行过的方法。Cpu分析会统计每个方法执行的次数、执行耗时。分词分析则会统计每个方法关联对象数及这些对象所占用的空间,如图4。
  

图4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

对于使用命令行远程监控jvm太麻烦?那可以试试sun提供的VisualVMjdk1.6自带了,可以到bin目录下找到它。

         什么也不说了,直接运行此exe,打开界面如下:

 



 

(图1

         (上图1左边的数可以看到,VisualVM分为3类,Local它会自动侦测到,并显示出来)

         双击Local下的任一节点,看到右边的变化(有点像JProfiler

 

 



 



 

(图2

         看看Visual GC的界面(Java Heap的使用,一目了然)

 



 

(图3

         再在左边的树形窗口,右键看看(看到了Thread Dump, Heap Dump

 



 

(图4

         Thread Dump很快,马上就可以看到结果

 



 

(图5

         Heap Dump要稍花费一些时间(可以看到当前heap里对象的数量及占用的比例,做OOM很好用)

 



 

(图6

                   双击每一行,可以看到具体的信息

 



 

(图7

 

 

我们再看一下图1,左边的窗口中,第二个节点—Remote,它可以用来操作远程机器。远程机器需要启动一个daemon:jstatd

1、远程机器启动jstatd

      1.1、        首先需要准备一个java.policy文件,保存到如/home/admin/jstatd.java.policy

grant codebase "file:${java.home}/../lib/tools.jar" {

   permission java.security.AllPermission;

};

      1.2、        启动jstatd

jstatd -J-Djava.security.policy=/home/admin/jstatd.java.policy -J-Djava.rmi.server.logCalls=true

      1.3、        同时需要执行一个命令看看(linux需要)

Hostname –i

如果显示是127.0.0.1,则需要修改/etc/hosts文件,去掉对本机名的配置,让本机名解析到它的IP地址,如10.20.131.214

2、连接远程机器

 



 

(8)

3、点击OK,看到会连接到远程机器,并显示出它下面的java进程。

 



 

(图9

      到 这个时候的操作,就和上面Local的描述操作一样了。

 

最后,要注意的地方:

最好使用jdk1.6以上版本,不然visualVM很多功能不能用。

你自己也可以写一个VisualVM插件(基于NetBeans的插件体系),完成特殊的任务。

 

 

JConsole使用

一、JConsole远程监控Tomcat服务器 

  为了解决内存溢出的问题,会用到一些监视内存的工具,jconsole这个工具是jdk5.0自带的工具,所以如果你的jdk是5.0那么就不用去安装。 这个工具可以查看系统的 堆,非堆,线程,等等的一些整体的情况,从而可以判断出系统的一个大概的性能情况。 
那么配置如下:如果你是用tomcat,在 catalina.bat来设置set JAVA_OPTS=%JAVA_OPTS%  -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.port=7080 -Dcom.sun.management.jmxremote 
特别注意:-Dcom.sun.management.jmxremote.port=7080,这个端点是jconsole专用的,不要和你的系统的端点冲突。再启动你的应用。 
ok,配置好了后,就直接进dos命令 ,后 输入 java 回车, 再接着 输入 jconsole,它会弹出一个界面,你直接点“远程连接”的选项卡,主机就填你要监控的ip地址名,端口与 你配的-Dcom.sun.management.jmxremote.port 的端口一致就可以了,再连接就可以了。如果连接成功就会进入监控你的系统。

二、JConsole远程监控JBoss服务器 

Java 5.0采用JMX方式提供了一系列监视和管理虚拟机的API,随SDK一起发布的JConsole则是采用这些API实现监控虚拟机的使用工具。 JConsole能够提供被监控虚拟机的内存、线程、类的加载以及MBean等信息,从而能够对服务器的运行情况进行实时监控。
1、环境
服务器:Redhat Linux ES 3.0 + JDK 1.5.06 + Jboss 4.0.2
                ip地址:192.168.1.5
客户机:Windows + JDK 1.5.06
2、配置
修改java虚拟机启动参数
             在%JBOSS_HOME%\bin\run.sh文件中将
            JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME "
            修改为:
           JAVA_OPTS="$JAVA_OPTS -Dprogram.name=$PROGNAME -Dcom.sun.management.jmxremote.port=9999 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false"
          注意:9999表示监控的端口号,确保指定的端口不被占用;可以采用netstat -an来查看已经占用的端口;配合lsof -i:portnum 来查看占用端口的具体应用程序;另外如果开启了防火墙服务,请确保端口能够透过防火墙访问;
启动JBoss服务器
             ./run.sh -b192.168.1.5,必须通过-b参数指定Jboss服务器绑定的地址; 
连接远程虚拟机
         启动%JAVA_HOME%\bin目录下的JConsole,在弹出对话框的“远程”属性页的“主机名或ip”中输入192.168.1.5,在“端口”中输入9999,选择“连接”,就能查看到远程Jboss服务器的运行情况了。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

本篇所有内容都是基于JDK5,如使用JDK6会有差别。

  在前些日子,我们做了一些性能监控的工作,有一些值得记录的地方:

  JDK自身提供了很多工具,基于命令行和GUI的都有,学会合理应用它们是很有用处的。

  首先是jmap,这是一个命令行程序,用来查看JVM中对象数量情况,直接输入jmap会显示用法,下面是两个常用的功能:

  Java代码

 

jmap -histo 'jvmPid' > memory.txt

 

  其中jvmPid为当前虚拟机进程的系统ID号,等待过后,memory.txt会按空间占用由大到小的顺序保存当前虚拟机运行中存在的对象类型,我们可以由此看出哪些类型对象占的空间和生成的数目较多,尤其是在自定义对象出现问题导致不能及时回收,这个功能是很有用的。

  Java代码

 

jmap -heap:format=b 'jvmPid'

 

  和上面的不同,上面是生成一个文本文件,而这里会生成一个二进制快照文件,可以用相应的分析软件来打开它来进行功能更全面的检测,如Eclipse Memory Analyzer。

  需要注意的是,上面的导出快照命令,在1G左右JVM内存的情况下,要大概等待1分钟左右的时间,且执行时会使JVM暂停执行,因此不要在正式运行系统的高峰期或关键时刻使用。

  接下来是jstat,这也是一个命令行程序,用来查看JVM的各个内存和GC的使用情况,用法和参数非常多,有两个我们用到的功能:

  Java代码

 

jstat -gcutil 'jvmPid'

 

  会显示此刻GC的情况,其中YGC和FGC代表小GC和大GC的次数,YGCT和FGCT则代表小GC和大GC运行的占用时间,正常情况下,大GC的次数应远远小于小GC,例如我当前的系统小GC已经有10w次,而大GC只有50次,这是程序设计运行良好的表现。

  Java代码

 

jstat -gccapacity 'jvmPid'

 

  会显示此刻GC各内存池占用量,和上条命令结果结构类似,同时也有一个问题,显示的数据不是很直观,如果通过GUI观看就好多了。

  JVM自带了GUI监控状态的功能,在JDK5中,我们需要做一些配置手动开启它,首先我们要在JVM启动项增加一些属性,假设我们的系统是一个运行在tomcat容器下的项目,我们就可以修改JAVA_OPTS变量来开启监控服务

  Java代码

 

JAVA_OPTS="$JAVA_OPTS -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false"

 

  这将开启远程基于jmx监控的服务功能,这样的配置方式,同时也开启了默认的身份验证机制,我们还需要在另外的地方设置权限,用户名和密码才能登录,我们先把这些服务端剩下的工作搁置一旁,先说说客户端的部分。

  我们需要GUI客户端访问工具来远程查看该虚拟机的信息,JDK5自带了一个名为jconsole的客户端,可以在JDK目录的bin文件夹下找到它并可以直接双击运行,点击“远程”标签,之后输入远程IP,端口,用户名和密码,如服务端配置正常,即可成功访问。

  回到服务端上来,我们还需要配置JVM的远程用户名和密码,这个要修改$JAVA_HOME/jre/lib/management/jmxremote.access和jmxremote.password.template文件。

  首先直接修改jmxremote.access文件,取消最后两个用户名的注释,改为

  Java代码

 

  1. monitorRole   readonly     
  2. controlRole   readwrite \     
  3.               create javax.management.monitor.*,javax.management.timer.* \     
  4.               unregister

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

在给客户的应用程序维护的过程中,我注意到在高负载下的一些性能问题。理论上,增加对应用程序的负载会使性能等比率的下降。然而,我认为性能下降的比率远远高于负载的增加。我也发现,性能可以通过改变应用程序的逻辑来提升,甚至达到极限。为了更详细的了解这一点,我们需要做一些性能分析,自然也要用到一些分析工具。
 
Spring的动作和效率确实非常高,在上周的Google IO大会上刚刚宣布完将推出新版本的Spring Insight,并在其中无缝集成Google Speed Tracer。这个星期就发布了。强烈建议开发者学习和使用这个开发利器来提升你的应用程序质量和性能。
 
在Java的广泛应用中,虽然优点一直在促进J2EE的空前发展,但也经常出现一些麻烦,那就是人们经常对J2EE应用的性能感到失望。因此,我们需要一些工具和调查策略来帮助J2EE开发团队解决这些性能问题。这就是Quest JProbe Profiler和Jprobe Memory Debugger所要解决的问题。
 
YourKit Java Profiler是业界领先的Java剖析工具。CPU和内存的剖析历来是很困难的,YourKit创造出了革命性的剖析工具,应用在研发和生产阶段,为专业的Java开发者带来了无比的好处。本文主要对性能分析软件yourkit的入门介绍。
 
JProfiler是一款Java的性能监控工具。可以查看当前应用的对象、对象引用、内存、CPU使用情况、线程、线程运行情况(阻塞、等待等),同时可以查找应用内存使用得热点,这里提供有几篇文章供参考:获取、介绍,简单入门,使用JProfiler解决实际问题。这几篇文章基本介绍了常见东西了,下面说点心得。
 
在Java多线程程序运行时,多数情况下我们不知道到底发生了什么,只有出了错误的日志的时候,我们才知道原来代码中有死锁。撇开代码检查工具,我们先讨论一下利用VisualVM监控,分析我们的多线程的运行情况。
 
 
 

在JDK的安装目下面的bin目录下常用的工具:
1、编译工具
   javac
2、运行工具
   java
3、压缩工具
   jar
4、文档生成工具
   javadoc
5、字符编码转换工具
   native2ascii

一、编译命令:
1、编译一个文件
   在目录下面,输入:javac a.java
   编译多个文件(中间使用空格):
   (1) javac a.java b.java c.java  
   (2)javac *.java
   (3)先建立文件sourcefiles.txt(名字随意起),在里面添加要编译的文件的名字,一个一行,然后运行:javac @sourcefiles.txt
2、将产生的编译文件放到一个单独的文件夹中
   javac -d cls a.java   (将产生的编译文件放到同目录的cls文件夹中,这个目录可以修改,使用的是相对于a.java的目录路径)
3、编译一个依赖其他类的类
   javac -classpath  cl -d cls a.java  (使用cl目录下的类,并将编译文件放到cls文件下面)

二、运行命令
    java my.hello   (my包下面的a编译文件)
    java -classpath cl  my.java
    注:(当写package时,不能再class文件所在的目录下面运行文件,只能在“上一级”的目录中写)
三、压缩命令 (把文件或文件夹压缩、解压)
    jar -cvf 压缩
    jar -xvf 解压
    例: jar -cvf hello.jar a.class b.class c.class(压缩)
        jar -cvf lcz.jar lcz (压缩本目录下面的lcz文件夹命名为lcz.jar)
        jar -xvf cl\hello.jar  (解压cl目录下的hello.jar)
        加压和解压都默认在当前目录下面。
四、文档生成工具 编译命令
    (将源文件中的doc帮助文件生成HTML格式的文档)
    javadoc hello.java
    javadoc -d java\doc -version -author lcz\src\lcz.java
五、字符编码转换工具
    native2ascii  -encoding 编码  原文件名字  改变后的名字

 

JDK5.0内置工具有哪些呢?其中加入了jstack, jconsole, jinfo, jmap, jdb, jstat, jps, 下面对这些工具做简单介绍:

jstack:如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。另外,jstack工具还可以附属到正在运行的java程序中,看到当时运行的java程序的java stack和native stack的信息, 如果现在运行的java程序呈现hung的状态,jstack是非常有用的。目前只有在Solaris和Linux的JDK版本里面才有。

jconsole:jconsole是基于Java Management Extensions (JMX)的实时图形化监测工具,这个工具利用了内建到JVM里面的JMX指令来提供实时的性能和资源的监控,包括了Java程序的内存使用,Heap size, 线程的状态,类的分配状态和空间使用等等。

jinfo:jinfo可以从core文件里面知道崩溃的Java应用程序的配置信息,目前只有在Solaris和Linux的JDK版本里面才有。

jmap:jmap 可以从core文件或进程中获得内存的具体匹配情况,包括Heap size, Perm size等等,目前只有在Solaris和Linux的JDK版本里面才有。

jdb:jdb 用来对core文件和正在运行的Java进程进行实时地调试,里面包含了丰富的命令帮助您进行调试,它的功能和Sun studio里面所带的dbx非常相似,但 jdb是专门用来针对Java应用程序的。

jstat:jstat利用了JVM内建的指令对Java应用程序的资源和性能进行实时的命令行的监控,包括了对Heap size和垃圾回收状况的监控等等。

jps:jps是用来查看JVM里面所有进程的具体状态, 包括进程ID,进程启动的路径等等。

另外,还有些其他附带的工具在这里没有列出,比如Heap Analysis Tool, kill方法等等,这些在JDK5.0之前就有,同样也是非常有用的性能调优工具,大家可以参照相应的文档资料来学习。

JDK5.0内置工具就介绍到这里,其实很多都是之前版本的JDK已经涵盖的,希望对你理解JDK5.0内置工具有所帮助。

 

 

 

1、JDK简介 
    JDK 是整个Java的核心,包括了Java运行环境(Java Runtime Envirnment),一堆Java工具和Java基础的类库(rt.jar)。
    常用的JDK有Sun的JDK,IBM的JDK,原BEA的BEA公司的 Jrocket
2、JDK常用工具介绍
    看了一下,bin目录下的jdk工具有四五十个的样子,全部掌握一方面是因为成本太高二则是因为没有太大必要(2/8原则仍然使用),现对常用的一些工具进行学习,其他工具待日后有需要时再去学习。如下是本人根据解释列举的一些自认为比较重要的工具... ...

javac.exe Java编译器,将Java源代码转换成字节码
Java.exe Java解释器,直接从类文件执行Java应用程序字节代码
Javadoc.exe 根据Java源码及说明语句生成HTML文档
Jdb.exe Java调试器,可以逐行执行程序,设置断点和检查变量
Javah.exe 产生可以调用Java过程的C过程,或建立能被Java程序调用的C过程的头文件
Javap.exe Java反汇编器,显示编译类文件中的可访问功能和数据,显示字节代码含
Jar.exe 将Java类文件和其他资源文件捆绑成一个一的jar文件 
native2ascii 用于转换字符或者文件的编码格式
servertools 为程序员提供了一个命令行接口,用于注册取消注册,启动,关闭一个服务 
JConsole 是一个基于JMX的GUI工具,用于连接正在运行的JVM,主要用于监控
jps jps查找当前用户的Java进程,注意:不是当前系统中的所有进程
jstack jstack打印所有的Java线程的堆栈跟踪信息
jstat 显示一个测量(instrumented)Java HotSpot虚拟机的性能统计信息
jstatd 是一个Java远程方法调用 (RMI)服务器应用程序-它监控测量Java HotSpot虚拟机的创建和终止并且提供一个接口来允许远程监控工具依附到运行于本地主机的JVM
jmap 打印出某个java进程(使用pid)内存,打印出某个java进程(使用pid)内存


3、JConsole学习
    从Java 5开始 引入了 JConsole。JConsole 是一个内置 Java 性能分析器,可以从命令行或在 GUI shell 中运行。您可以轻松地使用 JConsole(或者,它更高端的 “近亲” VisualVM )来监控 Java 应用程序性能和跟踪 Java 中的代码。
A、 启动JConsole
A.1:如果是从命令行启动,使 JDK 在 PATH 上,运行 jconsole 即可。
A.2:如果从 GUI shell 启动,找到 JDK 安装路径,打开 bin 文件夹,双击 jconsole

B、 如何设置JAVA程序运行时可以被JConsolse连接分析
B.1:本地程序(相对于开启JConsole的计算机),无需设置任何参数就可以被本地开启的JConsole连接(Java SE 6开始无需设置,之前还是需要设置运行时参数 -Dcom.sun.management.jmxremote )
B.2: 2.无认证连接 (下面的设置表示:连接的端口为1234、无需认证就可以被连接)

[java] view plaincopyprint?
01.-Dcom.sun.management.jmxremote.port=1234 
02.-Dcom.sun.management.jmxremote.authenticate=false  
03.-Dcom.sun.management.jmxremote.ssl=false 
-Dcom.sun.management.jmxremote.port=1234
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
B.3:如果考虑到安全因素,需要认证,需要安全连接,也是可以搞定的。参考:
  http://download.oracle.com/javase/6/docs/technotes/guides/management/agent.html#gdenv

C、 JConsole如何连接远程机器的JAVA程序
C.1: 被远程连接的主机可以采取如下做法
.命令行:
带上B.2中的参数运行Java程序
.Eclipse中:
 
C.2: 访问远程连接时
.命令行:
jconsole.exe 192.168.0.181:1234
.使用JConsole图形界面进行访问
恭喜你,此时就进入了JConsole的分析界面!
   关于页面信息都很直观没什么好说的,值得一提的是对着图点击右键可以保存数据到CSV文件,以后可以使用其他工具来分析这些数据。

D、 JConsole使用实例
   就有限的工作经验来说的话,JConsole比较多的用来分析应用服务器的性能,如Tomcat/Apusic/JBoss等。
监控服务器的配置方法:
编辑run.bat(win下)或者run.sh(Linux下),找到如下内容
set JAVA_OPTS=%JAVA_OPTS%,在其后加上B.2中所列的参数即可。
  推荐使用升级版 JConsole 即 jvisualvm

4、 Jstat使用
jstat工具特别强大,有众多的可选项,详细查看堆内各个部分的使用量,以及加载类的数量。使用时,需加上查看进程的进程id,和所选参数。以下详细介绍各个参数的意义。 
    jstat -class pid:显示加载class的数量,及所占空间等信息。 
    jstat -compiler pid:显示VM实时编译的数量等信息。 
    jstat -gc pid:可以显示gc的信息,查看gc的次数,及时间。其中最后五项,分别是young gc的次数,young gc的时间,full gc的次数,full gc的时间,gc的总时间。 
    jstat -gccapacity:可以显示,VM内存中三代(young,old,perm)对象的使用和占用大小,如:PGCMN显示的是最小perm的内存使用量,PGCMX显示的是perm的内存最大使用量,PGC是当前新生成的perm内存占用量,PC是但前perm内存占用量。其他的可以根据这个类推, OC是old内纯的占用量。 
    jstat -gcnew pid:new对象的信息。 
    jstat -gcnewcapacity pid:new对象的信息及其占用量。 
    jstat -gcold pid:old对象的信息。 
    jstat -gcoldcapacity pid:old对象的信息及其占用量。 
    jstat -gcpermcapacity pid: perm对象的信息及其占用量。 
    jstat -util pid:统计gc信息统计。 
    jstat -printcompilation pid:当前VM执行的信息。 
    除了以上一个参数外,还可以同时加上 两个数字,如:jstat -printcompilation 3024 250 6是每250毫秒打印一次,一共打印6次,还可以加上-h3每三行显示一下标题。 

5、 jmap使用
jmap 是一个可以输出所有内存中对象的工具,甚至可以将VM 中的heap,以二进制输出成文本。使用方法 jmap -histo pid。如果连用 SHELL jmap -histo pid>a.log可以将其保存到文本中去(windows下也可以使用),在一段时间后,使用文本对比工具,可以对比出GC回收了哪些对象。jmap -dump:format=b,file=f1 3024可以将3024进程的内存heap输出出来到f1文件里。

6、 jps的使用
jps [-q] [-mlvV] [<hostid>]
参数解释:

-p 只显示pid,不显示class名称,jar文件名和传递给main 方法的参数
-m 输出传递给main 方法的参数,在嵌入式jvm上可能是null
-l 输出应用程序main class的完整package名或者应用程序的jar文件完整路径名
-v 输出传递给JVM的参数
hostid的定义为:   ip:port 

7、 关于对java性能的分析而言,JPofiler是个不错的选择。
它把CPU、执行绪和内存的剖析组合在一个强大的应用中。JProfiler可提供许多IDE整合和应用服务器整合用途。
   JProfiler直觉式的GUI让你可以找到效能瓶颈、抓出内存漏失(memory leaks)、并解决执行绪的问题。它让你得以对heap walker作资源回收器的root analysis,可以轻易找出内存漏失;heap快照(snapshot)模式让未被参照(reference)的对象、稍微被参照的对象、或在终结(finalization)队列的对象都会被移除;整合精灵以便剖析浏览器的Java外挂功能。
如下是一个关于JProfiler使用入门的比较好的参考资料:

 

分享到:
评论
1 楼 rudaoxia 2016-01-27  
写的很详细,很好,还有很多的拓展,谢谢博主,收下了

相关推荐

    Linux中的jdk8以及安装教程.zip

    3.解压命令:tar-zxvf jdk-版本编号-linux-x64.tar.gz 4.在Linux中配置环境变量: 先 sudo vi /etc/profile 进入了vi编辑模式 然后按下i键 光标移到最后一行 输入下列内容: export JAVA_HOME=/usr/java/jdk/jdk...

    linux 32位的jdk8,版本:jdk-8u221-linux-i586.rpm

    使用ftp工具将jdk-8u191-linux-i586.rpm传至linux系统,移动到/usr/local下,chmod 755 jdk-8u191-linux-i586.rpm 赋权,使用rpm -ivh jdk-8u191-linux-i586.rpm安装配置环境变量,vi /etc/profile,在末尾(就是最...

    Mac开发环境搭建之 apache-maven-3.5.3 MacOS版 免安装直接使用

    下载 Maven, 并解压到某个目录...如果遇到以下异常,重新编辑bash_profile文件,增加export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_11.jdk/Contents/Home后,并重新运行$ source ~/.bash_profile即可。

    local_policyAndUs_export_policy.zip

    AES256加密工具类,及其所必须的jar包,替换jdk里的两个jar,解决无法使用AES192、256位加密解密的问题 替换提醒: jdk7 需要更换 C:\Program Files\Java\jdk1.7.0_79\jre\lib\security 目录下的 local_policy....

    JDK开发工具命令集合

    JDK开发工具

    Jenkinsfile调用jdk命令工具配置

    Jenkinsfile调用jdk命令工具配置

    jdk命令行工具.doc

    jvm命令行工具,java性能优化,jdk命令工具, jcmd命令、jps命令、jmap命令、jstack命令、jinfo命令、jstat命令

    struts2.0 第五章 第1,2节

    其中JAVA_HOME代表JDK(不是JRE,不是J2EE)的安装路径;J2EE_HOME指J2EE SDK安装路径——在系统中增加JAVA_HOME和J2EE_HOME两个环境变量。 2.保证在d:盘根路径下安装Apache的Tomcat 5.5.20,不要使用安装文件安装...

    jdk 一键配置环境工具

    首先在Oracle的网站上下载对应的JDK版本,然后安装。注意在Windows下,为了避免在使用命令行的时候出现问题,一般不要选择安装在C:\Program Files\jdk目录下,可以选择文件夹名没有空格的目录来安装,比如我一般安装...

    struts 2.0 源码 第三章

    其中JAVA_HOME代表JDK(不是JRE,不是J2EE)的安装路径;J2EE_HOME指J2EE SDK安装路径——在系统中增加JAVA_HOME和J2EE_HOME两个环境变量。 2.保证在d:盘根路径下安装Apache的Tomcat 5.5.20,不要使用安装文件安装...

    dbvis_windows-x64_9_1_5

    DbVisualizer是一个完全基于JDBC的跨平台数据库管理工具,内置SQL语句编辑器(支持语法高亮),凡是具有JDBC数据库接口的数据库都可以管理,已经在Oracle, Sybase, DB2, MySQL, InstantDB, Cloudcape, HyperSonic ,...

    Jenkinsfile调用jdk命令和maven或grandle编译命令工具配置

    Jenkinsfile调用jdk命令和maven或grandle编译命令工具配置

    HSDIS工具(.class->汇编)

    已经编译好的Windows上的HSDIS库,放在JDK_HOME/jre/bin/client和JDK_HOME/jre/binserver文件夹下就可以使用,具体使用命令可查看博客https://blog.csdn.net/qq_32483145/article/details/80229140

    zysong.ttf字体-解决linux下oracle图形安装或配置界面乱码

    在Linux下安装oracle11g数据库,图形界面安装时中文显示乱码,后续通过工具配置监听也显示乱码,下载此字体安装至字体目录即可, 在oracle安装包解压缩目录,找到database/stage/Components/oracle.jdk/1.5.0.17.0/1/...

    jdk常用命令

    NULL 博文链接:https://jose-bing.iteye.com/blog/1271185

    jdk8免费下载 jdk1.8 64位免费下载

    官网下载下来的 新手现在想从官网...需要注意的是,JDK8与JDK1.8实际上是同一个东西,这是由于自从JDK1.5/JDK5命名方式改变后遗留的新旧命令方式问题。尽管现在已经有更高版本的JDK,但JDK8仍然是主流版本被广泛使用。

    jdk8 32位及64位安装包,2个独立安装包,不是一个。安装完系统内显示文件版本8.0.730.2

    jdk_8u73_windows_i586_8.0.730.2和jdk-8u73-windows-x64两个不同系统版本的安装包 jdk8 是一款非常好用的java开发类工具,这款软件中集成了超多全新的特性,且软件中还有着丰富的模板功能。软件中的各种功能也十分...

    jdk证书安装工具

    有时候会因为不信任而导致请求失败,这个时候又不想让jdk信任所有请求,那就只能给jdk安装目标地址的证书让jdk信任目标地址,但是正常的通过命令提示符安装证书非常麻烦,所以就做了这个工具,只要选择jdk目录和要安装的...

    jdk_1.7.0_03_32位

    jdk_1.7.0_03_32位.zip包,适合于Powerdesigner工具与数据库连接使用,记住如果cmd命令还是原64位 java version的话,请调整环境变量中Path %JAVA_HOME%的顺序排在第一位。

    jdk-8u251-linux-x64.rpm 官方原版

    "rpm命令"是RPM软件包的管理工具。rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎。逐渐受到其他发行版的采用。RPM套件管理方式的出现,让Linux易于...

Global site tag (gtag.js) - Google Analytics